├── 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 | [mobile screenshot 1](metadata/en-US/images/phoneScreenshots/1.png?raw=true) 11 | [mobile screenshot 2](metadata/en-US/images/phoneScreenshots/2.png?raw=true) 12 | [mobile screenshot 3](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 | --------------------------------------------------------------------------------