├── metadata
├── en-US
│ ├── title.txt
│ ├── changelogs
│ │ ├── 1.txt
│ │ ├── 4.txt
│ │ ├── 42.txt
│ │ ├── 3.txt
│ │ ├── 33.txt
│ │ ├── 35.txt
│ │ ├── 40.txt
│ │ ├── 12.txt
│ │ ├── 21.txt
│ │ ├── 36.txt
│ │ ├── 13.txt
│ │ ├── 5.txt
│ │ ├── 2.txt
│ │ ├── 26.txt
│ │ ├── 27.txt
│ │ ├── 16.txt
│ │ ├── 32.txt
│ │ ├── 34.txt
│ │ ├── 38.txt
│ │ ├── 39.txt
│ │ ├── 8.txt
│ │ ├── 14.txt
│ │ ├── 15.txt
│ │ ├── 19.txt
│ │ ├── 22.txt
│ │ ├── 23.txt
│ │ ├── 24.txt
│ │ ├── 25.txt
│ │ ├── 29.txt
│ │ ├── 30.txt
│ │ ├── 31.txt
│ │ ├── 43.txt
│ │ ├── 7.txt
│ │ ├── 11.txt
│ │ ├── 20.txt
│ │ ├── 28.txt
│ │ ├── 37.txt
│ │ ├── 41.txt
│ │ ├── 10.txt
│ │ ├── 17.txt
│ │ ├── 6.txt
│ │ ├── 18.txt
│ │ └── 9.txt
│ ├── short_description.txt
│ ├── images
│ │ ├── icon.png
│ │ ├── featureGraphic.png
│ │ └── phoneScreenshots
│ │ │ ├── 1.png
│ │ │ ├── 2.png
│ │ │ └── 3.png
│ └── full_description.txt
├── ja-JP
│ ├── title.txt
│ ├── short_description.txt
│ └── full_description.txt
├── ru-RU
│ ├── title.txt
│ ├── short_description.txt
│ └── full_description.txt
├── tr-TR
│ ├── title.txt
│ ├── short_description.txt
│ └── full_description.txt
├── zh-CN
│ ├── title.txt
│ ├── short_description.txt
│ └── full_description.txt
├── zh-HK
│ ├── title.txt
│ ├── short_description.txt
│ └── full_description.txt
└── zh-TW
│ ├── title.txt
│ ├── short_description.txt
│ └── full_description.txt
├── Icon.png
├── fdroid
└── fdroid-repo.gif
├── internal
├── fonts
│ ├── FiraCode-OFL.txt.xz
│ ├── NotoSans-OFL.txt.xz
│ ├── FiraCode-Bold.ttf.xz
│ ├── NotoSans-Bold.ttf.xz
│ ├── Sevillana-OFL.txt.xz
│ ├── FiraCode-Regular.ttf.xz
│ ├── Inconsolata-Bold.ttf.xz
│ ├── Inconsolata-OFL.txt.xz
│ ├── NotoSans-Regular.ttf.xz
│ ├── NotoSansCJK-Bold.ttf.xz
│ ├── NotoSansCJK-OFL.txt.xz
│ ├── Sevillana-Regular.ttf.xz
│ ├── Inconsolata-Regular.ttf.xz
│ └── NotoSansCJK-Regular.ttf.xz
├── translations
│ ├── translations.go
│ ├── locales
│ │ ├── tr-TR
│ │ │ ├── messages.gotext.json
│ │ │ └── out.gotext.json
│ │ ├── zh-CN
│ │ │ ├── out.gotext.json
│ │ │ └── messages.gotext.json
│ │ ├── zh-HK
│ │ │ ├── out.gotext.json
│ │ │ └── messages.gotext.json
│ │ ├── zh-TW
│ │ │ ├── out.gotext.json
│ │ │ └── messages.gotext.json
│ │ ├── ja-JP
│ │ │ ├── out.gotext.json
│ │ │ └── messages.gotext.json
│ │ ├── ru-RU
│ │ │ ├── out.gotext.json
│ │ │ └── messages.gotext.json
│ │ └── en-US
│ │ │ └── out.gotext.json
│ └── catalog.go
└── croctheme
│ ├── blackTheme.go
│ └── greyTheme.go
├── FyneApp.toml
├── Makefile
├── i18n.go
├── README.md
├── LICENSE
├── fdroid-build.sh
├── AndroidManifest.xml
├── theme.go
├── about.go
├── go.mod
├── main.go
├── settings.go
├── recv.go
├── send.go
└── go.sum
/metadata/en-US/title.txt:
--------------------------------------------------------------------------------
1 | croc
2 |
--------------------------------------------------------------------------------
/metadata/ja-JP/title.txt:
--------------------------------------------------------------------------------
1 | croc
2 |
--------------------------------------------------------------------------------
/metadata/ru-RU/title.txt:
--------------------------------------------------------------------------------
1 | croc
2 |
--------------------------------------------------------------------------------
/metadata/tr-TR/title.txt:
--------------------------------------------------------------------------------
1 | croc
2 |
--------------------------------------------------------------------------------
/metadata/zh-CN/title.txt:
--------------------------------------------------------------------------------
1 | croc
2 |
--------------------------------------------------------------------------------
/metadata/zh-HK/title.txt:
--------------------------------------------------------------------------------
1 | croc
2 |
--------------------------------------------------------------------------------
/metadata/zh-TW/title.txt:
--------------------------------------------------------------------------------
1 | croc
2 |
--------------------------------------------------------------------------------
/metadata/en-US/changelogs/1.txt:
--------------------------------------------------------------------------------
1 | - Initial release
2 |
--------------------------------------------------------------------------------
/metadata/en-US/changelogs/4.txt:
--------------------------------------------------------------------------------
1 | - Add settings
2 |
--------------------------------------------------------------------------------
/metadata/en-US/changelogs/42.txt:
--------------------------------------------------------------------------------
1 | fix receive hang
2 |
--------------------------------------------------------------------------------
/metadata/en-US/changelogs/3.txt:
--------------------------------------------------------------------------------
1 | - Fix F-Droid build
2 |
--------------------------------------------------------------------------------
/metadata/en-US/changelogs/33.txt:
--------------------------------------------------------------------------------
1 | update to croc 9.6.6
2 |
--------------------------------------------------------------------------------
/metadata/en-US/changelogs/35.txt:
--------------------------------------------------------------------------------
1 | update to croc 10.0.3
2 |
--------------------------------------------------------------------------------
/metadata/en-US/changelogs/40.txt:
--------------------------------------------------------------------------------
1 | update to fyne 2.6.1
2 |
--------------------------------------------------------------------------------
/metadata/zh-HK/short_description.txt:
--------------------------------------------------------------------------------
1 | 輕鬆安全地將內容從一部電腦發送到另一部電腦
--------------------------------------------------------------------------------
/metadata/zh-TW/short_description.txt:
--------------------------------------------------------------------------------
1 | 輕鬆安全地將內容從一台電腦發送到另一台電腦
--------------------------------------------------------------------------------
/metadata/en-US/changelogs/12.txt:
--------------------------------------------------------------------------------
1 | - Save dialog has filename
2 |
--------------------------------------------------------------------------------
/metadata/en-US/changelogs/21.txt:
--------------------------------------------------------------------------------
1 | - Update to fyne 2.1.2
2 |
--------------------------------------------------------------------------------
/metadata/en-US/changelogs/36.txt:
--------------------------------------------------------------------------------
1 | update to croc 10.0.10
2 |
--------------------------------------------------------------------------------
/metadata/zh-CN/short_description.txt:
--------------------------------------------------------------------------------
1 | 轻松安全地将内容从一台计算机发送到另一台计算机
--------------------------------------------------------------------------------
/Icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/howeyc/crocgui/HEAD/Icon.png
--------------------------------------------------------------------------------
/metadata/en-US/changelogs/13.txt:
--------------------------------------------------------------------------------
1 | - Fix receive filename dialog
2 |
--------------------------------------------------------------------------------
/metadata/en-US/changelogs/5.txt:
--------------------------------------------------------------------------------
1 | - Ability to send multiple files
2 |
--------------------------------------------------------------------------------
/metadata/en-US/changelogs/2.txt:
--------------------------------------------------------------------------------
1 | - Add metadata for F-Droid listing
2 |
--------------------------------------------------------------------------------
/metadata/en-US/changelogs/26.txt:
--------------------------------------------------------------------------------
1 | Turkish translation provided by user
2 |
--------------------------------------------------------------------------------
/metadata/en-US/changelogs/27.txt:
--------------------------------------------------------------------------------
1 | Japanese translation provided by user
2 |
--------------------------------------------------------------------------------
/metadata/ja-JP/short_description.txt:
--------------------------------------------------------------------------------
1 | コンピュータ間で簡単かつ安全にファイルを送受信することができます。
2 |
--------------------------------------------------------------------------------
/metadata/en-US/changelogs/16.txt:
--------------------------------------------------------------------------------
1 | - new icon
2 | - croc hash algorithm selection
3 |
--------------------------------------------------------------------------------
/metadata/en-US/changelogs/32.txt:
--------------------------------------------------------------------------------
1 | update to fyne 2.4.1
2 | update to croc 9.6.5
3 |
--------------------------------------------------------------------------------
/metadata/en-US/changelogs/34.txt:
--------------------------------------------------------------------------------
1 | update to fyne 2.4.5
2 | update to croc 9.6.15
3 |
--------------------------------------------------------------------------------
/metadata/en-US/changelogs/38.txt:
--------------------------------------------------------------------------------
1 | update to croc 10.1.3
2 | update to fyne 2.5.3
3 |
--------------------------------------------------------------------------------
/metadata/en-US/changelogs/39.txt:
--------------------------------------------------------------------------------
1 | update to croc 10.2.2
2 | update to fyne 2.5.5
3 |
--------------------------------------------------------------------------------
/metadata/en-US/changelogs/8.txt:
--------------------------------------------------------------------------------
1 | - Remove apk signature for fdroid to sign it
2 |
--------------------------------------------------------------------------------
/metadata/en-US/changelogs/14.txt:
--------------------------------------------------------------------------------
1 | - Update to croc cli v9
2 | - PAKE Curve setting
3 |
--------------------------------------------------------------------------------
/metadata/en-US/changelogs/15.txt:
--------------------------------------------------------------------------------
1 | - Update to croc cli v9
2 | - PAKE Curve setting
3 |
--------------------------------------------------------------------------------
/metadata/en-US/changelogs/19.txt:
--------------------------------------------------------------------------------
1 | - Update to croc 9.4.2
2 | - Update to fyne 2.1.0
3 |
--------------------------------------------------------------------------------
/metadata/en-US/changelogs/22.txt:
--------------------------------------------------------------------------------
1 | - Update to croc 9.5.2
2 | - Update to fyne 2.1.3
3 |
--------------------------------------------------------------------------------
/metadata/en-US/changelogs/23.txt:
--------------------------------------------------------------------------------
1 | - Update to croc 9.5.3
2 | - Update to fyne 2.1.4
3 |
--------------------------------------------------------------------------------
/metadata/en-US/changelogs/24.txt:
--------------------------------------------------------------------------------
1 | - Update to croc 9.6.0
2 | - Update to fyne 2.2.2
3 |
--------------------------------------------------------------------------------
/metadata/en-US/changelogs/25.txt:
--------------------------------------------------------------------------------
1 | - Update to croc 9.6.2
2 | - Update to fyne 2.2.4
3 |
--------------------------------------------------------------------------------
/metadata/en-US/changelogs/29.txt:
--------------------------------------------------------------------------------
1 | - Added bold font for JP
2 | - Update to fyne 2.3.1
3 |
--------------------------------------------------------------------------------
/metadata/en-US/changelogs/30.txt:
--------------------------------------------------------------------------------
1 | - Update to croc 9.6.4
2 | - Update to fyne 2.3.2
3 |
--------------------------------------------------------------------------------
/metadata/en-US/changelogs/31.txt:
--------------------------------------------------------------------------------
1 | - Add zh-HK translation
2 | - Update to fyne 2.3.4
3 |
--------------------------------------------------------------------------------
/metadata/en-US/changelogs/43.txt:
--------------------------------------------------------------------------------
1 | update to croc v10.3.1
2 | update to fyne v2.7.1
3 |
--------------------------------------------------------------------------------
/metadata/en-US/changelogs/7.txt:
--------------------------------------------------------------------------------
1 | - Ask user to save files to ensure get writable file path
2 |
--------------------------------------------------------------------------------
/fdroid/fdroid-repo.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/howeyc/crocgui/HEAD/fdroid/fdroid-repo.gif
--------------------------------------------------------------------------------
/metadata/en-US/changelogs/11.txt:
--------------------------------------------------------------------------------
1 | - Add cancel send button
2 | - User can change/set send code
3 |
--------------------------------------------------------------------------------
/metadata/en-US/changelogs/20.txt:
--------------------------------------------------------------------------------
1 | - Update to croc 9.5.0
2 | - Upload speed throttle setting
3 |
--------------------------------------------------------------------------------
/metadata/ru-RU/short_description.txt:
--------------------------------------------------------------------------------
1 | Простая и безопасная передача данных между компьютерами
2 |
--------------------------------------------------------------------------------
/metadata/en-US/changelogs/28.txt:
--------------------------------------------------------------------------------
1 | - Add Font selection
2 | - Refresh app view on settings change
3 |
--------------------------------------------------------------------------------
/metadata/en-US/short_description.txt:
--------------------------------------------------------------------------------
1 | Easily and securely send things from one computer to another
2 |
--------------------------------------------------------------------------------
/metadata/en-US/changelogs/37.txt:
--------------------------------------------------------------------------------
1 | setting to hide logo
2 | update to croc 10.0.12
3 | update to fyne 2.5.1
4 |
--------------------------------------------------------------------------------
/metadata/en-US/changelogs/41.txt:
--------------------------------------------------------------------------------
1 | update to croc 10.2.4
2 | update to fyne 2.6.3
3 | add ru-RU translation
4 |
--------------------------------------------------------------------------------
/metadata/en-US/images/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/howeyc/crocgui/HEAD/metadata/en-US/images/icon.png
--------------------------------------------------------------------------------
/internal/fonts/FiraCode-OFL.txt.xz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/howeyc/crocgui/HEAD/internal/fonts/FiraCode-OFL.txt.xz
--------------------------------------------------------------------------------
/internal/fonts/NotoSans-OFL.txt.xz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/howeyc/crocgui/HEAD/internal/fonts/NotoSans-OFL.txt.xz
--------------------------------------------------------------------------------
/metadata/tr-TR/short_description.txt:
--------------------------------------------------------------------------------
1 | Bir bilgisayardan diğerine kolay ve güvenli bir şekilde bir şeyler gönderin
2 |
--------------------------------------------------------------------------------
/internal/fonts/FiraCode-Bold.ttf.xz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/howeyc/crocgui/HEAD/internal/fonts/FiraCode-Bold.ttf.xz
--------------------------------------------------------------------------------
/internal/fonts/NotoSans-Bold.ttf.xz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/howeyc/crocgui/HEAD/internal/fonts/NotoSans-Bold.ttf.xz
--------------------------------------------------------------------------------
/internal/fonts/Sevillana-OFL.txt.xz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/howeyc/crocgui/HEAD/internal/fonts/Sevillana-OFL.txt.xz
--------------------------------------------------------------------------------
/internal/fonts/FiraCode-Regular.ttf.xz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/howeyc/crocgui/HEAD/internal/fonts/FiraCode-Regular.ttf.xz
--------------------------------------------------------------------------------
/internal/fonts/Inconsolata-Bold.ttf.xz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/howeyc/crocgui/HEAD/internal/fonts/Inconsolata-Bold.ttf.xz
--------------------------------------------------------------------------------
/internal/fonts/Inconsolata-OFL.txt.xz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/howeyc/crocgui/HEAD/internal/fonts/Inconsolata-OFL.txt.xz
--------------------------------------------------------------------------------
/internal/fonts/NotoSans-Regular.ttf.xz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/howeyc/crocgui/HEAD/internal/fonts/NotoSans-Regular.ttf.xz
--------------------------------------------------------------------------------
/internal/fonts/NotoSansCJK-Bold.ttf.xz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/howeyc/crocgui/HEAD/internal/fonts/NotoSansCJK-Bold.ttf.xz
--------------------------------------------------------------------------------
/internal/fonts/NotoSansCJK-OFL.txt.xz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/howeyc/crocgui/HEAD/internal/fonts/NotoSansCJK-OFL.txt.xz
--------------------------------------------------------------------------------
/internal/fonts/Sevillana-Regular.ttf.xz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/howeyc/crocgui/HEAD/internal/fonts/Sevillana-Regular.ttf.xz
--------------------------------------------------------------------------------
/metadata/en-US/changelogs/10.txt:
--------------------------------------------------------------------------------
1 | - Settings are scrollable
2 | - Add debug logging
3 | - Update croc from v8.6.7 to v8.6.12
4 |
--------------------------------------------------------------------------------
/internal/fonts/Inconsolata-Regular.ttf.xz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/howeyc/crocgui/HEAD/internal/fonts/Inconsolata-Regular.ttf.xz
--------------------------------------------------------------------------------
/internal/fonts/NotoSansCJK-Regular.ttf.xz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/howeyc/crocgui/HEAD/internal/fonts/NotoSansCJK-Regular.ttf.xz
--------------------------------------------------------------------------------
/metadata/en-US/images/featureGraphic.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/howeyc/crocgui/HEAD/metadata/en-US/images/featureGraphic.png
--------------------------------------------------------------------------------
/metadata/en-US/images/phoneScreenshots/1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/howeyc/crocgui/HEAD/metadata/en-US/images/phoneScreenshots/1.png
--------------------------------------------------------------------------------
/metadata/en-US/images/phoneScreenshots/2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/howeyc/crocgui/HEAD/metadata/en-US/images/phoneScreenshots/2.png
--------------------------------------------------------------------------------
/metadata/en-US/images/phoneScreenshots/3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/howeyc/crocgui/HEAD/metadata/en-US/images/phoneScreenshots/3.png
--------------------------------------------------------------------------------
/metadata/en-US/changelogs/17.txt:
--------------------------------------------------------------------------------
1 | - fix backspace on android AOSP-based keyboards
2 | - system theme, follows dark/light of android settings
3 |
--------------------------------------------------------------------------------
/metadata/en-US/changelogs/6.txt:
--------------------------------------------------------------------------------
1 | - User request of permissions no longer necessary to send files, uses android URI and temp files instead
2 |
--------------------------------------------------------------------------------
/internal/translations/translations.go:
--------------------------------------------------------------------------------
1 | package translations
2 |
3 | //go:generate gotext -srclang=en-US update -out=catalog.go -lang=en-US,tr-TR,ja-JP,zh-CN,zh-HK,zh-TW crocgui
4 |
--------------------------------------------------------------------------------
/metadata/en-US/changelogs/18.txt:
--------------------------------------------------------------------------------
1 | - Send file list scrolling to allow for many files to be sent at once
2 | - Receive code can be entered with spaces in place of dashes
3 | - Update to croc 9.3.0
4 |
--------------------------------------------------------------------------------
/metadata/en-US/changelogs/9.txt:
--------------------------------------------------------------------------------
1 | - Allow user to change theme
2 | - Update to show filename for content:// URI on android
3 | - Save defaults on start so settings tab also shows defaults
4 | - Add license info
5 |
--------------------------------------------------------------------------------
/FyneApp.toml:
--------------------------------------------------------------------------------
1 | [Details]
2 | Icon = "metadata/en-US/images/icon.png"
3 | Name = "crocgui"
4 | ID = "com.github.howeyc.crocgui"
5 | Version = "10.3.1"
6 | Build = 43
7 |
8 | [Migrations]
9 | fyneDo = false
10 |
--------------------------------------------------------------------------------
/Makefile:
--------------------------------------------------------------------------------
1 | .PHONY: clean all
2 |
3 | all: crocgui.apk
4 |
5 | crocgui.apk: main.go send.go recv.go settings.go theme.go about.go AndroidManifest.xml fdroid-build.sh
6 | ANDROID_HOME=~/android bash fdroid-build.sh test
7 |
8 | clean:
9 | go clean
10 | rm crocgui.apk
11 |
--------------------------------------------------------------------------------
/i18n.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import "golang.org/x/text/message"
4 |
5 | var langCode string
6 | var langPrinter *message.Printer
7 |
8 | // lp uses langPrinter to output the string in selected language
9 | func lp(s string) string {
10 | return langPrinter.Sprintf(s)
11 | }
12 |
--------------------------------------------------------------------------------
/metadata/zh-HK/full_description.txt:
--------------------------------------------------------------------------------
1 | croc 是一種容許任意兩部電腦簡單安全地傳送文件的工具。
2 |
3 | 特點
4 | - 容許任意兩部電腦傳送數據(使用中繼)
5 | - 提供端對端加密(使用 PAKE)
6 | - 實現輕鬆的跨平台傳送(Windows、Linux、Mac)
7 | - 容許多個文件傳送
8 | - 本地伺服器或端口轉發不需要
9 | - ipv6優先 ipv4備用
10 |
11 | 可以在此處找到其所基於的命令行應用程式:
12 |
13 | https://github.com/schollz/croc
--------------------------------------------------------------------------------
/metadata/zh-TW/full_description.txt:
--------------------------------------------------------------------------------
1 | croc 是一種允許任意兩台電腦簡單安全地傳輸檔案的工具。
2 |
3 | 特點
4 | - 允許任意兩台電腦傳輸數據(使用中繼)
5 | - 提供端到端加密(使用 PAKE)
6 | - 實現輕鬆的跨平台傳輸(Windows、Linux、Mac)
7 | - 允許多個檔案傳輸
8 | - 本地伺服器或連接埠轉發不需要
9 | - ipv6優先 ipv4備用
10 |
11 | 可以在此處找到其所基於的命令行應用程序:
12 |
13 | https://github.com/schollz/croc
--------------------------------------------------------------------------------
/metadata/zh-CN/full_description.txt:
--------------------------------------------------------------------------------
1 | croc 是一种允许任意两台计算机简单安全地传输文件的工具。
2 |
3 | 特点
4 | - 允许任意两台计算器传输数据(使用中继)
5 | - 提供端到端加密(使用 PAKE)
6 | - 实现轻松的跨平台传输(Windows、Linux、Mac)
7 | - 允许多个文件传输
8 | - 本地服务器或端口转发不需要
9 | - ipv6优先 ipv4备用
10 |
11 | 可以在此处找到其所基于的命令行应用程序:
12 |
13 | https://github.com/schollz/croc
14 |
--------------------------------------------------------------------------------
/metadata/ja-JP/full_description.txt:
--------------------------------------------------------------------------------
1 | crocは、簡単かつ安全にファイルを送受信することができるツールです。
2 |
3 | 機能
4 | - 2台のコンピュータ間でデータ転送を行う(リレーを使用)
5 | - PAKEによってエンドツーエンド暗号化が行われます
6 | - 複数のプラットフォームでファイルの送受信ができます (Windows, Linux, Mac)
7 | - 複数ファイルの送受信ができます
8 | - ローカルサーバーやポート開放は不要です
9 | - IPv6の優先、IPv4フォールバック
10 |
11 | このアプリのベースとなったCLIソフトウェアは、こちらでご確認いただけます。
12 |
13 | https://github.com/schollz/croc
14 |
15 |
--------------------------------------------------------------------------------
/metadata/en-US/full_description.txt:
--------------------------------------------------------------------------------
1 | croc is a tool that allows any two computers to simply and securely transfer files.
2 |
3 | Features
4 | - allows any two computers to transfer data (using a relay)
5 | - provides end-to-end encryption (using PAKE)
6 | - enables easy cross-platform transfers (Windows, Linux, Mac)
7 | - allows multiple file transfers
8 | - local server or port-forwarding not needed
9 | - ipv6-first with ipv4 fallback
10 |
11 | The command line application upon which this is based can be found here:
12 |
13 | https://github.com/schollz/croc
14 |
15 |
--------------------------------------------------------------------------------
/metadata/tr-TR/full_description.txt:
--------------------------------------------------------------------------------
1 | croc, herhangi iki bilgisayarın dosyaları basit ve güvenli bir şekilde aktarmasını sağlayan bir araçtır.
2 |
3 | Özellik
4 | - izin verir herhangi iki bilgisayar veri aktarmak için bu (Relay kullanarak)
5 | - uçtan uca şifreleme sağlar (PAKE kullanarak)
6 | - kolay platformlar arası aktarımlara olanak tanır (Windows, Linux, Mac)
7 | - birden çok dosya aktarımına izin verir
8 | - yerel sunucu veya bağlantı noktası iletme gerekli değil
9 | - ipv6-ilk ipv4 geri dönüş ile
10 |
11 | Bu komut satırı uygulaması aşşağıdaki kaynakta bulunabilir:
12 |
13 | https://github.com/schollz/croc
14 |
15 |
--------------------------------------------------------------------------------
/metadata/ru-RU/full_description.txt:
--------------------------------------------------------------------------------
1 | croc — это инструмент для простой и безопасной передачи файлов между любыми двумя компьютерами.
2 |
3 | Основные возможности
4 | Поддержка передачи данных между любыми двумя компьютерами (через ретранслятор)
5 | Сквозное шифрование (на базе протокола PAKE)
6 | Кросс-платформенная работа (Windows, Linux, macOS)
7 | Передача нескольких файлов одновременно
8 | Не требует настройки локального сервера или проброса портов
9 | Приоритетная работа через IPv6 с автоматическим переходом на IPv4
10 |
11 | Командная версия приложения, на которой основан этот интерфейс, доступна здесь:
12 |
13 | https://github.com/schollz/croc
14 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Croc GUI
2 |
3 | A nice simple GUI for [croc](https://github.com/schollz/croc), designed for
4 | mobile use.
5 |
6 | [
](https://f-droid.org/en/packages/com.github.howeyc.crocgui/)
7 |
8 | Mobile Screenshot:
9 |
10 | [
](metadata/en-US/images/phoneScreenshots/1.png?raw=true)
11 | [
](metadata/en-US/images/phoneScreenshots/2.png?raw=true)
12 | [
](metadata/en-US/images/phoneScreenshots/3.png?raw=true)
13 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Copyright (c) 2021 Chris Howey
2 |
3 | Permission to use, copy, modify, and/or distribute this software for any
4 | purpose with or without fee is hereby granted, provided that the above
5 | copyright notice and this permission notice appear in all copies.
6 |
7 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
8 | WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
9 | MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
10 | ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
11 | WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
12 | ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
13 | OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
14 |
--------------------------------------------------------------------------------
/fdroid-build.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | curl -Lso go.tar.gz https://go.dev/dl/go1.25.1.linux-amd64.tar.gz
4 | echo "7716a0d940a0f6ae8e1f3b3f4f36299dc53e31b16840dbd171254312c41ca12e go.tar.gz" | sha256sum -c -
5 | mkdir -p gobuild/go{lang,path,cache}
6 | tar -C gobuild/golang -xzf go.tar.gz
7 | rm go.tar.gz
8 | export GOPATH="$PWD/gobuild/gopath"
9 | export GOCACHE="$PWD/gobuild/gocache"
10 | export GO_LANG="$PWD/gobuild/golang/go/bin"
11 | export GO_COMPILED="$GOPATH/bin"
12 | export PATH="$GO_LANG:$GO_COMPILED:$PATH"
13 | go version
14 | go install fyne.io/fyne/v2/cmd/fyne\@v2.7.1
15 | fyne version
16 | if [[ $# -eq 0 ]]; then
17 | fyne package -os android -release
18 | zip -d crocgui.apk "META-INF/*"
19 | else
20 | fyne package -os android
21 | fi
22 | chmod -R u+w gobuild
23 | rm -rf gobuild
24 |
--------------------------------------------------------------------------------
/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
10 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/internal/croctheme/blackTheme.go:
--------------------------------------------------------------------------------
1 | package croctheme
2 |
3 | import (
4 | "image/color"
5 |
6 | "fyne.io/fyne/v2"
7 | "fyne.io/fyne/v2/theme"
8 | )
9 |
10 | func BlackTheme() fyne.Theme {
11 | return &blackTheme{}
12 | }
13 |
14 | type blackTheme struct{}
15 |
16 | var _ fyne.Theme = (*blackTheme)(nil)
17 |
18 | func (b *blackTheme) Color(name fyne.ThemeColorName, variant fyne.ThemeVariant) color.Color {
19 | if name == theme.ColorNameBackground {
20 | return color.Black
21 | }
22 | if name == theme.ColorNameShadow {
23 | return color.White
24 | }
25 |
26 | return theme.DarkTheme().Color(name, theme.VariantDark)
27 | }
28 |
29 | func (b *blackTheme) Icon(name fyne.ThemeIconName) fyne.Resource {
30 | return theme.DarkTheme().Icon(name)
31 | }
32 |
33 | func (b *blackTheme) Font(style fyne.TextStyle) fyne.Resource {
34 | return theme.DarkTheme().Font(style)
35 | }
36 |
37 | func (b *blackTheme) Size(name fyne.ThemeSizeName) float32 {
38 | return theme.DarkTheme().Size(name)
39 | }
40 |
--------------------------------------------------------------------------------
/theme.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "crocgui/internal/croctheme"
5 | "fmt"
6 | "image/color"
7 | "io"
8 |
9 | "fyne.io/fyne/v2"
10 | "fyne.io/fyne/v2/theme"
11 | "github.com/ulikunitz/xz"
12 | )
13 |
14 | type crocTheme struct {
15 | color fyne.Theme
16 | icon fyne.Theme
17 |
18 | fontName string
19 |
20 | size fyne.Theme
21 | }
22 |
23 | var _ fyne.Theme = (*crocTheme)(nil)
24 |
25 | var appTheme = crocTheme{}
26 |
27 | func (c crocTheme) Color(name fyne.ThemeColorName, variant fyne.ThemeVariant) color.Color {
28 | return c.color.Color(name, variant)
29 | }
30 |
31 | func (c crocTheme) Icon(name fyne.ThemeIconName) fyne.Resource {
32 | return c.icon.Icon(name)
33 | }
34 |
35 | func (c crocTheme) Font(style fyne.TextStyle) fyne.Resource {
36 | ftype := "Regular"
37 | if style.Bold {
38 | ftype = "Bold"
39 | }
40 |
41 | if ttfxz, lerr := fsFonts.Open(fmt.Sprintf("internal/fonts/%s-%s.ttf.xz", c.fontName, ftype)); lerr == nil {
42 | xr, _ := xz.NewReader(ttfxz)
43 | ttf, _ := io.ReadAll(xr)
44 | return fyne.NewStaticResource(fmt.Sprintf("%s-%s.ttf", c.fontName, ftype), ttf)
45 | }
46 |
47 | return theme.DefaultTheme().Font(style)
48 | }
49 |
50 | func (c crocTheme) Size(name fyne.ThemeSizeName) float32 {
51 | return c.size.Size(name)
52 | }
53 |
54 | func setThemeColor(themeName string) {
55 | switch themeName {
56 | case "light":
57 | appTheme.color = theme.LightTheme()
58 | case "grey":
59 | appTheme.color = croctheme.GreyTheme()
60 | case "dark":
61 | appTheme.color = theme.DarkTheme()
62 | case "black":
63 | appTheme.color = croctheme.BlackTheme()
64 | case "system":
65 | appTheme.color = theme.DefaultTheme()
66 | }
67 | }
68 |
--------------------------------------------------------------------------------
/internal/croctheme/greyTheme.go:
--------------------------------------------------------------------------------
1 | package croctheme
2 |
3 | import (
4 | "image/color"
5 |
6 | "fyne.io/fyne/v2"
7 | "fyne.io/fyne/v2/theme"
8 | )
9 |
10 | // GreyTheme emulates dark theme from fyne v2.2.4
11 | func GreyTheme() fyne.Theme {
12 | theme := &greyTheme{}
13 | return theme
14 | }
15 |
16 | var (
17 | darkPalette = map[fyne.ThemeColorName]color.Color{
18 | theme.ColorNameBackground: color.NRGBA{R: 0x30, G: 0x30, B: 0x30, A: 0xff},
19 | theme.ColorNameDisabled: color.NRGBA{R: 0x55, G: 0x55, B: 0x55, A: 0xff},
20 | theme.ColorNameButton: color.NRGBA{R: 0x44, G: 0x44, B: 0x44, A: 0xff},
21 | theme.ColorNameDisabledButton: color.NRGBA{R: 0x26, G: 0x26, B: 0x26, A: 0xff},
22 | theme.ColorNameOverlayBackground: color.NRGBA{R: 0x30, G: 0x30, B: 0x30, A: 0xff},
23 | theme.ColorNameMenuBackground: color.NRGBA{R: 0x30, G: 0x30, B: 0x30, A: 0xff},
24 | theme.ColorNameForeground: color.NRGBA{R: 0xff, G: 0xff, B: 0xff, A: 0xff},
25 | theme.ColorNameHover: color.NRGBA{R: 0xff, G: 0xff, B: 0xff, A: 0x0f},
26 | theme.ColorNameInputBackground: color.NRGBA{R: 0xff, G: 0xff, B: 0xff, A: 0x19},
27 | theme.ColorNamePlaceHolder: color.NRGBA{R: 0xb2, G: 0xb2, B: 0xb2, A: 0xff},
28 | theme.ColorNamePressed: color.NRGBA{R: 0xff, G: 0xff, B: 0xff, A: 0x66},
29 | theme.ColorNameSeparator: color.NRGBA{R: 0x44, G: 0x44, B: 0x44, A: 0xff},
30 | theme.ColorNameScrollBar: color.NRGBA{A: 0x99},
31 | theme.ColorNameShadow: color.NRGBA{A: 0x66},
32 | }
33 | )
34 |
35 | type greyTheme struct {
36 | }
37 |
38 | var _ fyne.Theme = (*greyTheme)(nil)
39 |
40 | func (t *greyTheme) Color(n fyne.ThemeColorName, v fyne.ThemeVariant) color.Color {
41 | v = theme.VariantDark
42 | colors := darkPalette
43 |
44 | if c, ok := colors[n]; ok {
45 | return c
46 | }
47 |
48 | return theme.DefaultTheme().Color(n, v)
49 | }
50 |
51 | func (t *greyTheme) Font(style fyne.TextStyle) fyne.Resource {
52 | return theme.DefaultTheme().Font(style)
53 | }
54 |
55 | func (t *greyTheme) Size(s fyne.ThemeSizeName) float32 {
56 | return theme.DefaultTheme().Size(s)
57 | }
58 |
59 | func (t *greyTheme) Icon(name fyne.ThemeIconName) fyne.Resource {
60 | return theme.DefaultTheme().Icon(name)
61 | }
62 |
--------------------------------------------------------------------------------
/about.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "bufio"
5 | "bytes"
6 | "embed"
7 | _ "embed"
8 | "fmt"
9 | "strings"
10 |
11 | "fyne.io/fyne/v2"
12 | "fyne.io/fyne/v2/container"
13 | "fyne.io/fyne/v2/theme"
14 | "fyne.io/fyne/v2/widget"
15 | )
16 |
17 | //go:embed metadata
18 | var metadata embed.FS
19 |
20 | //go:embed LICENSE
21 | var crocguiLicense string
22 |
23 | //go:embed third-party-licenses.txt
24 | var thirdPartyLicenses string
25 |
26 | func aboutTabItem() *container.TabItem {
27 | longdescbytes, _ := metadata.ReadFile(fmt.Sprintf("metadata/%s/full_description.txt", langCode))
28 | longdesc := string(longdescbytes)
29 | longdesc = strings.ReplaceAll(longdesc, "", "")
30 | longdesc = strings.ReplaceAll(longdesc, "", "")
31 | aboutInfo := widget.NewLabel(longdesc)
32 | aboutInfo.Wrapping = fyne.TextWrapWord
33 |
34 | acLicense := widget.NewAccordion()
35 |
36 | licenseReader := bytes.NewBufferString(crocguiLicense + thirdPartyLicenses)
37 | currentLicense := ""
38 | currentLibrary := "croc"
39 | scanner := bufio.NewScanner(licenseReader)
40 | for scanner.Scan() {
41 | line := scanner.Text()
42 | if strings.HasPrefix(line, "-----") {
43 | acLicense.Append(widget.NewAccordionItem(currentLibrary, widget.NewLabel(currentLicense)))
44 | currentLicense = ""
45 | scanner.Scan()
46 | scanner.Scan()
47 | currentLibrary = scanner.Text()
48 | scanner.Scan()
49 | continue
50 | }
51 | currentLicense += fmt.Sprintln(line)
52 | }
53 |
54 | // Add font licenses
55 | fontEntries, _ := fsFonts.ReadDir("internal/fonts")
56 | for _, fe := range fontEntries {
57 | if fbase, remain, split := strings.Cut(fe.Name(), "-"); split && remain == "OFL.txt" {
58 | bfontLicense, rerr := fsFonts.ReadFile(fmt.Sprintf("internal/fonts/%s", fe.Name()))
59 | if rerr == nil {
60 | strLicense := string(bfontLicense)
61 | acLicense.Append(widget.NewAccordionItem(fmt.Sprintf("Font: %s", fbase), widget.NewLabel(strLicense)))
62 | }
63 | }
64 | }
65 |
66 | licenseToggle := widget.NewButton(lp("License Info"), func() {
67 | w := fyne.CurrentApp().NewWindow(lp("License Info"))
68 | w.SetContent(container.NewScroll(acLicense))
69 | w.Resize(fyne.NewSize(450, 800))
70 | w.Show()
71 | })
72 | return container.NewTabItemWithIcon(lp("About"), theme.InfoIcon(),
73 | container.NewVScroll(container.NewVBox(aboutInfo, licenseToggle)),
74 | )
75 | }
76 |
--------------------------------------------------------------------------------
/go.mod:
--------------------------------------------------------------------------------
1 | module crocgui
2 |
3 | go 1.24.0
4 |
5 | toolchain go1.24.1
6 |
7 | require (
8 | fyne.io/fyne/v2 v2.7.1
9 | github.com/schollz/croc/v10 v10.3.1
10 | github.com/schollz/logger v1.2.0
11 | github.com/ulikunitz/xz v0.5.12
12 | golang.org/x/text v0.31.0
13 | )
14 |
15 | require (
16 | filippo.io/edwards25519 v1.1.0 // indirect
17 | fyne.io/systray v1.11.1-0.20250603113521-ca66a66d8b58 // indirect
18 | github.com/BurntSushi/toml v1.5.0 // indirect
19 | github.com/cespare/xxhash/v2 v2.3.0 // indirect
20 | github.com/davecgh/go-spew v1.1.1 // indirect
21 | github.com/denisbrodbeck/machineid v1.0.1 // indirect
22 | github.com/fredbi/uri v1.1.1 // indirect
23 | github.com/fsnotify/fsnotify v1.9.0 // indirect
24 | github.com/fyne-io/gl-js v0.2.0 // indirect
25 | github.com/fyne-io/glfw-js v0.3.0 // indirect
26 | github.com/fyne-io/image v0.1.1 // indirect
27 | github.com/fyne-io/oksvg v0.2.0 // indirect
28 | github.com/go-gl/gl v0.0.0-20231021071112-07e5d0ea2e71 // indirect
29 | github.com/go-gl/glfw/v3.3/glfw v0.0.0-20240506104042-037f3cc74f2a // indirect
30 | github.com/go-text/render v0.2.0 // indirect
31 | github.com/go-text/typesetting v0.2.1 // indirect
32 | github.com/godbus/dbus/v5 v5.1.0 // indirect
33 | github.com/hack-pad/go-indexeddb v0.3.2 // indirect
34 | github.com/hack-pad/safejs v0.1.0 // indirect
35 | github.com/jeandeaual/go-locale v0.0.0-20250612000132-0ef82f21eade // indirect
36 | github.com/jsummers/gobmp v0.0.0-20230614200233-a9de23ed2e25 // indirect
37 | github.com/kalafut/imohash v1.1.1 // indirect
38 | github.com/kr/text v0.2.0 // indirect
39 | github.com/magisterquis/connectproxy v0.0.0-20200725203833-3582e84f0c9b // indirect
40 | github.com/minio/highwayhash v1.0.3 // indirect
41 | github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db // indirect
42 | github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 // indirect
43 | github.com/nicksnyder/go-i18n/v2 v2.5.1 // indirect
44 | github.com/pmezard/go-difflib v1.0.0 // indirect
45 | github.com/rivo/uniseg v0.4.7 // indirect
46 | github.com/rymdport/portal v0.4.2 // indirect
47 | github.com/sabhiram/go-gitignore v0.0.0-20210923224102-525f6e181f06 // indirect
48 | github.com/schollz/pake/v3 v3.1.0 // indirect
49 | github.com/schollz/peerdiscovery v1.7.6 // indirect
50 | github.com/schollz/progressbar/v3 v3.18.0 // indirect
51 | github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e // indirect
52 | github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c // indirect
53 | github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef // indirect
54 | github.com/stretchr/testify v1.11.1 // indirect
55 | github.com/tscholl2/siec v0.0.0-20240310163802-c2c6f6198406 // indirect
56 | github.com/twmb/murmur3 v1.1.8 // indirect
57 | github.com/yuin/goldmark v1.7.8 // indirect
58 | golang.org/x/crypto v0.45.0 // indirect
59 | golang.org/x/image v0.24.0 // indirect
60 | golang.org/x/net v0.47.0 // indirect
61 | golang.org/x/sys v0.38.0 // indirect
62 | golang.org/x/term v0.37.0 // indirect
63 | golang.org/x/time v0.14.0 // indirect
64 | gopkg.in/yaml.v3 v3.0.1 // indirect
65 | )
66 |
--------------------------------------------------------------------------------
/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "bytes"
5 | _ "embed"
6 | "strings"
7 | "time"
8 |
9 | log "github.com/schollz/logger"
10 | "golang.org/x/text/language"
11 | "golang.org/x/text/message"
12 |
13 | _ "crocgui/internal/translations"
14 |
15 | "fyne.io/fyne/v2"
16 | "fyne.io/fyne/v2/app"
17 | "fyne.io/fyne/v2/canvas"
18 | "fyne.io/fyne/v2/container"
19 | "fyne.io/fyne/v2/data/binding"
20 | "fyne.io/fyne/v2/layout"
21 | "fyne.io/fyne/v2/theme"
22 | )
23 |
24 | //go:embed metadata/en-US/images/featureGraphic.png
25 | var textlogobytes []byte
26 |
27 | type logwriter struct {
28 | buf bytes.Buffer
29 | lastlines []string
30 | lastupdate time.Time
31 | }
32 |
33 | const LOG_LINES = 20
34 |
35 | func (lw *logwriter) Write(p []byte) (n int, err error) {
36 | n, err = lw.buf.Write(p)
37 |
38 | lw.lastlines = append([]string{string(p)}, lw.lastlines...)
39 | if len(lw.lastlines) > LOG_LINES {
40 | lw.lastlines = lw.lastlines[:LOG_LINES]
41 | }
42 |
43 | if time.Since(lw.lastupdate) > time.Second {
44 | logbinding.Set(strings.Join(lw.lastlines, ""))
45 | lw.lastupdate = time.Now()
46 | }
47 | return
48 | }
49 |
50 | var logoutput logwriter
51 | var logbinding binding.String
52 |
53 | func refreshWindow(a fyne.App, w fyne.Window, index int) {
54 | textlogores := fyne.NewStaticResource("text-logo", textlogobytes)
55 | textlogo := canvas.NewImageFromResource(textlogores)
56 | textlogo.SetMinSize(fyne.NewSize(205, 100))
57 | top := container.NewHBox(layout.NewSpacer(), textlogo, layout.NewSpacer())
58 |
59 | at := container.NewAppTabs(
60 | sendTabItem(a, w),
61 | recvTabItem(a, w),
62 | settingsTabItem(a, w),
63 | aboutTabItem(),
64 | )
65 | at.SelectIndex(index)
66 |
67 | if a.Preferences().Bool("hide-logo") {
68 | w.SetContent(at)
69 | } else {
70 | w.SetContent(container.NewBorder(top, nil, nil, nil, at))
71 | }
72 | setDebugObjects()
73 | }
74 |
75 | func main() {
76 | a := app.NewWithID("com.github.howeyc.crocgui")
77 | w := a.NewWindow("croc")
78 |
79 | logbinding = binding.NewString()
80 | log.SetOutput(&logoutput)
81 |
82 | // Defaults
83 | a.Preferences().SetString("lang", a.Preferences().StringWithFallback("lang", "en-US"))
84 | a.Preferences().SetString("relay-address", a.Preferences().StringWithFallback("relay-address", "croc.schollz.com:9009"))
85 | a.Preferences().SetString("relay-password", a.Preferences().StringWithFallback("relay-password", "pass123"))
86 | a.Preferences().SetString("relay-ports", a.Preferences().StringWithFallback("relay-ports", "9009,9010,9011,9012,9013"))
87 | a.Preferences().SetBool("disable-local", a.Preferences().BoolWithFallback("disable-local", false))
88 | a.Preferences().SetBool("force-local", a.Preferences().BoolWithFallback("force-local", false))
89 | a.Preferences().SetBool("disable-multiplexing", a.Preferences().BoolWithFallback("disable-multiplexing", false))
90 | a.Preferences().SetBool("disable-compression", a.Preferences().BoolWithFallback("disable-compression", false))
91 | a.Preferences().SetString("theme", a.Preferences().StringWithFallback("theme", "system"))
92 | a.Preferences().SetString("font", a.Preferences().StringWithFallback("font", "default"))
93 | a.Preferences().SetString("debug-level", a.Preferences().StringWithFallback("debug-level", "error"))
94 | a.Preferences().SetString("pake-curve", a.Preferences().StringWithFallback("pake-curve", "p256"))
95 | a.Preferences().SetString("croc-hash", a.Preferences().StringWithFallback("croc-hash", "xxhash"))
96 | a.Preferences().SetBool("hide-logo", a.Preferences().BoolWithFallback("hide-logo", false))
97 | a.Preferences().SetString("multicast-address", a.Preferences().StringWithFallback("multicast-address", "239.255.255.250"))
98 |
99 | appTheme.color = theme.DefaultTheme()
100 | appTheme.size = theme.DefaultTheme()
101 | appTheme.fontName = "default"
102 | appTheme.icon = theme.DefaultTheme()
103 |
104 | langCode = a.Preferences().String("lang")
105 | langPrinter = message.NewPrinter(language.MustParse(langCode))
106 |
107 | setThemeColor(a.Preferences().String("theme"))
108 | log.SetLevel(a.Preferences().String("debug-level"))
109 |
110 | appTheme.fontName = a.Preferences().String("font")
111 |
112 | a.Settings().SetTheme(appTheme)
113 |
114 | refreshWindow(a, w, 0)
115 | w.Resize(fyne.NewSize(800, 600))
116 |
117 | w.ShowAndRun()
118 | }
119 |
--------------------------------------------------------------------------------
/internal/translations/locales/tr-TR/messages.gotext.json:
--------------------------------------------------------------------------------
1 | {
2 | "language": "tr-TR",
3 | "messages": [
4 | {
5 | "id": "Debug log:",
6 | "message": "Debug log:",
7 | "translation": "Hata ayıklama günlüğü"
8 | },
9 | {
10 | "id": "Enter code to download",
11 | "message": "Enter code to download",
12 | "translation": "İndirmek için kodu girin"
13 | },
14 | {
15 | "id": "Receive",
16 | "message": "Receive",
17 | "translation": "Almak"
18 | },
19 | {
20 | "id": "Receive Code",
21 | "message": "Receive Code",
22 | "translation": "Kod al"
23 | },
24 | {
25 | "id": "Download",
26 | "message": "Download",
27 | "translation": "İndir"
28 | },
29 | {
30 | "id": "Receiving file",
31 | "message": "Receiving file",
32 | "translation": "Dosya alma"
33 | },
34 | {
35 | "id": "Received",
36 | "message": "Received",
37 | "translation": "Alınan"
38 | },
39 | {
40 | "id": "Pick a file to send",
41 | "message": "Pick a file to send",
42 | "translation": "Gönderilicek dosyayı seçin"
43 | },
44 | {
45 | "id": "Send",
46 | "message": "Send",
47 | "translation": "Gönder"
48 | },
49 | {
50 | "id": "Sending file",
51 | "message": "Sending file",
52 | "translation": "Dosya gönderiliyor"
53 | },
54 | {
55 | "id": "Sent file",
56 | "message": "Sent file",
57 | "translation": "Dosya gönderildi"
58 | },
59 | {
60 | "id": "Send cancelled.",
61 | "message": "Send cancelled.",
62 | "translation": "Gönderme iptal edildi"
63 | },
64 | {
65 | "id": "Cancel",
66 | "message": "Cancel",
67 | "translation": "İptal"
68 | },
69 | {
70 | "id": "Send Code",
71 | "message": "Send Code",
72 | "translation": "Kod gönder"
73 | },
74 | {
75 | "id": "Enable Debug Log",
76 | "message": "Enable Debug Log",
77 | "translation": "Hata ayıklama günlüğünü etkinleştir"
78 | },
79 | {
80 | "id": "Settings",
81 | "message": "Settings",
82 | "translation": "Ayarlar"
83 | },
84 | {
85 | "id": "Language",
86 | "message": "Language",
87 | "translation": "Dil"
88 | },
89 | {
90 | "id": "Appearance",
91 | "message": "Appearance",
92 | "translation": "Görünüş"
93 | },
94 | {
95 | "id": "Theme",
96 | "message": "Theme",
97 | "translation": "Tema"
98 | },
99 | {
100 | "id": "Relay",
101 | "message": "Relay",
102 | "translation": "Röle"
103 | },
104 | {
105 | "id": "Address",
106 | "message": "Address",
107 | "translation": "Adres"
108 | },
109 | {
110 | "id": "Ports",
111 | "message": "Ports",
112 | "translation": "Bağlantı noktası"
113 | },
114 | {
115 | "id": "Password",
116 | "message": "Password",
117 | "translation": "Şifre"
118 | },
119 | {
120 | "id": "Network Local",
121 | "message": "Network Local",
122 | "translation": "Yerel ağ"
123 | },
124 | {
125 | "id": "Disable Local",
126 | "message": "Disable Local",
127 | "translation": "Yerel devre dışı"
128 | },
129 | {
130 | "id": "Force Local Only",
131 | "message": "Force Local Only",
132 | "translation": "Yalnızca yerel olarak zorla"
133 | },
134 | {
135 | "id": "Transfer Options",
136 | "message": "Transfer Options",
137 | "translation": "Transfer seçenekleri"
138 | },
139 | {
140 | "id": "PAKE Curve",
141 | "message": "PAKE Curve",
142 | "translation": "PAKR eğrisi"
143 | },
144 | {
145 | "id": "Hash Algorithm",
146 | "message": "Hash Algorithm",
147 | "translation": "Karma algoritma"
148 | },
149 | {
150 | "id": "Disable Multiplexing",
151 | "message": "Disable Multiplexing",
152 | "translation": "Çoğullamayı devre dışı bırak"
153 | },
154 | {
155 | "id": "Disable Compression",
156 | "message": "Disable Compression",
157 | "translation": "Sıkıştırmayı devre dışı bırak"
158 | },
159 | {
160 | "id": "Upload Speed Throttle",
161 | "message": "Upload Speed Throttle",
162 | "translation": "Yükleme hızını kısma "
163 | },
164 | {
165 | "id": "Debug",
166 | "message": "Debug",
167 | "translation": "Hata ayıklama"
168 | },
169 | {
170 | "id": "About",
171 | "message": "About",
172 | "translation": "Hakkında"
173 | },
174 | {
175 | "id": "License Info",
176 | "message": "License Info",
177 | "translation": "Lisans"
178 | }
179 | ]
180 | }
181 |
--------------------------------------------------------------------------------
/internal/translations/locales/zh-CN/out.gotext.json:
--------------------------------------------------------------------------------
1 | {
2 | "language": "zh-CN",
3 | "messages": [
4 | {
5 | "id": "License Info",
6 | "message": "License Info",
7 | "translation": "许可证信息"
8 | },
9 | {
10 | "id": "About",
11 | "message": "About",
12 | "translation": "关于"
13 | },
14 | {
15 | "id": "Debug log:",
16 | "message": "Debug log:",
17 | "translation": "除错记录:"
18 | },
19 | {
20 | "id": "Enter code to download",
21 | "message": "Enter code to download",
22 | "translation": "输入代码下载"
23 | },
24 | {
25 | "id": "Receive",
26 | "message": "Receive",
27 | "translation": "接收"
28 | },
29 | {
30 | "id": "Receive Code",
31 | "message": "Receive Code",
32 | "translation": "接收码"
33 | },
34 | {
35 | "id": "Download",
36 | "message": "Download",
37 | "translation": "下载"
38 | },
39 | {
40 | "id": "Receiving file",
41 | "message": "Receiving file",
42 | "translation": "接收档案"
43 | },
44 | {
45 | "id": "Received",
46 | "message": "Received",
47 | "translation": "已接收"
48 | },
49 | {
50 | "id": "Pick a file to send",
51 | "message": "Pick a file to send",
52 | "translation": "选择要发送的档案"
53 | },
54 | {
55 | "id": "Send",
56 | "message": "Send",
57 | "translation": "发送"
58 | },
59 | {
60 | "id": "Sending file",
61 | "message": "Sending file",
62 | "translation": "发送档案中"
63 | },
64 | {
65 | "id": "Sent file",
66 | "message": "Sent file",
67 | "translation": "已发送档案"
68 | },
69 | {
70 | "id": "Send cancelled.",
71 | "message": "Send cancelled.",
72 | "translation": "发送已取消。"
73 | },
74 | {
75 | "id": "Cancel",
76 | "message": "Cancel",
77 | "translation": "取消"
78 | },
79 | {
80 | "id": "Send Code",
81 | "message": "Send Code",
82 | "translation": "发送代码"
83 | },
84 | {
85 | "id": "Enable Debug Log",
86 | "message": "Enable Debug Log",
87 | "translation": "启用除错记录"
88 | },
89 | {
90 | "id": "Show / Hide",
91 | "message": "Show / Hide",
92 | "translation": "显示 / 隐藏"
93 | },
94 | {
95 | "id": "Settings",
96 | "message": "Settings",
97 | "translation": "设定"
98 | },
99 | {
100 | "id": "Appearance",
101 | "message": "Appearance",
102 | "translation": "外观"
103 | },
104 | {
105 | "id": "Language",
106 | "message": "Language",
107 | "translation": "语言"
108 | },
109 | {
110 | "id": "Theme",
111 | "message": "Theme",
112 | "translation": "主题"
113 | },
114 | {
115 | "id": "Font",
116 | "message": "Font",
117 | "translation": "字体"
118 | },
119 | {
120 | "id": "Logo",
121 | "message": "Logo",
122 | "translation": "标志"
123 | },
124 | {
125 | "id": "Relay",
126 | "message": "Relay",
127 | "translation": "中继"
128 | },
129 | {
130 | "id": "Address",
131 | "message": "Address",
132 | "translation": "地址"
133 | },
134 | {
135 | "id": "Ports",
136 | "message": "Ports",
137 | "translation": "端口"
138 | },
139 | {
140 | "id": "Password",
141 | "message": "Password",
142 | "translation": "密码"
143 | },
144 | {
145 | "id": "Network Local",
146 | "message": "Network Local",
147 | "translation": "本地网络"
148 | },
149 | {
150 | "id": "Disable Local",
151 | "message": "Disable Local",
152 | "translation": "停用本地"
153 | },
154 | {
155 | "id": "Force Local Only",
156 | "message": "Force Local Only",
157 | "translation": "强制仅限本地"
158 | },
159 | {
160 | "id": "Multicast Address",
161 | "message": "Multicast Address",
162 | "translation": "组播地址"
163 | },
164 | {
165 | "id": "Transfer Options",
166 | "message": "Transfer Options",
167 | "translation": "传输选项"
168 | },
169 | {
170 | "id": "PAKE Curve",
171 | "message": "PAKE Curve",
172 | "translation": "PAKE 曲线"
173 | },
174 | {
175 | "id": "Hash Algorithm",
176 | "message": "Hash Algorithm",
177 | "translation": "哈希算法"
178 | },
179 | {
180 | "id": "Disable Multiplexing",
181 | "message": "Disable Multiplexing",
182 | "translation": "停用多重化"
183 | },
184 | {
185 | "id": "Disable Compression",
186 | "message": "Disable Compression",
187 | "translation": "停用压缩"
188 | },
189 | {
190 | "id": "Upload Speed Throttle",
191 | "message": "Upload Speed Throttle",
192 | "translation": "上传速度调节"
193 | },
194 | {
195 | "id": "Debug",
196 | "message": "Debug",
197 | "translation": "除错"
198 | }
199 | ]
200 | }
--------------------------------------------------------------------------------
/internal/translations/locales/zh-HK/out.gotext.json:
--------------------------------------------------------------------------------
1 | {
2 | "language": "zh-HK",
3 | "messages": [
4 | {
5 | "id": "License Info",
6 | "message": "License Info",
7 | "translation": "許可證資訊"
8 | },
9 | {
10 | "id": "About",
11 | "message": "About",
12 | "translation": "關於"
13 | },
14 | {
15 | "id": "Debug log:",
16 | "message": "Debug log:",
17 | "translation": "除錯記錄:"
18 | },
19 | {
20 | "id": "Enter code to download",
21 | "message": "Enter code to download",
22 | "translation": "輸入編碼以下載"
23 | },
24 | {
25 | "id": "Receive",
26 | "message": "Receive",
27 | "translation": "接收"
28 | },
29 | {
30 | "id": "Receive Code",
31 | "message": "Receive Code",
32 | "translation": "接收碼"
33 | },
34 | {
35 | "id": "Download",
36 | "message": "Download",
37 | "translation": "下載"
38 | },
39 | {
40 | "id": "Receiving file",
41 | "message": "Receiving file",
42 | "translation": "接收文件"
43 | },
44 | {
45 | "id": "Received",
46 | "message": "Received",
47 | "translation": "已接收"
48 | },
49 | {
50 | "id": "Pick a file to send",
51 | "message": "Pick a file to send",
52 | "translation": "選擇要發送的文件"
53 | },
54 | {
55 | "id": "Send",
56 | "message": "Send",
57 | "translation": "發送"
58 | },
59 | {
60 | "id": "Sending file",
61 | "message": "Sending file",
62 | "translation": "發送文件中"
63 | },
64 | {
65 | "id": "Sent file",
66 | "message": "Sent file",
67 | "translation": "已發送文件"
68 | },
69 | {
70 | "id": "Send cancelled.",
71 | "message": "Send cancelled.",
72 | "translation": "發送已取消。"
73 | },
74 | {
75 | "id": "Cancel",
76 | "message": "Cancel",
77 | "translation": "取消"
78 | },
79 | {
80 | "id": "Send Code",
81 | "message": "Send Code",
82 | "translation": "發送代碼"
83 | },
84 | {
85 | "id": "Enable Debug Log",
86 | "message": "Enable Debug Log",
87 | "translation": "啟用除錯記錄"
88 | },
89 | {
90 | "id": "Show / Hide",
91 | "message": "Show / Hide",
92 | "translation": "顯示 / 隱藏"
93 | },
94 | {
95 | "id": "Settings",
96 | "message": "Settings",
97 | "translation": "設定"
98 | },
99 | {
100 | "id": "Appearance",
101 | "message": "Appearance",
102 | "translation": "外觀"
103 | },
104 | {
105 | "id": "Language",
106 | "message": "Language",
107 | "translation": "語言"
108 | },
109 | {
110 | "id": "Theme",
111 | "message": "Theme",
112 | "translation": "主題"
113 | },
114 | {
115 | "id": "Font",
116 | "message": "Font",
117 | "translation": "字體"
118 | },
119 | {
120 | "id": "Logo",
121 | "message": "Logo",
122 | "translation": "標誌"
123 | },
124 | {
125 | "id": "Relay",
126 | "message": "Relay",
127 | "translation": "中繼"
128 | },
129 | {
130 | "id": "Address",
131 | "message": "Address",
132 | "translation": "地址"
133 | },
134 | {
135 | "id": "Ports",
136 | "message": "Ports",
137 | "translation": "端口"
138 | },
139 | {
140 | "id": "Password",
141 | "message": "Password",
142 | "translation": "密碼"
143 | },
144 | {
145 | "id": "Network Local",
146 | "message": "Network Local",
147 | "translation": "本地網絡"
148 | },
149 | {
150 | "id": "Disable Local",
151 | "message": "Disable Local",
152 | "translation": "停用本地"
153 | },
154 | {
155 | "id": "Force Local Only",
156 | "message": "Force Local Only",
157 | "translation": "強制只限本地"
158 | },
159 | {
160 | "id": "Multicast Address",
161 | "message": "Multicast Address",
162 | "translation": "群播位址"
163 | },
164 | {
165 | "id": "Transfer Options",
166 | "message": "Transfer Options",
167 | "translation": "傳輸選擇"
168 | },
169 | {
170 | "id": "PAKE Curve",
171 | "message": "PAKE Curve",
172 | "translation": "PAKE 曲線"
173 | },
174 | {
175 | "id": "Hash Algorithm",
176 | "message": "Hash Algorithm",
177 | "translation": "哈希演算法"
178 | },
179 | {
180 | "id": "Disable Multiplexing",
181 | "message": "Disable Multiplexing",
182 | "translation": "停用多重化"
183 | },
184 | {
185 | "id": "Disable Compression",
186 | "message": "Disable Compression",
187 | "translation": "停用壓縮"
188 | },
189 | {
190 | "id": "Upload Speed Throttle",
191 | "message": "Upload Speed Throttle",
192 | "translation": "上載速度節流"
193 | },
194 | {
195 | "id": "Debug",
196 | "message": "Debug",
197 | "translation": "除錯"
198 | }
199 | ]
200 | }
--------------------------------------------------------------------------------
/internal/translations/locales/zh-TW/out.gotext.json:
--------------------------------------------------------------------------------
1 | {
2 | "language": "zh-TW",
3 | "messages": [
4 | {
5 | "id": "License Info",
6 | "message": "License Info",
7 | "translation": "許可證資訊"
8 | },
9 | {
10 | "id": "About",
11 | "message": "About",
12 | "translation": "關於"
13 | },
14 | {
15 | "id": "Debug log:",
16 | "message": "Debug log:",
17 | "translation": "除錯記錄:"
18 | },
19 | {
20 | "id": "Enter code to download",
21 | "message": "Enter code to download",
22 | "translation": "輸入代碼下載"
23 | },
24 | {
25 | "id": "Receive",
26 | "message": "Receive",
27 | "translation": "接收"
28 | },
29 | {
30 | "id": "Receive Code",
31 | "message": "Receive Code",
32 | "translation": "接收碼"
33 | },
34 | {
35 | "id": "Download",
36 | "message": "Download",
37 | "translation": "下載"
38 | },
39 | {
40 | "id": "Receiving file",
41 | "message": "Receiving file",
42 | "translation": "接收檔案"
43 | },
44 | {
45 | "id": "Received",
46 | "message": "Received",
47 | "translation": "已接收"
48 | },
49 | {
50 | "id": "Pick a file to send",
51 | "message": "Pick a file to send",
52 | "translation": "選擇要發送的檔案"
53 | },
54 | {
55 | "id": "Send",
56 | "message": "Send",
57 | "translation": "發送"
58 | },
59 | {
60 | "id": "Sending file",
61 | "message": "Sending file",
62 | "translation": "發送檔案中"
63 | },
64 | {
65 | "id": "Sent file",
66 | "message": "Sent file",
67 | "translation": "已發送檔案"
68 | },
69 | {
70 | "id": "Send cancelled.",
71 | "message": "Send cancelled.",
72 | "translation": "發送已取消。"
73 | },
74 | {
75 | "id": "Cancel",
76 | "message": "Cancel",
77 | "translation": "取消"
78 | },
79 | {
80 | "id": "Send Code",
81 | "message": "Send Code",
82 | "translation": "發送代碼"
83 | },
84 | {
85 | "id": "Enable Debug Log",
86 | "message": "Enable Debug Log",
87 | "translation": "啟用除錯記錄"
88 | },
89 | {
90 | "id": "Show / Hide",
91 | "message": "Show / Hide",
92 | "translation": "顯示 / 隱藏"
93 | },
94 | {
95 | "id": "Settings",
96 | "message": "Settings",
97 | "translation": "設定"
98 | },
99 | {
100 | "id": "Appearance",
101 | "message": "Appearance",
102 | "translation": "外觀"
103 | },
104 | {
105 | "id": "Language",
106 | "message": "Language",
107 | "translation": "語言"
108 | },
109 | {
110 | "id": "Theme",
111 | "message": "Theme",
112 | "translation": "主題"
113 | },
114 | {
115 | "id": "Font",
116 | "message": "Font",
117 | "translation": "字體"
118 | },
119 | {
120 | "id": "Logo",
121 | "message": "Logo",
122 | "translation": "標誌"
123 | },
124 | {
125 | "id": "Relay",
126 | "message": "Relay",
127 | "translation": "中繼"
128 | },
129 | {
130 | "id": "Address",
131 | "message": "Address",
132 | "translation": "地址"
133 | },
134 | {
135 | "id": "Ports",
136 | "message": "Ports",
137 | "translation": "連接埠"
138 | },
139 | {
140 | "id": "Password",
141 | "message": "Password",
142 | "translation": "密碼"
143 | },
144 | {
145 | "id": "Network Local",
146 | "message": "Network Local",
147 | "translation": "本地網路"
148 | },
149 | {
150 | "id": "Disable Local",
151 | "message": "Disable Local",
152 | "translation": "停用本地"
153 | },
154 | {
155 | "id": "Force Local Only",
156 | "message": "Force Local Only",
157 | "translation": "強制僅限本地"
158 | },
159 | {
160 | "id": "Multicast Address",
161 | "message": "Multicast Address",
162 | "translation": "群播位址"
163 | },
164 | {
165 | "id": "Transfer Options",
166 | "message": "Transfer Options",
167 | "translation": "傳輸選項"
168 | },
169 | {
170 | "id": "PAKE Curve",
171 | "message": "PAKE Curve",
172 | "translation": "PAKE 曲線"
173 | },
174 | {
175 | "id": "Hash Algorithm",
176 | "message": "Hash Algorithm",
177 | "translation": "哈希演算法"
178 | },
179 | {
180 | "id": "Disable Multiplexing",
181 | "message": "Disable Multiplexing",
182 | "translation": "停用多重化"
183 | },
184 | {
185 | "id": "Disable Compression",
186 | "message": "Disable Compression",
187 | "translation": "停用壓縮"
188 | },
189 | {
190 | "id": "Upload Speed Throttle",
191 | "message": "Upload Speed Throttle",
192 | "translation": "上傳速度調節"
193 | },
194 | {
195 | "id": "Debug",
196 | "message": "Debug",
197 | "translation": "除錯"
198 | }
199 | ]
200 | }
--------------------------------------------------------------------------------
/internal/translations/locales/zh-CN/messages.gotext.json:
--------------------------------------------------------------------------------
1 | {
2 | "language": "zh-CN",
3 | "messages": [
4 | {
5 | "id": "License Info",
6 | "message": "License Info",
7 | "translation": "许可证信息"
8 | },
9 | {
10 | "id": "About",
11 | "message": "About",
12 | "translation": "关于"
13 | },
14 | {
15 | "id": "Debug log:",
16 | "message": "Debug log:",
17 | "translation": "除错记录:"
18 | },
19 | {
20 | "id": "Enter code to download",
21 | "message": "Enter code to download",
22 | "translation": "输入代码下载"
23 | },
24 | {
25 | "id": "Receive",
26 | "message": "Receive",
27 | "translation": "接收"
28 | },
29 | {
30 | "id": "Receive Code",
31 | "message": "Receive Code",
32 | "translation": "接收码"
33 | },
34 | {
35 | "id": "Download",
36 | "message": "Download",
37 | "translation": "下载"
38 | },
39 | {
40 | "id": "Receiving file",
41 | "message": "Receiving file",
42 | "translation": "接收档案"
43 | },
44 | {
45 | "id": "Received",
46 | "message": "Received",
47 | "translation": "已接收"
48 | },
49 | {
50 | "id": "Pick a file to send",
51 | "message": "Pick a file to send",
52 | "translation": "选择要发送的档案"
53 | },
54 | {
55 | "id": "Send",
56 | "message": "Send",
57 | "translation": "发送"
58 | },
59 | {
60 | "id": "Sending file",
61 | "message": "Sending file",
62 | "translation": "发送档案中"
63 | },
64 | {
65 | "id": "Sent file",
66 | "message": "Sent file",
67 | "translation": "已发送档案"
68 | },
69 | {
70 | "id": "Send cancelled.",
71 | "message": "Send cancelled.",
72 | "translation": "发送已取消。"
73 | },
74 | {
75 | "id": "Cancel",
76 | "message": "Cancel",
77 | "translation": "取消"
78 | },
79 | {
80 | "id": "Send Code",
81 | "message": "Send Code",
82 | "translation": "发送代码"
83 | },
84 | {
85 | "id": "Enable Debug Log",
86 | "message": "Enable Debug Log",
87 | "translation": "启用除错记录"
88 | },
89 | {
90 | "id": "Show / Hide",
91 | "message": "Show / Hide",
92 | "translation": "显示 / 隐藏"
93 | },
94 | {
95 | "id": "Settings",
96 | "message": "Settings",
97 | "translation": "设定"
98 | },
99 | {
100 | "id": "Appearance",
101 | "message": "Appearance",
102 | "translation": "外观"
103 | },
104 | {
105 | "id": "Language",
106 | "message": "Language",
107 | "translation": "语言"
108 | },
109 | {
110 | "id": "Theme",
111 | "message": "Theme",
112 | "translation": "主题"
113 | },
114 | {
115 | "id": "Font",
116 | "message": "Font",
117 | "translation": "字体"
118 | },
119 | {
120 | "id": "Logo",
121 | "message": "Logo",
122 | "translation": "标志"
123 | },
124 | {
125 | "id": "Relay",
126 | "message": "Relay",
127 | "translation": "中继"
128 | },
129 | {
130 | "id": "Address",
131 | "message": "Address",
132 | "translation": "地址"
133 | },
134 | {
135 | "id": "Ports",
136 | "message": "Ports",
137 | "translation": "端口"
138 | },
139 | {
140 | "id": "Password",
141 | "message": "Password",
142 | "translation": "密码"
143 | },
144 | {
145 | "id": "Network Local",
146 | "message": "Network Local",
147 | "translation": "本地网络"
148 | },
149 | {
150 | "id": "Disable Local",
151 | "message": "Disable Local",
152 | "translation": "停用本地"
153 | },
154 | {
155 | "id": "Force Local Only",
156 | "message": "Force Local Only",
157 | "translation": "强制仅限本地"
158 | },
159 | {
160 | "id": "Multicast Address",
161 | "message": "Multicast Address",
162 | "translation": "组播地址"
163 | },
164 | {
165 | "id": "Transfer Options",
166 | "message": "Transfer Options",
167 | "translation": "传输选项"
168 | },
169 | {
170 | "id": "PAKE Curve",
171 | "message": "PAKE Curve",
172 | "translation": "PAKE 曲线"
173 | },
174 | {
175 | "id": "Hash Algorithm",
176 | "message": "Hash Algorithm",
177 | "translation": "哈希算法"
178 | },
179 | {
180 | "id": "Disable Multiplexing",
181 | "message": "Disable Multiplexing",
182 | "translation": "停用多重化"
183 | },
184 | {
185 | "id": "Disable Compression",
186 | "message": "Disable Compression",
187 | "translation": "停用压缩"
188 | },
189 | {
190 | "id": "Upload Speed Throttle",
191 | "message": "Upload Speed Throttle",
192 | "translation": "上传速度调节"
193 | },
194 | {
195 | "id": "Debug",
196 | "message": "Debug",
197 | "translation": "除错"
198 | }
199 | ]
200 | }
--------------------------------------------------------------------------------
/internal/translations/locales/zh-HK/messages.gotext.json:
--------------------------------------------------------------------------------
1 | {
2 | "language": "zh-HK",
3 | "messages": [
4 | {
5 | "id": "License Info",
6 | "message": "License Info",
7 | "translation": "許可證資訊"
8 | },
9 | {
10 | "id": "About",
11 | "message": "About",
12 | "translation": "關於"
13 | },
14 | {
15 | "id": "Debug log:",
16 | "message": "Debug log:",
17 | "translation": "除錯記錄:"
18 | },
19 | {
20 | "id": "Enter code to download",
21 | "message": "Enter code to download",
22 | "translation": "輸入編碼以下載"
23 | },
24 | {
25 | "id": "Receive",
26 | "message": "Receive",
27 | "translation": "接收"
28 | },
29 | {
30 | "id": "Receive Code",
31 | "message": "Receive Code",
32 | "translation": "接收碼"
33 | },
34 | {
35 | "id": "Download",
36 | "message": "Download",
37 | "translation": "下載"
38 | },
39 | {
40 | "id": "Receiving file",
41 | "message": "Receiving file",
42 | "translation": "接收文件"
43 | },
44 | {
45 | "id": "Received",
46 | "message": "Received",
47 | "translation": "已接收"
48 | },
49 | {
50 | "id": "Pick a file to send",
51 | "message": "Pick a file to send",
52 | "translation": "選擇要發送的文件"
53 | },
54 | {
55 | "id": "Send",
56 | "message": "Send",
57 | "translation": "發送"
58 | },
59 | {
60 | "id": "Sending file",
61 | "message": "Sending file",
62 | "translation": "發送文件中"
63 | },
64 | {
65 | "id": "Sent file",
66 | "message": "Sent file",
67 | "translation": "已發送文件"
68 | },
69 | {
70 | "id": "Send cancelled.",
71 | "message": "Send cancelled.",
72 | "translation": "發送已取消。"
73 | },
74 | {
75 | "id": "Cancel",
76 | "message": "Cancel",
77 | "translation": "取消"
78 | },
79 | {
80 | "id": "Send Code",
81 | "message": "Send Code",
82 | "translation": "發送代碼"
83 | },
84 | {
85 | "id": "Enable Debug Log",
86 | "message": "Enable Debug Log",
87 | "translation": "啟用除錯記錄"
88 | },
89 | {
90 | "id": "Show / Hide",
91 | "message": "Show / Hide",
92 | "translation": "顯示 / 隱藏"
93 | },
94 | {
95 | "id": "Settings",
96 | "message": "Settings",
97 | "translation": "設定"
98 | },
99 | {
100 | "id": "Appearance",
101 | "message": "Appearance",
102 | "translation": "外觀"
103 | },
104 | {
105 | "id": "Language",
106 | "message": "Language",
107 | "translation": "語言"
108 | },
109 | {
110 | "id": "Theme",
111 | "message": "Theme",
112 | "translation": "主題"
113 | },
114 | {
115 | "id": "Font",
116 | "message": "Font",
117 | "translation": "字體"
118 | },
119 | {
120 | "id": "Logo",
121 | "message": "Logo",
122 | "translation": "標誌"
123 | },
124 | {
125 | "id": "Relay",
126 | "message": "Relay",
127 | "translation": "中繼"
128 | },
129 | {
130 | "id": "Address",
131 | "message": "Address",
132 | "translation": "地址"
133 | },
134 | {
135 | "id": "Ports",
136 | "message": "Ports",
137 | "translation": "端口"
138 | },
139 | {
140 | "id": "Password",
141 | "message": "Password",
142 | "translation": "密碼"
143 | },
144 | {
145 | "id": "Network Local",
146 | "message": "Network Local",
147 | "translation": "本地網絡"
148 | },
149 | {
150 | "id": "Disable Local",
151 | "message": "Disable Local",
152 | "translation": "停用本地"
153 | },
154 | {
155 | "id": "Force Local Only",
156 | "message": "Force Local Only",
157 | "translation": "強制只限本地"
158 | },
159 | {
160 | "id": "Multicast Address",
161 | "message": "Multicast Address",
162 | "translation": "群播位址"
163 | },
164 | {
165 | "id": "Transfer Options",
166 | "message": "Transfer Options",
167 | "translation": "傳輸選擇"
168 | },
169 | {
170 | "id": "PAKE Curve",
171 | "message": "PAKE Curve",
172 | "translation": "PAKE 曲線"
173 | },
174 | {
175 | "id": "Hash Algorithm",
176 | "message": "Hash Algorithm",
177 | "translation": "哈希演算法"
178 | },
179 | {
180 | "id": "Disable Multiplexing",
181 | "message": "Disable Multiplexing",
182 | "translation": "停用多重化"
183 | },
184 | {
185 | "id": "Disable Compression",
186 | "message": "Disable Compression",
187 | "translation": "停用壓縮"
188 | },
189 | {
190 | "id": "Upload Speed Throttle",
191 | "message": "Upload Speed Throttle",
192 | "translation": "上載速度節流"
193 | },
194 | {
195 | "id": "Debug",
196 | "message": "Debug",
197 | "translation": "除錯"
198 | }
199 | ]
200 | }
--------------------------------------------------------------------------------
/internal/translations/locales/zh-TW/messages.gotext.json:
--------------------------------------------------------------------------------
1 | {
2 | "language": "zh-TW",
3 | "messages": [
4 | {
5 | "id": "License Info",
6 | "message": "License Info",
7 | "translation": "許可證資訊"
8 | },
9 | {
10 | "id": "About",
11 | "message": "About",
12 | "translation": "關於"
13 | },
14 | {
15 | "id": "Debug log:",
16 | "message": "Debug log:",
17 | "translation": "除錯記錄:"
18 | },
19 | {
20 | "id": "Enter code to download",
21 | "message": "Enter code to download",
22 | "translation": "輸入代碼下載"
23 | },
24 | {
25 | "id": "Receive",
26 | "message": "Receive",
27 | "translation": "接收"
28 | },
29 | {
30 | "id": "Receive Code",
31 | "message": "Receive Code",
32 | "translation": "接收碼"
33 | },
34 | {
35 | "id": "Download",
36 | "message": "Download",
37 | "translation": "下載"
38 | },
39 | {
40 | "id": "Receiving file",
41 | "message": "Receiving file",
42 | "translation": "接收檔案"
43 | },
44 | {
45 | "id": "Received",
46 | "message": "Received",
47 | "translation": "已接收"
48 | },
49 | {
50 | "id": "Pick a file to send",
51 | "message": "Pick a file to send",
52 | "translation": "選擇要發送的檔案"
53 | },
54 | {
55 | "id": "Send",
56 | "message": "Send",
57 | "translation": "發送"
58 | },
59 | {
60 | "id": "Sending file",
61 | "message": "Sending file",
62 | "translation": "發送檔案中"
63 | },
64 | {
65 | "id": "Sent file",
66 | "message": "Sent file",
67 | "translation": "已發送檔案"
68 | },
69 | {
70 | "id": "Send cancelled.",
71 | "message": "Send cancelled.",
72 | "translation": "發送已取消。"
73 | },
74 | {
75 | "id": "Cancel",
76 | "message": "Cancel",
77 | "translation": "取消"
78 | },
79 | {
80 | "id": "Send Code",
81 | "message": "Send Code",
82 | "translation": "發送代碼"
83 | },
84 | {
85 | "id": "Enable Debug Log",
86 | "message": "Enable Debug Log",
87 | "translation": "啟用除錯記錄"
88 | },
89 | {
90 | "id": "Show / Hide",
91 | "message": "Show / Hide",
92 | "translation": "顯示 / 隱藏"
93 | },
94 | {
95 | "id": "Settings",
96 | "message": "Settings",
97 | "translation": "設定"
98 | },
99 | {
100 | "id": "Appearance",
101 | "message": "Appearance",
102 | "translation": "外觀"
103 | },
104 | {
105 | "id": "Language",
106 | "message": "Language",
107 | "translation": "語言"
108 | },
109 | {
110 | "id": "Theme",
111 | "message": "Theme",
112 | "translation": "主題"
113 | },
114 | {
115 | "id": "Font",
116 | "message": "Font",
117 | "translation": "字體"
118 | },
119 | {
120 | "id": "Logo",
121 | "message": "Logo",
122 | "translation": "標誌"
123 | },
124 | {
125 | "id": "Relay",
126 | "message": "Relay",
127 | "translation": "中繼"
128 | },
129 | {
130 | "id": "Address",
131 | "message": "Address",
132 | "translation": "地址"
133 | },
134 | {
135 | "id": "Ports",
136 | "message": "Ports",
137 | "translation": "連接埠"
138 | },
139 | {
140 | "id": "Password",
141 | "message": "Password",
142 | "translation": "密碼"
143 | },
144 | {
145 | "id": "Network Local",
146 | "message": "Network Local",
147 | "translation": "本地網路"
148 | },
149 | {
150 | "id": "Disable Local",
151 | "message": "Disable Local",
152 | "translation": "停用本地"
153 | },
154 | {
155 | "id": "Force Local Only",
156 | "message": "Force Local Only",
157 | "translation": "強制僅限本地"
158 | },
159 | {
160 | "id": "Multicast Address",
161 | "message": "Multicast Address",
162 | "translation": "群播位址"
163 | },
164 | {
165 | "id": "Transfer Options",
166 | "message": "Transfer Options",
167 | "translation": "傳輸選項"
168 | },
169 | {
170 | "id": "PAKE Curve",
171 | "message": "PAKE Curve",
172 | "translation": "PAKE 曲線"
173 | },
174 | {
175 | "id": "Hash Algorithm",
176 | "message": "Hash Algorithm",
177 | "translation": "哈希演算法"
178 | },
179 | {
180 | "id": "Disable Multiplexing",
181 | "message": "Disable Multiplexing",
182 | "translation": "停用多重化"
183 | },
184 | {
185 | "id": "Disable Compression",
186 | "message": "Disable Compression",
187 | "translation": "停用壓縮"
188 | },
189 | {
190 | "id": "Upload Speed Throttle",
191 | "message": "Upload Speed Throttle",
192 | "translation": "上傳速度調節"
193 | },
194 | {
195 | "id": "Debug",
196 | "message": "Debug",
197 | "translation": "除錯"
198 | }
199 | ]
200 | }
--------------------------------------------------------------------------------
/internal/translations/locales/ja-JP/out.gotext.json:
--------------------------------------------------------------------------------
1 | {
2 | "language": "ja-JP",
3 | "messages": [
4 | {
5 | "id": "License Info",
6 | "message": "License Info",
7 | "translation": "ライセンス情報"
8 | },
9 | {
10 | "id": "About",
11 | "message": "About",
12 | "translation": "情報"
13 | },
14 | {
15 | "id": "Debug log:",
16 | "message": "Debug log:",
17 | "translation": "デバッグログ:"
18 | },
19 | {
20 | "id": "Enter code to download",
21 | "message": "Enter code to download",
22 | "translation": "コードを入力してダウンロード"
23 | },
24 | {
25 | "id": "Receive",
26 | "message": "Receive",
27 | "translation": "受信"
28 | },
29 | {
30 | "id": "Receive Code",
31 | "message": "Receive Code",
32 | "translation": "受信コード"
33 | },
34 | {
35 | "id": "Download",
36 | "message": "Download",
37 | "translation": "ダウンロード"
38 | },
39 | {
40 | "id": "Receiving file",
41 | "message": "Receiving file",
42 | "translation": "ファイルを受信中"
43 | },
44 | {
45 | "id": "Received",
46 | "message": "Received",
47 | "translation": "受信しました"
48 | },
49 | {
50 | "id": "Pick a file to send",
51 | "message": "Pick a file to send",
52 | "translation": "ファイルを選択して送信"
53 | },
54 | {
55 | "id": "Send",
56 | "message": "Send",
57 | "translation": "送信"
58 | },
59 | {
60 | "id": "Sending file",
61 | "message": "Sending file",
62 | "translation": "ファイルを送信中"
63 | },
64 | {
65 | "id": "Sent file",
66 | "message": "Sent file",
67 | "translation": "ファイルを送信しました"
68 | },
69 | {
70 | "id": "Send cancelled.",
71 | "message": "Send cancelled.",
72 | "translation": "送信はキャンセルされました"
73 | },
74 | {
75 | "id": "Cancel",
76 | "message": "Cancel",
77 | "translation": "キャンセル"
78 | },
79 | {
80 | "id": "Send Code",
81 | "message": "Send Code",
82 | "translation": "受信コード"
83 | },
84 | {
85 | "id": "Enable Debug Log",
86 | "message": "Enable Debug Log",
87 | "translation": "デバッグログを有効化"
88 | },
89 | {
90 | "id": "Show / Hide",
91 | "message": "Show / Hide",
92 | "translation": "表示 / 非表示"
93 | },
94 | {
95 | "id": "Settings",
96 | "message": "Settings",
97 | "translation": "設定"
98 | },
99 | {
100 | "id": "Appearance",
101 | "message": "Appearance",
102 | "translation": "外観"
103 | },
104 | {
105 | "id": "Language",
106 | "message": "Language",
107 | "translation": "言語"
108 | },
109 | {
110 | "id": "Theme",
111 | "message": "Theme",
112 | "translation": "テーマ"
113 | },
114 | {
115 | "id": "Font",
116 | "message": "Font",
117 | "translation": "フォント"
118 | },
119 | {
120 | "id": "Logo",
121 | "message": "Logo",
122 | "translation": "ロゴ"
123 | },
124 | {
125 | "id": "Relay",
126 | "message": "Relay",
127 | "translation": "リレー"
128 | },
129 | {
130 | "id": "Address",
131 | "message": "Address",
132 | "translation": "アドレス"
133 | },
134 | {
135 | "id": "Ports",
136 | "message": "Ports",
137 | "translation": "ポート"
138 | },
139 | {
140 | "id": "Password",
141 | "message": "Password",
142 | "translation": "パスワード"
143 | },
144 | {
145 | "id": "Network Local",
146 | "message": "Network Local",
147 | "translation": "ローカルネットワーク"
148 | },
149 | {
150 | "id": "Disable Local",
151 | "message": "Disable Local",
152 | "translation": "ローカルネットワークを無効化"
153 | },
154 | {
155 | "id": "Force Local Only",
156 | "message": "Force Local Only",
157 | "translation": "ローカルネットワークのみ使用する"
158 | },
159 | {
160 | "id": "Multicast Address",
161 | "message": "Multicast Address",
162 | "translation": "マルチキャストアドレス"
163 | },
164 | {
165 | "id": "Transfer Options",
166 | "message": "Transfer Options",
167 | "translation": "転送オプション"
168 | },
169 | {
170 | "id": "PAKE Curve",
171 | "message": "PAKE Curve",
172 | "translation": "PAKE Curve"
173 | },
174 | {
175 | "id": "Hash Algorithm",
176 | "message": "Hash Algorithm",
177 | "translation": "ハッシュ方式"
178 | },
179 | {
180 | "id": "Disable Multiplexing",
181 | "message": "Disable Multiplexing",
182 | "translation": "多重化を無効にする"
183 | },
184 | {
185 | "id": "Disable Compression",
186 | "message": "Disable Compression",
187 | "translation": "圧縮を無効化"
188 | },
189 | {
190 | "id": "Upload Speed Throttle",
191 | "message": "Upload Speed Throttle",
192 | "translation": "アップロード速度の制限"
193 | },
194 | {
195 | "id": "Debug",
196 | "message": "Debug",
197 | "translation": "デバッグ"
198 | }
199 | ]
200 | }
--------------------------------------------------------------------------------
/internal/translations/locales/ja-JP/messages.gotext.json:
--------------------------------------------------------------------------------
1 | {
2 | "language": "ja-JP",
3 | "messages": [
4 | {
5 | "id": "License Info",
6 | "message": "License Info",
7 | "translation": "ライセンス情報"
8 | },
9 | {
10 | "id": "About",
11 | "message": "About",
12 | "translation": "情報"
13 | },
14 | {
15 | "id": "Debug log:",
16 | "message": "Debug log:",
17 | "translation": "デバッグログ:"
18 | },
19 | {
20 | "id": "Enter code to download",
21 | "message": "Enter code to download",
22 | "translation": "コードを入力してダウンロード"
23 | },
24 | {
25 | "id": "Receive",
26 | "message": "Receive",
27 | "translation": "受信"
28 | },
29 | {
30 | "id": "Receive Code",
31 | "message": "Receive Code",
32 | "translation": "受信コード"
33 | },
34 | {
35 | "id": "Download",
36 | "message": "Download",
37 | "translation": "ダウンロード"
38 | },
39 | {
40 | "id": "Receiving file",
41 | "message": "Receiving file",
42 | "translation": "ファイルを受信中"
43 | },
44 | {
45 | "id": "Received",
46 | "message": "Received",
47 | "translation": "受信しました"
48 | },
49 | {
50 | "id": "Pick a file to send",
51 | "message": "Pick a file to send",
52 | "translation": "ファイルを選択して送信"
53 | },
54 | {
55 | "id": "Send",
56 | "message": "Send",
57 | "translation": "送信"
58 | },
59 | {
60 | "id": "Sending file",
61 | "message": "Sending file",
62 | "translation": "ファイルを送信中"
63 | },
64 | {
65 | "id": "Sent file",
66 | "message": "Sent file",
67 | "translation": "ファイルを送信しました"
68 | },
69 | {
70 | "id": "Send cancelled.",
71 | "message": "Send cancelled.",
72 | "translation": "送信はキャンセルされました"
73 | },
74 | {
75 | "id": "Cancel",
76 | "message": "Cancel",
77 | "translation": "キャンセル"
78 | },
79 | {
80 | "id": "Send Code",
81 | "message": "Send Code",
82 | "translation": "受信コード"
83 | },
84 | {
85 | "id": "Enable Debug Log",
86 | "message": "Enable Debug Log",
87 | "translation": "デバッグログを有効化"
88 | },
89 | {
90 | "id": "Show / Hide",
91 | "message": "Show / Hide",
92 | "translation": "表示 / 非表示"
93 | },
94 | {
95 | "id": "Settings",
96 | "message": "Settings",
97 | "translation": "設定"
98 | },
99 | {
100 | "id": "Appearance",
101 | "message": "Appearance",
102 | "translation": "外観"
103 | },
104 | {
105 | "id": "Language",
106 | "message": "Language",
107 | "translation": "言語"
108 | },
109 | {
110 | "id": "Theme",
111 | "message": "Theme",
112 | "translation": "テーマ"
113 | },
114 | {
115 | "id": "Font",
116 | "message": "Font",
117 | "translation": "フォント"
118 | },
119 | {
120 | "id": "Logo",
121 | "message": "Logo",
122 | "translation": "ロゴ"
123 | },
124 | {
125 | "id": "Relay",
126 | "message": "Relay",
127 | "translation": "リレー"
128 | },
129 | {
130 | "id": "Address",
131 | "message": "Address",
132 | "translation": "アドレス"
133 | },
134 | {
135 | "id": "Ports",
136 | "message": "Ports",
137 | "translation": "ポート"
138 | },
139 | {
140 | "id": "Password",
141 | "message": "Password",
142 | "translation": "パスワード"
143 | },
144 | {
145 | "id": "Network Local",
146 | "message": "Network Local",
147 | "translation": "ローカルネットワーク"
148 | },
149 | {
150 | "id": "Disable Local",
151 | "message": "Disable Local",
152 | "translation": "ローカルネットワークを無効化"
153 | },
154 | {
155 | "id": "Force Local Only",
156 | "message": "Force Local Only",
157 | "translation": "ローカルネットワークのみ使用する"
158 | },
159 | {
160 | "id": "Multicast Address",
161 | "message": "Multicast Address",
162 | "translation": "マルチキャストアドレス"
163 | },
164 | {
165 | "id": "Transfer Options",
166 | "message": "Transfer Options",
167 | "translation": "転送オプション"
168 | },
169 | {
170 | "id": "PAKE Curve",
171 | "message": "PAKE Curve",
172 | "translation": "PAKE Curve"
173 | },
174 | {
175 | "id": "Hash Algorithm",
176 | "message": "Hash Algorithm",
177 | "translation": "ハッシュ方式"
178 | },
179 | {
180 | "id": "Disable Multiplexing",
181 | "message": "Disable Multiplexing",
182 | "translation": "多重化を無効にする"
183 | },
184 | {
185 | "id": "Disable Compression",
186 | "message": "Disable Compression",
187 | "translation": "圧縮を無効化"
188 | },
189 | {
190 | "id": "Upload Speed Throttle",
191 | "message": "Upload Speed Throttle",
192 | "translation": "アップロード速度の制限"
193 | },
194 | {
195 | "id": "Debug",
196 | "message": "Debug",
197 | "translation": "デバッグ"
198 | }
199 | ]
200 | }
--------------------------------------------------------------------------------
/internal/translations/locales/ru-RU/out.gotext.json:
--------------------------------------------------------------------------------
1 | {
2 | "language": "ru-RU",
3 | "messages": [
4 | {
5 | "id": "License Info",
6 | "message": "License Info",
7 | "translation": "Лицензионная информация"
8 | },
9 | {
10 | "id": "About",
11 | "message": "About",
12 | "translation": "Это"
13 | },
14 | {
15 | "id": "Debug log:",
16 | "message": "Debug log:",
17 | "translation": "Журнал отладки:"
18 | },
19 | {
20 | "id": "Enter code to download",
21 | "message": "Enter code to download",
22 | "translation": "Секрет должен быть больше 5 знаков"
23 | },
24 | {
25 | "id": "Receive",
26 | "message": "Receive",
27 | "translation": "Беру"
28 | },
29 | {
30 | "id": "Receive Code",
31 | "message": "Receive Code",
32 | "translation": "Секрет"
33 | },
34 | {
35 | "id": "Download",
36 | "message": "Download",
37 | "translation": "Беру"
38 | },
39 | {
40 | "id": "Receiving file",
41 | "message": "Receiving file",
42 | "translation": "Получаю"
43 | },
44 | {
45 | "id": "Received",
46 | "message": "Received",
47 | "translation": "Получил"
48 | },
49 | {
50 | "id": "Pick a file to send",
51 | "message": "Pick a file to send",
52 | "translation": "Что послать"
53 | },
54 | {
55 | "id": "Send",
56 | "message": "Send",
57 | "translation": "Шлю"
58 | },
59 | {
60 | "id": "Sending file",
61 | "message": "Sending file",
62 | "translation": "Шлю"
63 | },
64 | {
65 | "id": "Sent file",
66 | "message": "Sent file",
67 | "translation": "Послал"
68 | },
69 | {
70 | "id": "Send cancelled.",
71 | "message": "Send cancelled.",
72 | "translation": "Отмена посылки."
73 | },
74 | {
75 | "id": "Cancel",
76 | "message": "Cancel",
77 | "translation": "Отменить"
78 | },
79 | {
80 | "id": "Send Code",
81 | "message": "Send Code",
82 | "translation": "Секрет"
83 | },
84 | {
85 | "id": "Enable Debug Log",
86 | "message": "Enable Debug Log",
87 | "translation": "Журналировать"
88 | },
89 | {
90 | "id": "Show / Hide",
91 | "message": "Show / Hide",
92 | "translation": "Вкл / Выкл"
93 | },
94 | {
95 | "id": "Settings",
96 | "message": "Settings",
97 | "translation": "Как"
98 | },
99 | {
100 | "id": "Appearance",
101 | "message": "Appearance",
102 | "translation": "Вид"
103 | },
104 | {
105 | "id": "Language",
106 | "message": "Language",
107 | "translation": "Язык"
108 | },
109 | {
110 | "id": "Theme",
111 | "message": "Theme",
112 | "translation": "Тема"
113 | },
114 | {
115 | "id": "Font",
116 | "message": "Font",
117 | "translation": "Шрифт"
118 | },
119 | {
120 | "id": "Logo",
121 | "message": "Logo",
122 | "translation": "Логотип"
123 | },
124 | {
125 | "id": "Relay",
126 | "message": "Relay",
127 | "translation": "Посредник"
128 | },
129 | {
130 | "id": "Address",
131 | "message": "Address",
132 | "translation": "Адрес"
133 | },
134 | {
135 | "id": "Ports",
136 | "message": "Ports",
137 | "translation": "Порты"
138 | },
139 | {
140 | "id": "Password",
141 | "message": "Password",
142 | "translation": "Пароль"
143 | },
144 | {
145 | "id": "Network Local",
146 | "message": "Network Local",
147 | "translation": "сеть"
148 | },
149 | {
150 | "id": "Disable Local",
151 | "message": "Disable Local",
152 | "translation": "Не локально"
153 | },
154 | {
155 | "id": "Force Local Only",
156 | "message": "Force Local Only",
157 | "translation": "Локально"
158 | },
159 | {
160 | "id": "Multicast Address",
161 | "message": "Multicast Address",
162 | "translation": "Группа"
163 | },
164 | {
165 | "id": "Transfer Options",
166 | "message": "Transfer Options",
167 | "translation": "Обмен"
168 | },
169 | {
170 | "id": "PAKE Curve",
171 | "message": "PAKE Curve",
172 | "translation": "Тип PAKE"
173 | },
174 | {
175 | "id": "Hash Algorithm",
176 | "message": "Hash Algorithm",
177 | "translation": "Тип хеша"
178 | },
179 | {
180 | "id": "Disable Multiplexing",
181 | "message": "Disable Multiplexing",
182 | "translation": "Без мультиплексирования"
183 | },
184 | {
185 | "id": "Disable Compression",
186 | "message": "Disable Compression",
187 | "translation": "Без сжатия"
188 | },
189 | {
190 | "id": "Upload Speed Throttle",
191 | "message": "Upload Speed Throttle",
192 | "translation": "Медлить"
193 | },
194 | {
195 | "id": "Debug",
196 | "message": "Debug",
197 | "translation": "Отладка"
198 | }
199 | ]
200 | }
--------------------------------------------------------------------------------
/internal/translations/locales/tr-TR/out.gotext.json:
--------------------------------------------------------------------------------
1 | {
2 | "language": "tr-TR",
3 | "messages": [
4 | {
5 | "id": "License Info",
6 | "message": "License Info",
7 | "translation": "Lisans"
8 | },
9 | {
10 | "id": "About",
11 | "message": "About",
12 | "translation": "Hakkında"
13 | },
14 | {
15 | "id": "Debug log:",
16 | "message": "Debug log:",
17 | "translation": "Hata ayıklama günlüğü"
18 | },
19 | {
20 | "id": "Enter code to download",
21 | "message": "Enter code to download",
22 | "translation": "İndirmek için kodu girin"
23 | },
24 | {
25 | "id": "Receive",
26 | "message": "Receive",
27 | "translation": "Almak"
28 | },
29 | {
30 | "id": "Receive Code",
31 | "message": "Receive Code",
32 | "translation": "Kod al"
33 | },
34 | {
35 | "id": "Download",
36 | "message": "Download",
37 | "translation": "İndir"
38 | },
39 | {
40 | "id": "Receiving file",
41 | "message": "Receiving file",
42 | "translation": "Dosya alma"
43 | },
44 | {
45 | "id": "Received",
46 | "message": "Received",
47 | "translation": "Alınan"
48 | },
49 | {
50 | "id": "Pick a file to send",
51 | "message": "Pick a file to send",
52 | "translation": "Gönderilicek dosyayı seçin"
53 | },
54 | {
55 | "id": "Send",
56 | "message": "Send",
57 | "translation": "Gönder"
58 | },
59 | {
60 | "id": "Sending file",
61 | "message": "Sending file",
62 | "translation": "Dosya gönderiliyor"
63 | },
64 | {
65 | "id": "Sent file",
66 | "message": "Sent file",
67 | "translation": "Dosya gönderildi"
68 | },
69 | {
70 | "id": "Send cancelled.",
71 | "message": "Send cancelled.",
72 | "translation": "Gönderme iptal edildi"
73 | },
74 | {
75 | "id": "Cancel",
76 | "message": "Cancel",
77 | "translation": "İptal"
78 | },
79 | {
80 | "id": "Send Code",
81 | "message": "Send Code",
82 | "translation": "Kod gönder"
83 | },
84 | {
85 | "id": "Enable Debug Log",
86 | "message": "Enable Debug Log",
87 | "translation": "Hata ayıklama günlüğünü etkinleştir"
88 | },
89 | {
90 | "id": "Show / Hide",
91 | "message": "Show / Hide",
92 | "translation": ""
93 | },
94 | {
95 | "id": "Settings",
96 | "message": "Settings",
97 | "translation": "Ayarlar"
98 | },
99 | {
100 | "id": "Appearance",
101 | "message": "Appearance",
102 | "translation": "Görünüş"
103 | },
104 | {
105 | "id": "Language",
106 | "message": "Language",
107 | "translation": "Dil"
108 | },
109 | {
110 | "id": "Theme",
111 | "message": "Theme",
112 | "translation": "Tema"
113 | },
114 | {
115 | "id": "Font",
116 | "message": "Font",
117 | "translation": ""
118 | },
119 | {
120 | "id": "Logo",
121 | "message": "Logo",
122 | "translation": ""
123 | },
124 | {
125 | "id": "Relay",
126 | "message": "Relay",
127 | "translation": "Röle"
128 | },
129 | {
130 | "id": "Address",
131 | "message": "Address",
132 | "translation": "Adres"
133 | },
134 | {
135 | "id": "Ports",
136 | "message": "Ports",
137 | "translation": "Bağlantı noktası"
138 | },
139 | {
140 | "id": "Password",
141 | "message": "Password",
142 | "translation": "Şifre"
143 | },
144 | {
145 | "id": "Network Local",
146 | "message": "Network Local",
147 | "translation": "Yerel ağ"
148 | },
149 | {
150 | "id": "Disable Local",
151 | "message": "Disable Local",
152 | "translation": "Yerel devre dışı"
153 | },
154 | {
155 | "id": "Force Local Only",
156 | "message": "Force Local Only",
157 | "translation": "Yalnızca yerel olarak zorla"
158 | },
159 | {
160 | "id": "Multicast Address",
161 | "message": "Multicast Address",
162 | "translation": ""
163 | },
164 | {
165 | "id": "Transfer Options",
166 | "message": "Transfer Options",
167 | "translation": "Transfer seçenekleri"
168 | },
169 | {
170 | "id": "PAKE Curve",
171 | "message": "PAKE Curve",
172 | "translation": "PAKR eğrisi"
173 | },
174 | {
175 | "id": "Hash Algorithm",
176 | "message": "Hash Algorithm",
177 | "translation": "Karma algoritma"
178 | },
179 | {
180 | "id": "Disable Multiplexing",
181 | "message": "Disable Multiplexing",
182 | "translation": "Çoğullamayı devre dışı bırak"
183 | },
184 | {
185 | "id": "Disable Compression",
186 | "message": "Disable Compression",
187 | "translation": "Sıkıştırmayı devre dışı bırak"
188 | },
189 | {
190 | "id": "Upload Speed Throttle",
191 | "message": "Upload Speed Throttle",
192 | "translation": "Yükleme hızını kısma "
193 | },
194 | {
195 | "id": "Debug",
196 | "message": "Debug",
197 | "translation": "Hata ayıklama"
198 | }
199 | ]
200 | }
--------------------------------------------------------------------------------
/settings.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "embed"
5 | "strings"
6 |
7 | log "github.com/schollz/logger"
8 | "golang.org/x/text/language"
9 | "golang.org/x/text/message"
10 |
11 | "fyne.io/fyne/v2"
12 | "fyne.io/fyne/v2/container"
13 | "fyne.io/fyne/v2/data/binding"
14 | "fyne.io/fyne/v2/theme"
15 | "fyne.io/fyne/v2/widget"
16 | )
17 |
18 | //go:embed internal/fonts
19 | var fsFonts embed.FS
20 |
21 | func crocDebugMode() bool {
22 | switch fyne.CurrentApp().Preferences().String("debug-level") {
23 | case "trace", "debug":
24 | return true
25 | default:
26 | return false
27 | }
28 | }
29 |
30 | func crocDebugLevel() string {
31 | return fyne.CurrentApp().Preferences().String("debug-level")
32 | }
33 |
34 | var debugObjects []fyne.CanvasObject
35 |
36 | func setDebugObjects() {
37 | debugging := crocDebugMode()
38 | for _, obj := range debugObjects {
39 | if debugging {
40 | obj.Show()
41 | } else {
42 | obj.Hide()
43 | }
44 | }
45 | }
46 |
47 | func settingsTabItem(a fyne.App, w fyne.Window) *container.TabItem {
48 | langBinding := binding.BindPreferenceString("lang", a.Preferences())
49 | langSelect := widget.NewSelect([]string{"en-US", "ja-JP", "ru-RU", "tr-TR", "zh-CN", "zh-HK", "zh-TW"}, func(selection string) {
50 | langBinding.Set(selection)
51 | if langCode != selection {
52 | langCode = selection
53 | lang := language.MustParse(selection)
54 | langPrinter = message.NewPrinter(lang)
55 | refreshWindow(a, w, 2)
56 | }
57 | })
58 | currentLang, _ := langBinding.Get()
59 | langSelect.SetSelected(currentLang)
60 |
61 | themeBinding := binding.BindPreferenceString("theme", a.Preferences())
62 | themeSelect := widget.NewSelect([]string{"system", "light", "grey", "dark", "black"}, func(selection string) {
63 | setThemeColor(selection)
64 | if currentTheme, _ := themeBinding.Get(); currentTheme != selection {
65 | themeBinding.Set(selection)
66 | a.Settings().SetTheme(appTheme)
67 | refreshWindow(a, w, 2)
68 | }
69 | })
70 | currentTheme, _ := themeBinding.Get()
71 | themeSelect.SetSelected(currentTheme)
72 |
73 | // Get list of embedded fonts
74 | fontSelections := []string{"default"}
75 | fontEntries, _ := fsFonts.ReadDir("internal/fonts")
76 | for _, fe := range fontEntries {
77 | // FiraCode-Regular.ttf -> FiraCode
78 | if fbase, _, split := strings.Cut(fe.Name(), "-"); split {
79 | found := false
80 | for _, fs := range fontSelections {
81 | if fs == fbase {
82 | found = true
83 | break
84 | }
85 | }
86 | if !found {
87 | fontSelections = append(fontSelections, fbase)
88 | }
89 | }
90 | }
91 |
92 | fontBinding := binding.BindPreferenceString("font", a.Preferences())
93 | fontSelect := widget.NewSelect(fontSelections, func(selection string) {
94 | appTheme.fontName = selection
95 | if currentFont, _ := fontBinding.Get(); currentFont != selection {
96 | fontBinding.Set(selection)
97 | a.Settings().SetTheme(appTheme)
98 | refreshWindow(a, w, 2)
99 | }
100 | })
101 | currentFont, _ := fontBinding.Get()
102 | fontSelect.SetSelected(currentFont)
103 |
104 | curveBinding := binding.BindPreferenceString("pake-curve", a.Preferences())
105 | curveSelect := widget.NewSelect([]string{"ed25519", "siec", "p256", "p348", "p521"}, func(selection string) {
106 | curveBinding.Set(selection)
107 | })
108 | currentCurve, _ := curveBinding.Get()
109 | curveSelect.SetSelected(currentCurve)
110 |
111 | hashBinding := binding.BindPreferenceString("croc-hash", a.Preferences())
112 | hashSelect := widget.NewSelect([]string{"imohash", "md5", "xxhash", "highway"}, func(selection string) {
113 | hashBinding.Set(selection)
114 | })
115 | currentHash, _ := hashBinding.Get()
116 | hashSelect.SetSelected(currentHash)
117 |
118 | debugLevelBinding := binding.BindPreferenceString("debug-level", a.Preferences())
119 | debugCheck := widget.NewCheck(lp("Enable Debug Log"), func(debug bool) {
120 | if debug {
121 | log.SetLevel("trace")
122 | debugLevelBinding.Set("trace")
123 | } else {
124 | log.SetLevel("error")
125 | debugLevelBinding.Set("error")
126 | }
127 | setDebugObjects()
128 | })
129 | debugCheck.SetChecked(crocDebugMode())
130 |
131 | hideLogoBinding := binding.BindPreferenceBool("hide-logo", a.Preferences())
132 | toggleLogo := widget.NewButton(lp("Show / Hide"), func() {
133 | hideLogo, _ := hideLogoBinding.Get()
134 | hideLogoBinding.Set(!hideLogo)
135 | refreshWindow(a, w, 2)
136 | })
137 |
138 | return container.NewTabItemWithIcon(lp("Settings"), theme.SettingsIcon(), container.NewVScroll(container.NewVBox(
139 | widget.NewLabelWithStyle(lp("Appearance"), fyne.TextAlignLeading, fyne.TextStyle{Bold: true}),
140 | widget.NewForm(
141 | widget.NewFormItem(lp("Language"), langSelect),
142 | widget.NewFormItem(lp("Theme"), themeSelect),
143 | widget.NewFormItem(lp("Font"), fontSelect),
144 | widget.NewFormItem(lp("Logo"), toggleLogo),
145 | ),
146 | widget.NewSeparator(),
147 | widget.NewLabelWithStyle(lp("Relay"), fyne.TextAlignLeading, fyne.TextStyle{Bold: true}),
148 | widget.NewForm(
149 | widget.NewFormItem(lp("Address"), widget.NewEntryWithData(binding.BindPreferenceString("relay-address", a.Preferences()))),
150 | widget.NewFormItem(lp("Ports"), widget.NewEntryWithData(binding.BindPreferenceString("relay-ports", a.Preferences()))),
151 | widget.NewFormItem(lp("Password"), widget.NewEntryWithData(binding.BindPreferenceString("relay-password", a.Preferences()))),
152 | ),
153 | widget.NewSeparator(),
154 | widget.NewLabelWithStyle(lp("Network Local"), fyne.TextAlignLeading, fyne.TextStyle{Bold: true}),
155 | widget.NewForm(
156 | widget.NewFormItem("", widget.NewCheckWithData(lp("Disable Local"), binding.BindPreferenceBool("disable-local", a.Preferences()))),
157 | widget.NewFormItem("", widget.NewCheckWithData(lp("Force Local Only"), binding.BindPreferenceBool("force-local", a.Preferences()))),
158 | widget.NewFormItem(lp("Multicast Address"), widget.NewEntryWithData(binding.BindPreferenceString("multicast-address", a.Preferences()))),
159 | ),
160 | widget.NewSeparator(),
161 | widget.NewLabelWithStyle(lp("Transfer Options"), fyne.TextAlignLeading, fyne.TextStyle{Bold: true}),
162 | widget.NewForm(
163 | widget.NewFormItem(lp("PAKE Curve"), curveSelect),
164 | widget.NewFormItem(lp("Hash Algorithm"), hashSelect),
165 | widget.NewFormItem("", widget.NewCheckWithData(lp("Disable Multiplexing"), binding.BindPreferenceBool("disable-multiplexing", a.Preferences()))),
166 | widget.NewFormItem("", widget.NewCheckWithData(lp("Disable Compression"), binding.BindPreferenceBool("disable-compression", a.Preferences()))),
167 | widget.NewFormItem(lp("Upload Speed Throttle"), widget.NewEntryWithData(binding.BindPreferenceString("upload-throttle", a.Preferences()))),
168 | ),
169 | widget.NewSeparator(),
170 | widget.NewLabelWithStyle(lp("Debug"), fyne.TextAlignLeading, fyne.TextStyle{Bold: true}),
171 | widget.NewForm(
172 | widget.NewFormItem("", debugCheck),
173 | ),
174 | )))
175 | }
176 |
--------------------------------------------------------------------------------
/internal/translations/locales/ru-RU/messages.gotext.json:
--------------------------------------------------------------------------------
1 | {
2 | "language": "ru-RU",
3 | "messages": [
4 | {
5 | "id": "License Info",
6 | "message": "License Info",
7 | "translation": "Лицензионная информация"
8 | },
9 | {
10 | "id": "About",
11 | "message": "About",
12 | "translation": "Это"
13 | },
14 | {
15 | "id": "Enter code to download",
16 | "message": "Enter code to download",
17 | "translation": "Секрет должен быть больше 5 знаков"
18 | },
19 | {
20 | "id": "Debug log:",
21 | "message": "Debug log:",
22 | "translation": "Журнал отладки:"
23 | },
24 | {
25 | "id": "Export full log",
26 | "message": "Export full log",
27 | "translation": "Сохранить журнал"
28 | },
29 | {
30 | "id": "Saved all files to",
31 | "message": "Saved all files to",
32 | "translation": "Сохранил всё"
33 | },
34 | {
35 | "id": "Download",
36 | "message": "Download",
37 | "translation": "Беру"
38 | },
39 | {
40 | "id": "Save All",
41 | "message": "Save All",
42 | "translation": "Сохранить всё"
43 | },
44 | {
45 | "id": "Receive Code",
46 | "message": "Receive Code",
47 | "translation": "Секрет"
48 | },
49 | {
50 | "id": "Receiving file",
51 | "message": "Receiving file",
52 | "translation": "Получаю"
53 | },
54 | {
55 | "id": "Received",
56 | "message": "Received",
57 | "translation": "Получил"
58 | },
59 | {
60 | "id": "Receive cancelled.",
61 | "message": "Receive cancelled.",
62 | "translation": "Отмена получения."
63 | },
64 | {
65 | "id": "Cancel",
66 | "message": "Cancel",
67 | "translation": "Отменить"
68 | },
69 | {
70 | "id": "Delete All",
71 | "message": "Delete All",
72 | "translation": "Удалить всё"
73 | },
74 | {
75 | "id": "Are you sure you want to delete all received files?",
76 | "message": "Are you sure you want to delete all received files?",
77 | "translation": "Вы уверены что хотите удалить все полученные файлы?"
78 | },
79 | {
80 | "id": "Receive",
81 | "message": "Receive",
82 | "translation": "Беру"
83 | },
84 | {
85 | "id": "Pick a file to send",
86 | "message": "Pick a file to send",
87 | "translation": "Что послать"
88 | },
89 | {
90 | "id": "Send",
91 | "message": "Send",
92 | "translation": "Шлю"
93 | },
94 | {
95 | "id": "Sending file",
96 | "message": "Sending file",
97 | "translation": "Шлю"
98 | },
99 | {
100 | "id": "Sent file",
101 | "message": "Sent file",
102 | "translation": "Послал"
103 | },
104 | {
105 | "id": "Send cancelled.",
106 | "message": "Send cancelled.",
107 | "translation": "Отмена посылки."
108 | },
109 | {
110 | "id": "Send Code",
111 | "message": "Send Code",
112 | "translation": "Секрет"
113 | },
114 | {
115 | "id": "Enable Debug Log",
116 | "message": "Enable Debug Log",
117 | "translation": "Журналировать"
118 | },
119 | {
120 | "id": "Show / Hide",
121 | "message": "Show / Hide",
122 | "translation": "Вкл / Выкл"
123 | },
124 | {
125 | "id": "Settings",
126 | "message": "Settings",
127 | "translation": "Как"
128 | },
129 | {
130 | "id": "Appearance",
131 | "message": "Appearance",
132 | "translation": "Вид"
133 | },
134 | {
135 | "id": "Language",
136 | "message": "Language",
137 | "translation": "Язык"
138 | },
139 | {
140 | "id": "Theme",
141 | "message": "Theme",
142 | "translation": "Тема"
143 | },
144 | {
145 | "id": "Font",
146 | "message": "Font",
147 | "translation": "Шрифт"
148 | },
149 | {
150 | "id": "Logo",
151 | "message": "Logo",
152 | "translation": "Логотип"
153 | },
154 | {
155 | "id": "Relay",
156 | "message": "Relay",
157 | "translation": "Посредник"
158 | },
159 | {
160 | "id": "Address",
161 | "message": "Address",
162 | "translation": "Адрес"
163 | },
164 | {
165 | "id": "Ports",
166 | "message": "Ports",
167 | "translation": "Порты"
168 | },
169 | {
170 | "id": "Password",
171 | "message": "Password",
172 | "translation": "Пароль"
173 | },
174 | {
175 | "id": "Network Local",
176 | "message": "Network Local",
177 | "translation": "сеть"
178 | },
179 | {
180 | "id": "Disable Local",
181 | "message": "Disable Local",
182 | "translation": "Не локально"
183 | },
184 | {
185 | "id": "Force Local Only",
186 | "message": "Force Local Only",
187 | "translation": "Локально"
188 | },
189 | {
190 | "id": "Multicast Address",
191 | "message": "Multicast Address",
192 | "translation": "Группа"
193 | },
194 | {
195 | "id": "Transfer Options",
196 | "message": "Transfer Options",
197 | "translation": "Обмен"
198 | },
199 | {
200 | "id": "PAKE Curve",
201 | "message": "PAKE Curve",
202 | "translation": "Тип PAKE"
203 | },
204 | {
205 | "id": "Hash Algorithm",
206 | "message": "Hash Algorithm",
207 | "translation": "Тип хеша"
208 | },
209 | {
210 | "id": "Disable Multiplexing",
211 | "message": "Disable Multiplexing",
212 | "translation": "Без мультиплексирования"
213 | },
214 | {
215 | "id": "Disable Compression",
216 | "message": "Disable Compression",
217 | "translation": "Без сжатия"
218 | },
219 | {
220 | "id": "Upload Speed Throttle",
221 | "message": "Upload Speed Throttle",
222 | "translation": "Медлить"
223 | },
224 | {
225 | "id": "Debug",
226 | "message": "Debug",
227 | "translation": "Отладка"
228 | }
229 | ]
230 | }
231 |
--------------------------------------------------------------------------------
/recv.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "io"
6 | "os"
7 | "path/filepath"
8 | "strings"
9 | "time"
10 |
11 | "fyne.io/fyne/v2"
12 | "fyne.io/fyne/v2/container"
13 | "fyne.io/fyne/v2/dialog"
14 | "fyne.io/fyne/v2/layout"
15 | "fyne.io/fyne/v2/theme"
16 | "fyne.io/fyne/v2/widget"
17 | "github.com/schollz/croc/v10/src/croc"
18 | log "github.com/schollz/logger"
19 | )
20 |
21 | func recvTabItem(a fyne.App, w fyne.Window) *container.TabItem {
22 | status := widget.NewLabel("")
23 | defer func() {
24 | if r := recover(); r != nil {
25 | log.Error(fmt.Sprint(r))
26 | }
27 | }()
28 | prog := widget.NewProgressBar()
29 | prog.Hide()
30 |
31 | topline := widget.NewLabel(lp(""))
32 | recvEntry := widget.NewEntry()
33 | recvEntry.OnChanged = func(s string) {
34 | recvEntry.Text = strings.ReplaceAll(s, " ", "-")
35 | }
36 | recvEntry.SetPlaceHolder(lp("Enter code to download"))
37 |
38 | recvDir, _ := os.MkdirTemp("", "crocgui-recv")
39 |
40 | boxholder := container.NewVBox()
41 | receiverScroller := container.NewVScroll(boxholder)
42 | fileentries := make(map[string]*fyne.Container)
43 |
44 | debugBox := container.NewHBox(widget.NewLabel(lp("Debug log:")), layout.NewSpacer(), widget.NewButton("Export full log", func() {
45 | savedialog := dialog.NewFileSave(func(f fyne.URIWriteCloser, e error) {
46 | if f != nil {
47 | logoutput.buf.WriteTo(f)
48 | f.Close()
49 | }
50 | }, w)
51 | savedialog.SetFileName("crocdebuglog.txt")
52 | savedialog.Resize(w.Canvas().Size())
53 | savedialog.Show()
54 | }))
55 | debugObjects = append(debugObjects, debugBox)
56 |
57 | cancelchan := make(chan bool)
58 | activeButtonHolder := container.NewVBox()
59 | var cancelButton, receiveButton *widget.Button
60 |
61 | deleteAllFiles := func() {
62 | for fpath, fe := range fileentries {
63 | boxholder.Remove(fe)
64 | os.Remove(fpath)
65 | log.Tracef("Removed received file: %s", fpath)
66 | delete(fileentries, fpath)
67 | }
68 | }
69 |
70 | resetReceiver := func() {
71 | prog.Hide()
72 | prog.SetValue(0)
73 | for _, obj := range activeButtonHolder.Objects {
74 | activeButtonHolder.Remove(obj)
75 | }
76 | activeButtonHolder.Add(receiveButton)
77 |
78 | topline.SetText(lp("Enter code to download"))
79 | recvEntry.Enable()
80 | }
81 |
82 | receiveButton = widget.NewButtonWithIcon(lp("Download"), theme.DownloadIcon(), func() {
83 | if len(fileentries) > 0 {
84 | log.Error("deleting previous files")
85 | fyne.Do(deleteAllFiles)
86 | }
87 |
88 | receiver, err := croc.New(croc.Options{
89 | IsSender: false,
90 | SharedSecret: recvEntry.Text,
91 | Debug: crocDebugMode(),
92 | RelayAddress: a.Preferences().String("relay-address"),
93 | RelayPorts: strings.Split(a.Preferences().String("relay-ports"), ","),
94 | RelayPassword: a.Preferences().String("relay-password"),
95 | Stdout: false,
96 | NoPrompt: true,
97 | DisableLocal: a.Preferences().Bool("disable-local"),
98 | NoMultiplexing: a.Preferences().Bool("disable-multiplexing"),
99 | OnlyLocal: a.Preferences().Bool("force-local"),
100 | NoCompress: a.Preferences().Bool("disable-compression"),
101 | Curve: a.Preferences().String("pake-curve"),
102 | HashAlgorithm: a.Preferences().String("croc-hash"),
103 | Overwrite: true,
104 | ZipFolder: false,
105 | GitIgnore: false,
106 | MulticastAddress: a.Preferences().String("multicast-address"),
107 | })
108 | if err != nil {
109 | log.Errorf("Receive setup error: %s\n", err.Error())
110 | return
111 | }
112 | log.SetLevel(crocDebugLevel())
113 | log.Trace("croc receiver created")
114 | cderr := os.Chdir(recvDir)
115 | if cderr != nil {
116 | log.Error("Unable to change to dir:", recvDir, cderr)
117 | }
118 | log.Trace("cd", recvDir)
119 |
120 | var filename string
121 | status.SetText(fmt.Sprintf("%s: %s", lp("Receive Code"), recvEntry.Text))
122 | prog.Show()
123 |
124 | for _, obj := range activeButtonHolder.Objects {
125 | activeButtonHolder.Remove(obj)
126 | }
127 | activeButtonHolder.Add(cancelButton)
128 |
129 | donechan := make(chan bool)
130 | go func() {
131 | ticker := time.NewTicker(time.Millisecond * 100)
132 | for {
133 | select {
134 | case <-ticker.C:
135 | if receiver.Step2FileInfoTransferred {
136 | cnum := receiver.FilesToTransferCurrentNum
137 | fi := receiver.FilesToTransfer[cnum]
138 | filename = filepath.Base(fi.Name)
139 | fyne.Do(func() {
140 | topline.SetText(fmt.Sprintf("%s: %s(%d/%d)", lp("Receiving file"), filename, cnum+1, len(receiver.FilesToTransfer)))
141 | prog.Max = float64(fi.Size)
142 | prog.SetValue(float64(receiver.TotalSent))
143 | })
144 | }
145 | case <-donechan:
146 | ticker.Stop()
147 | return
148 | }
149 | }
150 | }()
151 |
152 | go func() {
153 | fyne.Do(recvEntry.Disable)
154 | ferr := receiver.Receive()
155 | donechan <- true
156 | if ferr != nil {
157 | log.Errorf("Receive failed: %s\n", ferr)
158 | } else {
159 | fyne.Do(func() {
160 | status.SetText(fmt.Sprintf("%s: %s", lp("Received"), filename))
161 |
162 | for _, fi := range receiver.FilesToTransfer {
163 | fpath := filepath.Join(recvDir, filepath.Base(fi.Name))
164 | labelFile := widget.NewLabel(filepath.Base(fpath))
165 |
166 | openButton := widget.NewButtonWithIcon("", theme.DocumentSaveIcon(), func() {
167 | ShowFileLocation(fpath, w)
168 | })
169 |
170 | deleteButton := widget.NewButtonWithIcon("", theme.CancelIcon(), func() {
171 | if fe, ok := fileentries[fpath]; ok {
172 | boxholder.Remove(fe)
173 | os.Remove(fpath)
174 | log.Tracef("Removed received file: %s", fpath)
175 | delete(fileentries, fpath)
176 | }
177 | })
178 |
179 | newentry := container.NewHBox(
180 | labelFile,
181 | layout.NewSpacer(),
182 | openButton,
183 | deleteButton,
184 | )
185 | fileentries[fpath] = newentry
186 | boxholder.Add(newentry)
187 | }
188 | })
189 | }
190 | fyne.Do(resetReceiver)
191 | }()
192 |
193 | go func() {
194 | select {
195 | case <-cancelchan:
196 | receiver.SuccessfulTransfer = true
197 | donechan <- true
198 | fyne.Do(func() {
199 | status.SetText(lp("Receive cancelled."))
200 | })
201 | }
202 | fyne.Do(resetReceiver)
203 | }()
204 | })
205 |
206 | cancelButton = widget.NewButtonWithIcon(lp("Cancel"), theme.CancelIcon(), func() {
207 | cancelchan <- true
208 | })
209 |
210 | activeButtonHolder.Add(receiveButton)
211 |
212 | receiveTop := container.NewVBox(
213 | container.NewHBox(topline, layout.NewSpacer()),
214 | widget.NewForm(&widget.FormItem{Text: lp("Receive Code"), Widget: recvEntry, HintText: "Spaces ( ) become dash (-)"}),
215 | )
216 | receiveBot := container.NewVBox(
217 | activeButtonHolder,
218 | prog,
219 | container.NewHBox(status),
220 | debugBox,
221 | )
222 |
223 | return container.NewTabItemWithIcon(lp("Receive"), theme.DownloadIcon(),
224 | container.NewBorder(receiveTop, receiveBot, nil, nil, receiverScroller))
225 | }
226 |
227 | func ShowFileLocation(path string, parent fyne.Window) {
228 | savedialog := dialog.NewFileSave(func(f fyne.URIWriteCloser, e error) {
229 | if f != nil {
230 | src, err := os.Open(path)
231 | if err != nil {
232 | log.Error(err)
233 | return
234 | }
235 | defer src.Close()
236 |
237 | _, err = io.Copy(f, src)
238 | if err != nil {
239 | log.Error(err)
240 | }
241 | f.Close()
242 | }
243 | }, parent)
244 | savedialog.SetFileName(filepath.Base(path))
245 | savedialog.Resize(parent.Canvas().Size())
246 | savedialog.Show()
247 | }
248 |
--------------------------------------------------------------------------------
/send.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "io"
6 | "os"
7 | "path/filepath"
8 | "strings"
9 | "time"
10 |
11 | log "github.com/schollz/logger"
12 |
13 | "fyne.io/fyne/v2"
14 | "fyne.io/fyne/v2/container"
15 | "fyne.io/fyne/v2/dialog"
16 | "fyne.io/fyne/v2/layout"
17 | "fyne.io/fyne/v2/theme"
18 | "fyne.io/fyne/v2/widget"
19 | "github.com/schollz/croc/v10/src/croc"
20 | "github.com/schollz/croc/v10/src/utils"
21 | )
22 |
23 | func sendTabItem(a fyne.App, w fyne.Window) *container.TabItem {
24 | status := widget.NewLabel("")
25 | defer func() {
26 | if r := recover(); r != nil {
27 | log.Error(fmt.Sprint(r))
28 | }
29 | }()
30 | prog := widget.NewProgressBar()
31 | prog.Hide()
32 | topline := widget.NewLabel(lp("Pick a file to send"))
33 | randomCode := utils.GetRandomName()
34 | sendEntry := widget.NewEntry()
35 | sendEntry.SetText(randomCode)
36 | copyCodeButton := widget.NewButtonWithIcon("", theme.ContentCopyIcon(), func() {
37 | w.Clipboard().SetContent(sendEntry.Text)
38 | })
39 | copyCodeButton.Hide()
40 |
41 | sendDir, _ := os.MkdirTemp("", "crocgui-send")
42 |
43 | boxholder := container.NewVBox()
44 | senderScroller := container.NewVScroll(boxholder)
45 | fileentries := make(map[string]*fyne.Container)
46 |
47 | addFileButton := widget.NewButtonWithIcon("", theme.FileIcon(), func() {
48 | dialog.ShowFileOpen(func(f fyne.URIReadCloser, e error) {
49 | if e != nil {
50 | log.Errorf("Open dialog error: %s", e.Error())
51 | return
52 | }
53 | if f != nil {
54 | nfile, oerr := os.Create(filepath.Join(sendDir, f.URI().Name()))
55 | if oerr != nil {
56 | log.Errorf("Unable to copy file, error: %s - %s\n", sendDir, oerr.Error())
57 | return
58 | }
59 | io.Copy(nfile, f)
60 | nfile.Close()
61 | fpath := nfile.Name()
62 | log.Tracef("Android URI (%s), copied to internal cache %s", f.URI().String(), nfile.Name())
63 |
64 | _, sterr := os.Stat(fpath)
65 | if sterr != nil {
66 | log.Errorf("Stat error: %s - %s\n", fpath, sterr.Error())
67 | return
68 | }
69 | labelFile := widget.NewLabel(filepath.Base(fpath))
70 | newentry := container.NewHBox(labelFile, layout.NewSpacer(), widget.NewButtonWithIcon("", theme.CancelIcon(), func() {
71 | // Can only add/remove if not currently attempting a send
72 | if !sendEntry.Disabled() {
73 | if fe, ok := fileentries[fpath]; ok {
74 | boxholder.Remove(fe)
75 | os.Remove(fpath)
76 | log.Tracef("Removed file from internal cache: %s", fpath)
77 | delete(fileentries, fpath)
78 | }
79 | }
80 | }))
81 | fileentries[fpath] = newentry
82 | boxholder.Add(newentry)
83 | }
84 | }, w)
85 | })
86 |
87 | debugBox := container.NewHBox(widget.NewLabel(lp("Debug log:")), layout.NewSpacer(), widget.NewButton("Export full log", func() {
88 | savedialog := dialog.NewFileSave(func(f fyne.URIWriteCloser, e error) {
89 | if f != nil {
90 | logoutput.buf.WriteTo(f)
91 | f.Close()
92 | }
93 | }, w)
94 | savedialog.SetFileName("crocdebuglog.txt")
95 | savedialog.Show()
96 | }))
97 | debugObjects = append(debugObjects, debugBox)
98 |
99 | cancelchan := make(chan bool)
100 | activeButtonHolder := container.NewVBox()
101 | var cancelButton, sendButton *widget.Button
102 |
103 | resetSender := func() {
104 | prog.Hide()
105 | prog.SetValue(0)
106 | for _, obj := range activeButtonHolder.Objects {
107 | activeButtonHolder.Remove(obj)
108 | }
109 | activeButtonHolder.Add(sendButton)
110 |
111 | for fpath, fe := range fileentries {
112 | boxholder.Remove(fe)
113 | os.Remove(fpath)
114 | log.Tracef("Removed file from internal cache: %s", fpath)
115 | delete(fileentries, fpath)
116 | }
117 |
118 | topline.SetText(lp("Pick a file to send"))
119 | addFileButton.Show()
120 | if sendEntry.Text == randomCode {
121 | randomCode = utils.GetRandomName()
122 | sendEntry.SetText(randomCode)
123 | }
124 | copyCodeButton.Hide()
125 | sendEntry.Enable()
126 | }
127 |
128 | sendButton = widget.NewButtonWithIcon(lp("Send"), theme.MailSendIcon(), func() {
129 | // Only send if files selected
130 | if len(fileentries) < 1 {
131 | log.Error("no files selected")
132 | return
133 | }
134 |
135 | addFileButton.Hide()
136 | sender, err := croc.New(croc.Options{
137 | IsSender: true,
138 | SharedSecret: sendEntry.Text,
139 | Debug: crocDebugMode(),
140 | RelayAddress: a.Preferences().String("relay-address"),
141 | RelayPorts: strings.Split(a.Preferences().String("relay-ports"), ","),
142 | RelayPassword: a.Preferences().String("relay-password"),
143 | Stdout: false,
144 | NoPrompt: true,
145 | DisableLocal: a.Preferences().Bool("disable-local"),
146 | NoMultiplexing: a.Preferences().Bool("disable-multiplexing"),
147 | OnlyLocal: a.Preferences().Bool("force-local"),
148 | NoCompress: a.Preferences().Bool("disable-compression"),
149 | Curve: a.Preferences().String("pake-curve"),
150 | HashAlgorithm: a.Preferences().String("croc-hash"),
151 | ThrottleUpload: a.Preferences().String("upload-throttle"),
152 | ZipFolder: false,
153 | GitIgnore: false,
154 | MulticastAddress: a.Preferences().String("multicast-address"),
155 | Exclude: []string{},
156 | })
157 | if err != nil {
158 | log.Errorf("croc error: %s\n", err.Error())
159 | return
160 | }
161 | log.SetLevel(crocDebugLevel())
162 | log.Trace("croc sender created")
163 |
164 | var filename string
165 | status.SetText(fmt.Sprintf("%s: %s", lp("Receive Code"), sendEntry.Text))
166 | copyCodeButton.Show()
167 | prog.Show()
168 |
169 | for _, obj := range activeButtonHolder.Objects {
170 | activeButtonHolder.Remove(obj)
171 | }
172 | activeButtonHolder.Add(cancelButton)
173 |
174 | donechan := make(chan bool)
175 | sendnames := make(map[string]int)
176 | go func() {
177 | ticker := time.NewTicker(time.Millisecond * 100)
178 | for {
179 | select {
180 | case <-ticker.C:
181 | if sender.Step2FileInfoTransferred {
182 | cnum := sender.FilesToTransferCurrentNum
183 | fi := sender.FilesToTransfer[cnum]
184 | filename = filepath.Base(fi.Name)
185 | sendnames[filename] = cnum
186 | topline.SetText(fmt.Sprintf("%s: %s (%d/%d)", lp("Sending file"), filename, cnum+1, len(sender.FilesToTransfer)))
187 | prog.Max = float64(fi.Size)
188 | prog.SetValue(float64(sender.TotalSent))
189 | }
190 | case <-donechan:
191 | ticker.Stop()
192 | return
193 | }
194 | }
195 | }()
196 | go func() {
197 | var filepaths []string
198 | for fpath := range fileentries {
199 | filepaths = append(filepaths, fpath)
200 | }
201 | fyne.Do(sendEntry.Disable)
202 | fi, emptyfolders, numFolders, ferr := croc.GetFilesInfo(filepaths, false, false, []string{})
203 | if ferr != nil {
204 | log.Errorf("file info failed: %s\n", ferr)
205 | }
206 | serr := sender.Send(fi, emptyfolders, numFolders)
207 | donechan <- true
208 | if serr != nil {
209 | log.Errorf("Send failed: %s\n", serr)
210 | } else {
211 | status.SetText(fmt.Sprintf("%s %s", lp("Sent file"), filename))
212 | }
213 | resetSender()
214 | }()
215 | go func() {
216 | select {
217 | case <-cancelchan:
218 | donechan <- true
219 | status.SetText(lp("Send cancelled."))
220 | }
221 | resetSender()
222 | }()
223 | })
224 |
225 | cancelButton = widget.NewButtonWithIcon(lp("Cancel"), theme.CancelIcon(), func() {
226 | cancelchan <- true
227 | })
228 |
229 | activeButtonHolder.Add(sendButton)
230 |
231 | sendTop := container.NewVBox(
232 | container.NewHBox(topline, layout.NewSpacer(), addFileButton),
233 | widget.NewForm(&widget.FormItem{Text: lp("Send Code"), Widget: sendEntry}),
234 | )
235 | sendBot := container.NewVBox(
236 | activeButtonHolder,
237 | prog,
238 | container.NewHBox(status, copyCodeButton),
239 | debugBox,
240 | )
241 |
242 | return container.NewTabItemWithIcon(lp("Send"), theme.MailSendIcon(),
243 | container.NewBorder(sendTop, sendBot, nil, nil, senderScroller))
244 | }
245 |
--------------------------------------------------------------------------------
/internal/translations/locales/en-US/out.gotext.json:
--------------------------------------------------------------------------------
1 | {
2 | "language": "en-US",
3 | "messages": [
4 | {
5 | "id": "License Info",
6 | "message": "License Info",
7 | "translation": "License Info",
8 | "translatorComment": "Copied from source.",
9 | "fuzzy": true
10 | },
11 | {
12 | "id": "About",
13 | "message": "About",
14 | "translation": "About",
15 | "translatorComment": "Copied from source.",
16 | "fuzzy": true
17 | },
18 | {
19 | "id": "Debug log:",
20 | "message": "Debug log:",
21 | "translation": "Debug log:",
22 | "translatorComment": "Copied from source.",
23 | "fuzzy": true
24 | },
25 | {
26 | "id": "Enter code to download",
27 | "message": "Enter code to download",
28 | "translation": "Enter code to download",
29 | "translatorComment": "Copied from source.",
30 | "fuzzy": true
31 | },
32 | {
33 | "id": "Receive",
34 | "message": "Receive",
35 | "translation": "Receive",
36 | "translatorComment": "Copied from source.",
37 | "fuzzy": true
38 | },
39 | {
40 | "id": "Receive Code",
41 | "message": "Receive Code",
42 | "translation": "Receive Code",
43 | "translatorComment": "Copied from source.",
44 | "fuzzy": true
45 | },
46 | {
47 | "id": "Download",
48 | "message": "Download",
49 | "translation": "Download",
50 | "translatorComment": "Copied from source.",
51 | "fuzzy": true
52 | },
53 | {
54 | "id": "Receiving file",
55 | "message": "Receiving file",
56 | "translation": "Receiving file",
57 | "translatorComment": "Copied from source.",
58 | "fuzzy": true
59 | },
60 | {
61 | "id": "Received",
62 | "message": "Received",
63 | "translation": "Received",
64 | "translatorComment": "Copied from source.",
65 | "fuzzy": true
66 | },
67 | {
68 | "id": "Pick a file to send",
69 | "message": "Pick a file to send",
70 | "translation": "Pick a file to send",
71 | "translatorComment": "Copied from source.",
72 | "fuzzy": true
73 | },
74 | {
75 | "id": "Send",
76 | "message": "Send",
77 | "translation": "Send",
78 | "translatorComment": "Copied from source.",
79 | "fuzzy": true
80 | },
81 | {
82 | "id": "Sending file",
83 | "message": "Sending file",
84 | "translation": "Sending file",
85 | "translatorComment": "Copied from source.",
86 | "fuzzy": true
87 | },
88 | {
89 | "id": "Sent file",
90 | "message": "Sent file",
91 | "translation": "Sent file",
92 | "translatorComment": "Copied from source.",
93 | "fuzzy": true
94 | },
95 | {
96 | "id": "Send cancelled.",
97 | "message": "Send cancelled.",
98 | "translation": "Send cancelled.",
99 | "translatorComment": "Copied from source.",
100 | "fuzzy": true
101 | },
102 | {
103 | "id": "Cancel",
104 | "message": "Cancel",
105 | "translation": "Cancel",
106 | "translatorComment": "Copied from source.",
107 | "fuzzy": true
108 | },
109 | {
110 | "id": "Send Code",
111 | "message": "Send Code",
112 | "translation": "Send Code",
113 | "translatorComment": "Copied from source.",
114 | "fuzzy": true
115 | },
116 | {
117 | "id": "Enable Debug Log",
118 | "message": "Enable Debug Log",
119 | "translation": "Enable Debug Log",
120 | "translatorComment": "Copied from source.",
121 | "fuzzy": true
122 | },
123 | {
124 | "id": "Show / Hide",
125 | "message": "Show / Hide",
126 | "translation": "Show / Hide",
127 | "translatorComment": "Copied from source.",
128 | "fuzzy": true
129 | },
130 | {
131 | "id": "Settings",
132 | "message": "Settings",
133 | "translation": "Settings",
134 | "translatorComment": "Copied from source.",
135 | "fuzzy": true
136 | },
137 | {
138 | "id": "Appearance",
139 | "message": "Appearance",
140 | "translation": "Appearance",
141 | "translatorComment": "Copied from source.",
142 | "fuzzy": true
143 | },
144 | {
145 | "id": "Language",
146 | "message": "Language",
147 | "translation": "Language",
148 | "translatorComment": "Copied from source.",
149 | "fuzzy": true
150 | },
151 | {
152 | "id": "Theme",
153 | "message": "Theme",
154 | "translation": "Theme",
155 | "translatorComment": "Copied from source.",
156 | "fuzzy": true
157 | },
158 | {
159 | "id": "Font",
160 | "message": "Font",
161 | "translation": "Font",
162 | "translatorComment": "Copied from source.",
163 | "fuzzy": true
164 | },
165 | {
166 | "id": "Logo",
167 | "message": "Logo",
168 | "translation": "Logo",
169 | "translatorComment": "Copied from source.",
170 | "fuzzy": true
171 | },
172 | {
173 | "id": "Relay",
174 | "message": "Relay",
175 | "translation": "Relay",
176 | "translatorComment": "Copied from source.",
177 | "fuzzy": true
178 | },
179 | {
180 | "id": "Address",
181 | "message": "Address",
182 | "translation": "Address",
183 | "translatorComment": "Copied from source.",
184 | "fuzzy": true
185 | },
186 | {
187 | "id": "Ports",
188 | "message": "Ports",
189 | "translation": "Ports",
190 | "translatorComment": "Copied from source.",
191 | "fuzzy": true
192 | },
193 | {
194 | "id": "Password",
195 | "message": "Password",
196 | "translation": "Password",
197 | "translatorComment": "Copied from source.",
198 | "fuzzy": true
199 | },
200 | {
201 | "id": "Network Local",
202 | "message": "Network Local",
203 | "translation": "Network Local",
204 | "translatorComment": "Copied from source.",
205 | "fuzzy": true
206 | },
207 | {
208 | "id": "Disable Local",
209 | "message": "Disable Local",
210 | "translation": "Disable Local",
211 | "translatorComment": "Copied from source.",
212 | "fuzzy": true
213 | },
214 | {
215 | "id": "Force Local Only",
216 | "message": "Force Local Only",
217 | "translation": "Force Local Only",
218 | "translatorComment": "Copied from source.",
219 | "fuzzy": true
220 | },
221 | {
222 | "id": "Multicast Address",
223 | "message": "Multicast Address",
224 | "translation": "Multicast Address",
225 | "translatorComment": "Copied from source.",
226 | "fuzzy": true
227 | },
228 | {
229 | "id": "Transfer Options",
230 | "message": "Transfer Options",
231 | "translation": "Transfer Options",
232 | "translatorComment": "Copied from source.",
233 | "fuzzy": true
234 | },
235 | {
236 | "id": "PAKE Curve",
237 | "message": "PAKE Curve",
238 | "translation": "PAKE Curve",
239 | "translatorComment": "Copied from source.",
240 | "fuzzy": true
241 | },
242 | {
243 | "id": "Hash Algorithm",
244 | "message": "Hash Algorithm",
245 | "translation": "Hash Algorithm",
246 | "translatorComment": "Copied from source.",
247 | "fuzzy": true
248 | },
249 | {
250 | "id": "Disable Multiplexing",
251 | "message": "Disable Multiplexing",
252 | "translation": "Disable Multiplexing",
253 | "translatorComment": "Copied from source.",
254 | "fuzzy": true
255 | },
256 | {
257 | "id": "Disable Compression",
258 | "message": "Disable Compression",
259 | "translation": "Disable Compression",
260 | "translatorComment": "Copied from source.",
261 | "fuzzy": true
262 | },
263 | {
264 | "id": "Upload Speed Throttle",
265 | "message": "Upload Speed Throttle",
266 | "translation": "Upload Speed Throttle",
267 | "translatorComment": "Copied from source.",
268 | "fuzzy": true
269 | },
270 | {
271 | "id": "Debug",
272 | "message": "Debug",
273 | "translation": "Debug",
274 | "translatorComment": "Copied from source.",
275 | "fuzzy": true
276 | }
277 | ]
278 | }
--------------------------------------------------------------------------------
/internal/translations/catalog.go:
--------------------------------------------------------------------------------
1 | // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
2 |
3 | package translations
4 |
5 | import (
6 | "golang.org/x/text/language"
7 | "golang.org/x/text/message"
8 | "golang.org/x/text/message/catalog"
9 | )
10 |
11 | type dictionary struct {
12 | index []uint32
13 | data string
14 | }
15 |
16 | func (d *dictionary) Lookup(key string) (data string, ok bool) {
17 | p, ok := messageKeyToIndex[key]
18 | if !ok {
19 | return "", false
20 | }
21 | start, end := d.index[p], d.index[p+1]
22 | if start == end {
23 | return "", false
24 | }
25 | return d.data[start:end], true
26 | }
27 |
28 | func init() {
29 | dict := map[string]catalog.Dictionary{
30 | "en_US": &dictionary{index: en_USIndex, data: en_USData},
31 | "ja_JP": &dictionary{index: ja_JPIndex, data: ja_JPData},
32 | "ru_RU": &dictionary{index: ru_RUIndex, data: ru_RUData},
33 | "tr_TR": &dictionary{index: tr_TRIndex, data: tr_TRData},
34 | "zh_CN": &dictionary{index: zh_CNIndex, data: zh_CNData},
35 | "zh_HK": &dictionary{index: zh_HKIndex, data: zh_HKData},
36 | "zh_TW": &dictionary{index: zh_TWIndex, data: zh_TWData},
37 | }
38 | fallback := language.MustParse("en-US")
39 | cat, err := catalog.NewFromMap(dict, catalog.Fallback(fallback))
40 | if err != nil {
41 | panic(err)
42 | }
43 | message.DefaultCatalog = cat
44 | }
45 |
46 | var messageKeyToIndex = map[string]int{
47 | "About": 1,
48 | "Address": 25,
49 | "Appearance": 19,
50 | "Cancel": 14,
51 | "Debug": 38,
52 | "Debug log:": 2,
53 | "Disable Compression": 36,
54 | "Disable Local": 29,
55 | "Disable Multiplexing": 35,
56 | "Download": 6,
57 | "Enable Debug Log": 16,
58 | "Enter code to download": 3,
59 | "Font": 22,
60 | "Force Local Only": 30,
61 | "Hash Algorithm": 34,
62 | "Language": 20,
63 | "License Info": 0,
64 | "Logo": 23,
65 | "Multicast Address": 31,
66 | "Network Local": 28,
67 | "PAKE Curve": 33,
68 | "Password": 27,
69 | "Pick a file to send": 9,
70 | "Ports": 26,
71 | "Receive": 4,
72 | "Receive Code": 5,
73 | "Received": 8,
74 | "Receiving file": 7,
75 | "Relay": 24,
76 | "Send": 10,
77 | "Send Code": 15,
78 | "Send cancelled.": 13,
79 | "Sending file": 11,
80 | "Sent file": 12,
81 | "Settings": 18,
82 | "Show / Hide": 17,
83 | "Theme": 21,
84 | "Transfer Options": 32,
85 | "Upload Speed Throttle": 37,
86 | }
87 |
88 | var en_USIndex = []uint32{ // 40 elements
89 | // Entry 0 - 1F
90 | 0x00000000, 0x0000000d, 0x00000013, 0x0000001e,
91 | 0x00000035, 0x0000003d, 0x0000004a, 0x00000053,
92 | 0x00000062, 0x0000006b, 0x0000007f, 0x00000084,
93 | 0x00000091, 0x0000009b, 0x000000ab, 0x000000b2,
94 | 0x000000bc, 0x000000cd, 0x000000d9, 0x000000e2,
95 | 0x000000ed, 0x000000f6, 0x000000fc, 0x00000101,
96 | 0x00000106, 0x0000010c, 0x00000114, 0x0000011a,
97 | 0x00000123, 0x00000131, 0x0000013f, 0x00000150,
98 | // Entry 20 - 3F
99 | 0x00000162, 0x00000173, 0x0000017e, 0x0000018d,
100 | 0x000001a2, 0x000001b6, 0x000001cc, 0x000001d2,
101 | } // Size: 184 bytes
102 |
103 | const en_USData string = "" + // Size: 466 bytes
104 | "\x02License Info\x02About\x02Debug log:\x02Enter code to download\x02Rec" +
105 | "eive\x02Receive Code\x02Download\x02Receiving file\x02Received\x02Pick a" +
106 | " file to send\x02Send\x02Sending file\x02Sent file\x02Send cancelled." +
107 | "\x02Cancel\x02Send Code\x02Enable Debug Log\x02Show / Hide\x02Settings" +
108 | "\x02Appearance\x02Language\x02Theme\x02Font\x02Logo\x02Relay\x02Address" +
109 | "\x02Ports\x02Password\x02Network Local\x02Disable Local\x02Force Local O" +
110 | "nly\x02Multicast Address\x02Transfer Options\x02PAKE Curve\x02Hash Algor" +
111 | "ithm\x02Disable Multiplexing\x02Disable Compression\x02Upload Speed Thro" +
112 | "ttle\x02Debug"
113 |
114 | var ja_JPIndex = []uint32{ // 40 elements
115 | // Entry 0 - 1F
116 | 0x00000000, 0x00000016, 0x0000001d, 0x00000031,
117 | 0x0000005c, 0x00000063, 0x00000073, 0x00000086,
118 | 0x0000009f, 0x000000b2, 0x000000d4, 0x000000db,
119 | 0x000000f4, 0x00000116, 0x0000013e, 0x0000014e,
120 | 0x0000015e, 0x0000017d, 0x00000190, 0x00000197,
121 | 0x0000019e, 0x000001a5, 0x000001af, 0x000001bc,
122 | 0x000001c3, 0x000001cd, 0x000001da, 0x000001e4,
123 | 0x000001f4, 0x00000213, 0x0000023e, 0x0000026f,
124 | // Entry 20 - 3F
125 | 0x00000291, 0x000002a7, 0x000002b2, 0x000002c5,
126 | 0x000002e1, 0x000002f4, 0x00000316, 0x00000323,
127 | } // Size: 184 bytes
128 |
129 | const ja_JPData string = "" + // Size: 803 bytes
130 | "\x02ライセンス情報\x02情報\x02デバッグログ:\x02コードを入力してダウンロード\x02受信\x02受信コード\x02ダウンロード" +
131 | "\x02ファイルを受信中\x02受信しました\x02ファイルを選択して送信\x02送信\x02ファイルを送信中\x02ファイルを送信しました" +
132 | "\x02送信はキャンセルされました\x02キャンセル\x02受信コード\x02デバッグログを有効化\x02表示 / 非表示\x02設定\x02外" +
133 | "観\x02言語\x02テーマ\x02フォント\x02ロゴ\x02リレー\x02アドレス\x02ポート\x02パスワード\x02ローカルネット" +
134 | "ワーク\x02ローカルネットワークを無効化\x02ローカルネットワークのみ使用する\x02マルチキャストアドレス\x02転送オプション" +
135 | "\x02PAKE Curve\x02ハッシュ方式\x02多重化を無効にする\x02圧縮を無効化\x02アップロード速度の制限\x02デバッグ"
136 |
137 | var ru_RUIndex = []uint32{ // 40 elements
138 | // Entry 0 - 1F
139 | 0x00000000, 0x0000002e, 0x00000035, 0x00000052,
140 | 0x00000091, 0x0000009a, 0x000000a7, 0x000000b0,
141 | 0x000000bf, 0x000000ce, 0x000000e4, 0x000000eb,
142 | 0x000000f2, 0x000000ff, 0x0000011c, 0x0000012d,
143 | 0x0000013a, 0x00000155, 0x00000167, 0x0000016e,
144 | 0x00000175, 0x0000017e, 0x00000187, 0x00000192,
145 | 0x000001a1, 0x000001b4, 0x000001bf, 0x000001ca,
146 | 0x000001d7, 0x000001e0, 0x000001f6, 0x00000207,
147 | // Entry 20 - 3F
148 | 0x00000214, 0x0000021f, 0x0000022b, 0x0000023b,
149 | 0x00000269, 0x0000027d, 0x0000028c, 0x0000029b,
150 | } // Size: 184 bytes
151 |
152 | const ru_RUData string = "" + // Size: 667 bytes
153 | "\x02Лицензионная информация\x02Это\x02Журнал отладки:\x02Секрет должен б" +
154 | "ыть больше 5 знаков\x02Беру\x02Секрет\x02Беру\x02Получаю\x02Получил\x02" +
155 | "Что послать\x02Шлю\x02Шлю\x02Послал\x02Отмена посылки.\x02Отменить\x02С" +
156 | "екрет\x02Журналировать\x02Вкл / Выкл\x02Как\x02Вид\x02Язык\x02Тема\x02Ш" +
157 | "рифт\x02Логотип\x02Посредник\x02Адрес\x02Порты\x02Пароль\x02сеть\x02Не " +
158 | "локально\x02Локально\x02Группа\x02Обмен\x02Тип PAKE\x02Тип хеша\x02Без " +
159 | "мультиплексирования\x02Без сжатия\x02Медлить\x02Отладка"
160 |
161 | var tr_TRIndex = []uint32{ // 40 elements
162 | // Entry 0 - 1F
163 | 0x00000000, 0x00000007, 0x00000011, 0x0000002c,
164 | 0x00000047, 0x0000004d, 0x00000054, 0x0000005b,
165 | 0x00000066, 0x0000006e, 0x0000008c, 0x00000094,
166 | 0x000000a8, 0x000000ba, 0x000000d1, 0x000000d8,
167 | 0x000000e4, 0x0000010f, 0x0000010f, 0x00000117,
168 | 0x00000123, 0x00000127, 0x0000012c, 0x0000012c,
169 | 0x0000012c, 0x00000132, 0x00000138, 0x0000014c,
170 | 0x00000153, 0x0000015d, 0x00000171, 0x0000018e,
171 | // Entry 20 - 3F
172 | 0x0000018e, 0x000001a4, 0x000001b1, 0x000001c1,
173 | 0x000001e5, 0x0000020c, 0x00000227, 0x00000236,
174 | } // Size: 184 bytes
175 |
176 | const tr_TRData string = "" + // Size: 566 bytes
177 | "\x02Lisans\x02Hakkında\x02Hata ayıklama günlüğü\x02İndirmek için kodu gi" +
178 | "rin\x02Almak\x02Kod al\x02İndir\x02Dosya alma\x02Alınan\x02Gönderilicek " +
179 | "dosyayı seçin\x02Gönder\x02Dosya gönderiliyor\x02Dosya gönderildi\x02Gön" +
180 | "derme iptal edildi\x02İptal\x02Kod gönder\x02Hata ayıklama günlüğünü etk" +
181 | "inleştir\x02Ayarlar\x02Görünüş\x02Dil\x02Tema\x02Röle\x02Adres\x02Bağlan" +
182 | "tı noktası\x02Şifre\x02Yerel ağ\x02Yerel devre dışı\x02Yalnızca yerel ol" +
183 | "arak zorla\x02Transfer seçenekleri\x02PAKR eğrisi\x02Karma algoritma\x02" +
184 | "Çoğullamayı devre dışı bırak\x02Sıkıştırmayı devre dışı bırak\x02Yüklem" +
185 | "e hızını kısma \x02Hata ayıklama"
186 |
187 | var zh_CNIndex = []uint32{ // 40 elements
188 | // Entry 0 - 1F
189 | 0x00000000, 0x00000010, 0x00000017, 0x00000025,
190 | 0x00000038, 0x0000003f, 0x00000049, 0x00000050,
191 | 0x0000005d, 0x00000067, 0x00000080, 0x00000087,
192 | 0x00000097, 0x000000a7, 0x000000ba, 0x000000c1,
193 | 0x000000ce, 0x000000e1, 0x000000f1, 0x000000f8,
194 | 0x000000ff, 0x00000106, 0x0000010d, 0x00000114,
195 | 0x0000011b, 0x00000122, 0x00000129, 0x00000130,
196 | 0x00000137, 0x00000144, 0x00000151, 0x00000164,
197 | // Entry 20 - 3F
198 | 0x00000171, 0x0000017e, 0x0000018a, 0x00000197,
199 | 0x000001a7, 0x000001b4, 0x000001c7, 0x000001ce,
200 | } // Size: 184 bytes
201 |
202 | const zh_CNData string = "" + // Size: 462 bytes
203 | "\x02许可证信息\x02关于\x02除错记录:\x02输入代码下载\x02接收\x02接收码\x02下载\x02接收档案\x02已接收\x02" +
204 | "选择要发送的档案\x02发送\x02发送档案中\x02已发送档案\x02发送已取消。\x02取消\x02发送代码\x02启用除错记录\x02" +
205 | "显示 / 隐藏\x02设定\x02外观\x02语言\x02主题\x02字体\x02标志\x02中继\x02地址\x02端口\x02密码" +
206 | "\x02本地网络\x02停用本地\x02强制仅限本地\x02组播地址\x02传输选项\x02PAKE 曲线\x02哈希算法\x02停用多重化" +
207 | "\x02停用压缩\x02上传速度调节\x02除错"
208 |
209 | var zh_HKIndex = []uint32{ // 40 elements
210 | // Entry 0 - 1F
211 | 0x00000000, 0x00000010, 0x00000017, 0x00000025,
212 | 0x0000003b, 0x00000042, 0x0000004c, 0x00000053,
213 | 0x00000060, 0x0000006a, 0x00000083, 0x0000008a,
214 | 0x0000009a, 0x000000aa, 0x000000bd, 0x000000c4,
215 | 0x000000d1, 0x000000e4, 0x000000f4, 0x000000fb,
216 | 0x00000102, 0x00000109, 0x00000110, 0x00000117,
217 | 0x0000011e, 0x00000125, 0x0000012c, 0x00000133,
218 | 0x0000013a, 0x00000147, 0x00000154, 0x00000167,
219 | // Entry 20 - 3F
220 | 0x00000174, 0x00000181, 0x0000018d, 0x0000019d,
221 | 0x000001ad, 0x000001ba, 0x000001cd, 0x000001d4,
222 | } // Size: 184 bytes
223 |
224 | const zh_HKData string = "" + // Size: 468 bytes
225 | "\x02許可證資訊\x02關於\x02除錯記錄:\x02輸入編碼以下載\x02接收\x02接收碼\x02下載\x02接收文件\x02已接收" +
226 | "\x02選擇要發送的文件\x02發送\x02發送文件中\x02已發送文件\x02發送已取消。\x02取消\x02發送代碼\x02啟用除錯記錄" +
227 | "\x02顯示 / 隱藏\x02設定\x02外觀\x02語言\x02主題\x02字體\x02標誌\x02中繼\x02地址\x02端口\x02密碼" +
228 | "\x02本地網絡\x02停用本地\x02強制只限本地\x02群播位址\x02傳輸選擇\x02PAKE 曲線\x02哈希演算法\x02停用多重化" +
229 | "\x02停用壓縮\x02上載速度節流\x02除錯"
230 |
231 | var zh_TWIndex = []uint32{ // 40 elements
232 | // Entry 0 - 1F
233 | 0x00000000, 0x00000010, 0x00000017, 0x00000025,
234 | 0x00000038, 0x0000003f, 0x00000049, 0x00000050,
235 | 0x0000005d, 0x00000067, 0x00000080, 0x00000087,
236 | 0x00000097, 0x000000a7, 0x000000ba, 0x000000c1,
237 | 0x000000ce, 0x000000e1, 0x000000f1, 0x000000f8,
238 | 0x000000ff, 0x00000106, 0x0000010d, 0x00000114,
239 | 0x0000011b, 0x00000122, 0x00000129, 0x00000133,
240 | 0x0000013a, 0x00000147, 0x00000154, 0x00000167,
241 | // Entry 20 - 3F
242 | 0x00000174, 0x00000181, 0x0000018d, 0x0000019d,
243 | 0x000001ad, 0x000001ba, 0x000001cd, 0x000001d4,
244 | } // Size: 184 bytes
245 |
246 | const zh_TWData string = "" + // Size: 468 bytes
247 | "\x02許可證資訊\x02關於\x02除錯記錄:\x02輸入代碼下載\x02接收\x02接收碼\x02下載\x02接收檔案\x02已接收\x02" +
248 | "選擇要發送的檔案\x02發送\x02發送檔案中\x02已發送檔案\x02發送已取消。\x02取消\x02發送代碼\x02啟用除錯記錄\x02" +
249 | "顯示 / 隱藏\x02設定\x02外觀\x02語言\x02主題\x02字體\x02標誌\x02中繼\x02地址\x02連接埠\x02密碼" +
250 | "\x02本地網路\x02停用本地\x02強制僅限本地\x02群播位址\x02傳輸選項\x02PAKE 曲線\x02哈希演算法\x02停用多重化" +
251 | "\x02停用壓縮\x02上傳速度調節\x02除錯"
252 |
253 | // Total table size 5188 bytes (5KiB); checksum: 1CB70E48
254 |
--------------------------------------------------------------------------------
/go.sum:
--------------------------------------------------------------------------------
1 | filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
2 | filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
3 | fyne.io/fyne/v2 v2.6.3 h1:cvtM2KHeRuH+WhtHiA63z5wJVBkQ9+Ay0UMl9PxFHyA=
4 | fyne.io/fyne/v2 v2.6.3/go.mod h1:NGSurpRElVoI1G3h+ab2df3O5KLGh1CGbsMMcX0bPIs=
5 | fyne.io/fyne/v2 v2.7.1 h1:ja7rNHWWEooha4XBIZNnPP8tVFwmTfwMJdpZmLxm2Zc=
6 | fyne.io/fyne/v2 v2.7.1/go.mod h1:xClVlrhxl7D+LT+BWYmcrW4Nf+dJTvkhnPgji7spAwE=
7 | fyne.io/systray v1.11.0 h1:D9HISlxSkx+jHSniMBR6fCFOUjk1x/OOOJLa9lJYAKg=
8 | fyne.io/systray v1.11.0/go.mod h1:RVwqP9nYMo7h5zViCBHri2FgjXF7H2cub7MAq4NSoLs=
9 | fyne.io/systray v1.11.1-0.20250603113521-ca66a66d8b58 h1:eA5/u2XRd8OUkoMqEv3IBlFYSruNlXD8bRHDiqm0VNI=
10 | fyne.io/systray v1.11.1-0.20250603113521-ca66a66d8b58/go.mod h1:RVwqP9nYMo7h5zViCBHri2FgjXF7H2cub7MAq4NSoLs=
11 | github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0=
12 | github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
13 | github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg=
14 | github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
15 | github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
16 | github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
17 | github.com/chengxilo/virtualterm v1.0.4 h1:Z6IpERbRVlfB8WkOmtbHiDbBANU7cimRIof7mk9/PwM=
18 | github.com/chengxilo/virtualterm v1.0.4/go.mod h1:DyxxBZz/x1iqJjFxTFcr6/x+jSpqN0iwWCOK1q10rlY=
19 | github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
20 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
21 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
22 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
23 | github.com/denisbrodbeck/machineid v1.0.1 h1:geKr9qtkB876mXguW2X6TU4ZynleN6ezuMSRhl4D7AQ=
24 | github.com/denisbrodbeck/machineid v1.0.1/go.mod h1:dJUwb7PTidGDeYyUBmXZ2GphQBbjJCrnectwCyxcUSI=
25 | github.com/felixge/fgprof v0.9.3 h1:VvyZxILNuCiUCSXtPtYmmtGvb65nqXh2QFWc0Wpf2/g=
26 | github.com/felixge/fgprof v0.9.3/go.mod h1:RdbpDgzqYVh/T9fPELJyV7EYJuHB55UTEULNun8eiPw=
27 | github.com/fredbi/uri v1.1.0 h1:OqLpTXtyRg9ABReqvDGdJPqZUxs8cyBDOMXBbskCaB8=
28 | github.com/fredbi/uri v1.1.0/go.mod h1:aYTUoAXBOq7BLfVJ8GnKmfcuURosB1xyHDIfWeC/iW4=
29 | github.com/fredbi/uri v1.1.1 h1:xZHJC08GZNIUhbP5ImTHnt5Ya0T8FI2VAwI/37kh2Ko=
30 | github.com/fredbi/uri v1.1.1/go.mod h1:4+DZQ5zBjEwQCDmXW5JdIjz0PUA+yJbvtBv+u+adr5o=
31 | github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k=
32 | github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=
33 | github.com/fyne-io/gl-js v0.2.0 h1:+EXMLVEa18EfkXBVKhifYB6OGs3HwKO3lUElA0LlAjs=
34 | github.com/fyne-io/gl-js v0.2.0/go.mod h1:ZcepK8vmOYLu96JoxbCKJy2ybr+g1pTnaBDdl7c3ajI=
35 | github.com/fyne-io/glfw-js v0.3.0 h1:d8k2+Y7l+zy2pc7wlGRyPfTgZoqDf3AI4G+2zOWhWUk=
36 | github.com/fyne-io/glfw-js v0.3.0/go.mod h1:Ri6te7rdZtBgBpxLW19uBpp3Dl6K9K/bRaYdJ22G8Jk=
37 | github.com/fyne-io/image v0.1.1 h1:WH0z4H7qfvNUw5l4p3bC1q70sa5+YWVt6HCj7y4VNyA=
38 | github.com/fyne-io/image v0.1.1/go.mod h1:xrfYBh6yspc+KjkgdZU/ifUC9sPA5Iv7WYUBzQKK7JM=
39 | github.com/fyne-io/oksvg v0.1.0 h1:7EUKk3HV3Y2E+qypp3nWqMXD7mum0hCw2KEGhI1fnBw=
40 | github.com/fyne-io/oksvg v0.1.0/go.mod h1:dJ9oEkPiWhnTFNCmRgEze+YNprJF7YRbpjgpWS4kzoI=
41 | github.com/fyne-io/oksvg v0.2.0 h1:mxcGU2dx6nwjJsSA9PCYZDuoAcsZ/OuJlvg/Q9Njfo8=
42 | github.com/fyne-io/oksvg v0.2.0/go.mod h1:dJ9oEkPiWhnTFNCmRgEze+YNprJF7YRbpjgpWS4kzoI=
43 | github.com/go-gl/gl v0.0.0-20231021071112-07e5d0ea2e71 h1:5BVwOaUSBTlVZowGO6VZGw2H/zl9nrd3eCZfYV+NfQA=
44 | github.com/go-gl/gl v0.0.0-20231021071112-07e5d0ea2e71/go.mod h1:9YTyiznxEY1fVinfM7RvRcjRHbw2xLBJ3AAGIT0I4Nw=
45 | github.com/go-gl/glfw/v3.3/glfw v0.0.0-20240506104042-037f3cc74f2a h1:vxnBhFDDT+xzxf1jTJKMKZw3H0swfWk9RpWbBbDK5+0=
46 | github.com/go-gl/glfw/v3.3/glfw v0.0.0-20240506104042-037f3cc74f2a/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
47 | github.com/go-text/render v0.2.0 h1:LBYoTmp5jYiJ4NPqDc2pz17MLmA3wHw1dZSVGcOdeAc=
48 | github.com/go-text/render v0.2.0/go.mod h1:CkiqfukRGKJA5vZZISkjSYrcdtgKQWRa2HIzvwNN5SU=
49 | github.com/go-text/typesetting v0.2.1 h1:x0jMOGyO3d1qFAPI0j4GSsh7M0Q3Ypjzr4+CEVg82V8=
50 | github.com/go-text/typesetting v0.2.1/go.mod h1:mTOxEwasOFpAMBjEQDhdWRckoLLeI/+qrQeBCTGEt6M=
51 | github.com/go-text/typesetting-utils v0.0.0-20241103174707-87a29e9e6066 h1:qCuYC+94v2xrb1PoS4NIDe7DGYtLnU2wWiQe9a1B1c0=
52 | github.com/go-text/typesetting-utils v0.0.0-20241103174707-87a29e9e6066/go.mod h1:DDxDdQEnB70R8owOx3LVpEFvpMK9eeH1o2r0yZhFI9o=
53 | github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk=
54 | github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
55 | github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
56 | github.com/google/pprof v0.0.0-20211214055906-6f57359322fd h1:1FjCyPC+syAzJ5/2S8fqdZK1R22vvA0J7JZKcuOIQ7Y=
57 | github.com/google/pprof v0.0.0-20211214055906-6f57359322fd/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg=
58 | github.com/hack-pad/go-indexeddb v0.3.2 h1:DTqeJJYc1usa45Q5r52t01KhvlSN02+Oq+tQbSBI91A=
59 | github.com/hack-pad/go-indexeddb v0.3.2/go.mod h1:QvfTevpDVlkfomY498LhstjwbPW6QC4VC/lxYb0Kom0=
60 | github.com/hack-pad/safejs v0.1.0 h1:qPS6vjreAqh2amUqj4WNG1zIw7qlRQJ9K10eDKMCnE8=
61 | github.com/hack-pad/safejs v0.1.0/go.mod h1:HdS+bKF1NrE72VoXZeWzxFOVQVUSqZJAG0xNCnb+Tio=
62 | github.com/jeandeaual/go-locale v0.0.0-20250612000132-0ef82f21eade h1:FmusiCI1wHw+XQbvL9M+1r/C3SPqKrmBaIOYwVfQoDE=
63 | github.com/jeandeaual/go-locale v0.0.0-20250612000132-0ef82f21eade/go.mod h1:ZDXo8KHryOWSIqnsb/CiDq7hQUYryCgdVnxbj8tDG7o=
64 | github.com/jsummers/gobmp v0.0.0-20230614200233-a9de23ed2e25 h1:YLvr1eE6cdCqjOe972w/cYF+FjW34v27+9Vo5106B4M=
65 | github.com/jsummers/gobmp v0.0.0-20230614200233-a9de23ed2e25/go.mod h1:kLgvv7o6UM+0QSf0QjAse3wReFDsb9qbZJdfexWlrQw=
66 | github.com/kalafut/imohash v1.1.0 h1:Lldcmx0SXgMSoABB2WBD8mTgf0OlVnISn2Dyrfg2Ep8=
67 | github.com/kalafut/imohash v1.1.0/go.mod h1:6cn9lU0Sj8M4eu9UaQm1kR/5y3k/ayB68yntRhGloL4=
68 | github.com/kalafut/imohash v1.1.1 h1:G/HYtKgteQSVU96LidSJEbUGoZOMiBcuXYxbeb2W9e4=
69 | github.com/kalafut/imohash v1.1.1/go.mod h1:6cn9lU0Sj8M4eu9UaQm1kR/5y3k/ayB68yntRhGloL4=
70 | github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
71 | github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
72 | github.com/magisterquis/connectproxy v0.0.0-20200725203833-3582e84f0c9b h1:xZ59n7Frzh8CwyfAapUZLSg+gXH5m63YEaFCMpDHhpI=
73 | github.com/magisterquis/connectproxy v0.0.0-20200725203833-3582e84f0c9b/go.mod h1:uDd4sYVYsqcxAB8j+Q7uhL6IJCs/r1kxib1HV4bgOMg=
74 | github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc=
75 | github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
76 | github.com/minio/highwayhash v1.0.3 h1:kbnuUMoHYyVl7szWjSxJnxw11k2U709jqFPPmIUyD6Q=
77 | github.com/minio/highwayhash v1.0.3/go.mod h1:GGYsuwP/fPD6Y9hMiXuapVvlIUEhFhMTh0rxU3ik1LQ=
78 | github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db h1:62I3jR2EmQ4l5rM/4FEfDWcRD+abF5XlKShorW5LRoQ=
79 | github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw=
80 | github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ=
81 | github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8=
82 | github.com/nicksnyder/go-i18n/v2 v2.5.1 h1:IxtPxYsR9Gp60cGXjfuR/llTqV8aYMsC472zD0D1vHk=
83 | github.com/nicksnyder/go-i18n/v2 v2.5.1/go.mod h1:DrhgsSDZxoAfvVrBVLXoxZn/pN5TXqaDbq7ju94viiQ=
84 | github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
85 | github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
86 | github.com/pkg/profile v1.7.0 h1:hnbDkaNWPCLMO9wGLdBFTIZvzDrDfBM2072E1S9gJkA=
87 | github.com/pkg/profile v1.7.0/go.mod h1:8Uer0jas47ZQMJ7VD+OHknK4YDY07LPUC6dEvqDjvNo=
88 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
89 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
90 | github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
91 | github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
92 | github.com/rymdport/portal v0.4.1 h1:2dnZhjf5uEaeDjeF/yBIeeRo6pNI2QAKm7kq1w/kbnA=
93 | github.com/rymdport/portal v0.4.1/go.mod h1:kFF4jslnJ8pD5uCi17brj/ODlfIidOxlgUDTO5ncnC4=
94 | github.com/rymdport/portal v0.4.2 h1:7jKRSemwlTyVHHrTGgQg7gmNPJs88xkbKcIL3NlcmSU=
95 | github.com/rymdport/portal v0.4.2/go.mod h1:kFF4jslnJ8pD5uCi17brj/ODlfIidOxlgUDTO5ncnC4=
96 | github.com/sabhiram/go-gitignore v0.0.0-20210923224102-525f6e181f06 h1:OkMGxebDjyw0ULyrTYWeN0UNCCkmCWfjPnIA2W6oviI=
97 | github.com/sabhiram/go-gitignore v0.0.0-20210923224102-525f6e181f06/go.mod h1:+ePHsJ1keEjQtpvf9HHw0f4ZeJ0TLRsxhunSI2hYJSs=
98 | github.com/schollz/croc/v10 v10.2.4 h1:Lds7Z382NXh6/xANgdKHQPm+exCzHzH7W/mkNo3BTXM=
99 | github.com/schollz/croc/v10 v10.2.4/go.mod h1:2mn2/wl0/XvtRmtQ/kRS0emTGEeD2YybfFWnnbJnJg4=
100 | github.com/schollz/croc/v10 v10.3.1 h1:Te5kHnOSooMlj50RA3Qabi+DVuwb/cj4eRlpzucODrc=
101 | github.com/schollz/croc/v10 v10.3.1/go.mod h1:Bp7fAUnshamu+xFyDcxNIAu0Yuhp2PhZup4Qh9sLcv8=
102 | github.com/schollz/logger v1.2.0 h1:5WXfINRs3lEUTCZ7YXhj0uN+qukjizvITLm3Ca2m0Ho=
103 | github.com/schollz/logger v1.2.0/go.mod h1:P6F4/dGMGcx8wh+kG1zrNEd4vnNpEBY/mwEMd/vn6AM=
104 | github.com/schollz/pake/v3 v3.1.0 h1:ZFGqqDlRWJlnE6IqnLmma7XpUgcvb8B1CSXp08ug334=
105 | github.com/schollz/pake/v3 v3.1.0/go.mod h1:eNsxl/10KNO240DajF8FvsTqYi7uDM1xwa5kmrzD3Ec=
106 | github.com/schollz/peerdiscovery v1.7.6 h1:HJjU1cXcNGfZgenC/vbry9F6CH9B8f+QYcTipZLbtDg=
107 | github.com/schollz/peerdiscovery v1.7.6/go.mod h1:iTa0MWSPy49jJ2HcXL5oSSnFsd6olEUorAFljxbnj2I=
108 | github.com/schollz/progressbar/v3 v3.18.0 h1:uXdoHABRFmNIjUfte/Ex7WtuyVslrw2wVPQmCN62HpA=
109 | github.com/schollz/progressbar/v3 v3.18.0/go.mod h1:IsO3lpbaGuzh8zIMzgY3+J8l4C8GjO0Y9S69eFvNsec=
110 | github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e h1:MRM5ITcdelLK2j1vwZ3Je0FKVCfqOLp5zO6trqMLYs0=
111 | github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e/go.mod h1:XV66xRDqSt+GTGFMVlhk3ULuV0y9ZmzeVGR4mloJI3M=
112 | github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c h1:km8GpoQut05eY3GiYWEedbTT0qnSxrCjsVbb7yKY1KE=
113 | github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c/go.mod h1:cNQ3dwVJtS5Hmnjxy6AgTPd0Inb3pW05ftPSX7NZO7Q=
114 | github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef h1:Ch6Q+AZUxDBCVqdkI8FSpFyZDtCVBc2VmejdNrm5rRQ=
115 | github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef/go.mod h1:nXTWP6+gD5+LUJ8krVhhoeHjvHTutPxMYl5SvkcnJNE=
116 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
117 | github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
118 | github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
119 | github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
120 | github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
121 | github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
122 | github.com/tscholl2/siec v0.0.0-20240310163802-c2c6f6198406 h1:sDWDZkwYqX0jvLWstKzFwh+pYhQNaVg65BgSkCP/f7U=
123 | github.com/tscholl2/siec v0.0.0-20240310163802-c2c6f6198406/go.mod h1:KL9+ubr1JZdaKjgAaHr+tCytEncXBa1pR6FjbTsOJnw=
124 | github.com/twmb/murmur3 v1.1.5/go.mod h1:Qq/R7NUyOfr65zD+6Q5IHKsJLwP7exErjN6lyyq3OSQ=
125 | github.com/twmb/murmur3 v1.1.8 h1:8Yt9taO/WN3l08xErzjeschgZU2QSrwm1kclYq+0aRg=
126 | github.com/twmb/murmur3 v1.1.8/go.mod h1:Qq/R7NUyOfr65zD+6Q5IHKsJLwP7exErjN6lyyq3OSQ=
127 | github.com/ulikunitz/xz v0.5.12 h1:37Nm15o69RwBkXM0J6A5OlE67RZTfzUxTj8fB3dfcsc=
128 | github.com/ulikunitz/xz v0.5.12/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
129 | github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
130 | github.com/yuin/goldmark v1.7.8 h1:iERMLn0/QJeHFhxSt3p6PeN9mGnvIKSpG9YYorDMnic=
131 | github.com/yuin/goldmark v1.7.8/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E=
132 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
133 | golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
134 | golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc=
135 | golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
136 | golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
137 | golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc=
138 | golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM=
139 | golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY=
140 | golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q=
141 | golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4=
142 | golang.org/x/image v0.24.0 h1:AN7zRgVsbvmTfNyqIbbOraYL8mSwcKncEj8ofjgzcMQ=
143 | golang.org/x/image v0.24.0/go.mod h1:4b/ITuLfqYq1hqZcjofwctIhi7sZh2WaCjvsBNjjya8=
144 | golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
145 | golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
146 | golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
147 | golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
148 | golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
149 | golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
150 | golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
151 | golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
152 | golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
153 | golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
154 | golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk=
155 | golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
156 | golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
157 | golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k=
158 | golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs=
159 | golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8=
160 | golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY=
161 | golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU=
162 | golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
163 | golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
164 | golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
165 | golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
166 | golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
167 | golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
168 | golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
169 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
170 | golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
171 | golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
172 | golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
173 | golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
174 | golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
175 | golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
176 | golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
177 | golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
178 | golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
179 | golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
180 | golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
181 | golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=
182 | golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
183 | golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc=
184 | golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
185 | golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE=
186 | golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
187 | golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
188 | golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
189 | golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
190 | golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU=
191 | golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
192 | golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY=
193 | golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek=
194 | golang.org/x/term v0.33.0 h1:NuFncQrRcaRvVmgRkvM3j/F00gWIAlcmlB8ACEKmGIg=
195 | golang.org/x/term v0.33.0/go.mod h1:s18+ql9tYWp1IfpV9DmCtQDDSRBUjKaw9M1eAv5UeF0=
196 | golang.org/x/term v0.37.0 h1:8EGAD0qCmHYZg6J17DvsMy9/wJ7/D/4pV/wfnld5lTU=
197 | golang.org/x/term v0.37.0/go.mod h1:5pB4lxRNYYVZuTLmy8oR2BH8dflOR+IbTYFD8fi3254=
198 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
199 | golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
200 | golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
201 | golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
202 | golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
203 | golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
204 | golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
205 | golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
206 | golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
207 | golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng=
208 | golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU=
209 | golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM=
210 | golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM=
211 | golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE=
212 | golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg=
213 | golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI=
214 | golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4=
215 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
216 | golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
217 | golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
218 | golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
219 | golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58=
220 | golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk=
221 | golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
222 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
223 | gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=
224 | gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
225 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
226 | gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
227 | gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
228 |
--------------------------------------------------------------------------------