aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--Makefile7
-rw-r--r--README.md6
-rw-r--r--go.mod4
-rw-r--r--go.sum9
-rw-r--r--gotext.go39
-rw-r--r--locales/de/messages.gotext.json6
-rw-r--r--locales/fa/messages.gotext.json863
-rw-r--r--locales/fr/messages.gotext.json6
-rw-r--r--locales/id/messages.gotext.json874
-rw-r--r--locales/it/messages.gotext.json6
-rw-r--r--locales/ja/messages.gotext.json6
-rw-r--r--locales/pl/messages.gotext.json23
-rw-r--r--locales/ru/messages.gotext.json6
-rw-r--r--locales/sl/messages.gotext.json6
-rw-r--r--locales/vi/messages.gotext.json382
-rw-r--r--locales/zh-CN/messages.gotext.json6
-rw-r--r--locales/zh-TW/messages.gotext.json1761
-rw-r--r--resources.rc7
-rw-r--r--zgotext.go424
19 files changed, 4389 insertions, 52 deletions
diff --git a/Makefile b/Makefile
index 446ddd34..0a30d8c1 100644
--- a/Makefile
+++ b/Makefile
@@ -51,6 +51,13 @@ generate: export CGO_ENABLED := 0
generate:
go generate ./...
+crowdin:
+ find locales -maxdepth 1 -mindepth 1 -type d \! -name en -exec rm -rf {} +
+ @[[ -n $$CROWDIN_API_KEY ]] || read -r -p "Enter Crowdin API key: " CROWDIN_API_KEY && \
+ curl -Lo - https://api.crowdin.com/api/project/WireGuard/download/all.zip?key=$$CROWDIN_API_KEY | bsdtar -C locales -x -f - --strip-components 2 wireguard-windows
+ find locales -name messages.gotext.json -exec bash -c '[[ $$(jq ".messages | length" {}) -ne 0 ]] || rm -rf "$$(dirname {})"' \;
+ @$(MAKE) --no-print-directory generate
+
deploy: amd64/wireguard.exe
-ssh $(DEPLOYMENT_HOST) -- 'taskkill /im wireguard.exe /f'
scp $< $(DEPLOYMENT_HOST):$(DEPLOYMENT_PATH)
diff --git a/README.md b/README.md
index 6bda7f1e..67e4f6d6 100644
--- a/README.md
+++ b/README.md
@@ -30,7 +30,11 @@ To translate WireGuard UI to your language:
1. Upgrade `resources.rc` accordingly. Follow the pattern.
-2. Add your language ID to the `//go:generate ... -lang=en,<langID>...` line in `gotext.go`.
+2. Make a new directory in `locales\` containing the language ID:
+
+ ```
+ C:\Projects\wireguard-windows> mkdir locales\<langID>
+ ```
3. Configure and run `build` to prepare initial `locales\<langID>\messages.gotext.json` file:
diff --git a/go.mod b/go.mod
index b6b9ccf8..e791b9a4 100644
--- a/go.mod
+++ b/go.mod
@@ -7,9 +7,9 @@ require (
github.com/lxn/win v0.0.0-20191128105842-2da648fda5b4
golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899
golang.org/x/net v0.0.0-20200707034311-ab3426394381
- golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae
+ golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1
golang.org/x/text v0.3.3
- golang.zx2c4.com/wireguard v0.0.20200321-0.20200714205944-31b574ef99a7
+ golang.zx2c4.com/wireguard v0.0.20200321-0.20200715051853-507f148e1c42
)
replace (
diff --git a/go.sum b/go.sum
index 39c17a21..916b67a1 100644
--- a/go.sum
+++ b/go.sum
@@ -12,15 +12,16 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200501145240-bc7a7d42d5c3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae h1:Ih9Yo4hSPImZOpfGuA4bR/ORKTAbhZo2AbWNRCnevdo=
-golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1 h1:sIky/MyNRSHTrdxfsiUSS4WIAMvInbeXljJz+jDjeYE=
+golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e h1:FDhOuMEY4JVRztM/gsbk+IKUQ8kj74bxZrgw87eMMVc=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.zx2c4.com/wireguard v0.0.20200321-0.20200714205944-31b574ef99a7 h1:uplYgQzH47Y1vvkPLdb+BbR36Jb4UjQgqhWAneKzQ/k=
-golang.zx2c4.com/wireguard v0.0.20200321-0.20200714205944-31b574ef99a7/go.mod h1:GJvYs5O24/ASlwPiRklVnjMx2xQzrOic0DuU6GvYJL4=
+golang.zx2c4.com/wireguard v0.0.20200321-0.20200715051853-507f148e1c42 h1:SrR1hmxGKKarHEEDvaHxatwnqE3uT+7jvMcin6SHOkw=
+golang.zx2c4.com/wireguard v0.0.20200321-0.20200715051853-507f148e1c42/go.mod h1:GJvYs5O24/ASlwPiRklVnjMx2xQzrOic0DuU6GvYJL4=
golang.zx2c4.com/wireguard/windows v0.0.0-20191128151145-b4e4933852d5 h1:tkrF3cHqbnFQ068q0cUbu9nJMXKChFT2rGL9sSAMlrI=
golang.zx2c4.com/wireguard/windows v0.0.0-20191128151145-b4e4933852d5/go.mod h1:ouWl4wViUNh8tPSIwxTVMuS014WakR1hqvBc2I0bMoA=
golang.zx2c4.com/wireguard/windows v0.0.0-20200319192453-d35a18df246f h1:55sAe6dUkYZS7m8s/+eoEAdggzZjNkku8lj/W3vHu+U=
diff --git a/gotext.go b/gotext.go
index e9a59aea..d61ce393 100644
--- a/gotext.go
+++ b/gotext.go
@@ -1,5 +1,5 @@
// +build generate
-//go:generate go run gotext.go -srclang=en update -out=zgotext.go -lang=en,de,fr,it,ja,ru,sl,zh-CN
+//go:generate go run gotext.go
/* SPDX-License-Identifier: MIT
*
@@ -9,12 +9,47 @@
package main
import (
+ "encoding/json"
"io/ioutil"
"os"
"os/exec"
+ "path/filepath"
+ "strings"
+
+ "golang.org/x/text/message/pipeline"
)
func main() {
+ langDirs, err := ioutil.ReadDir("locales")
+ if err != nil {
+ panic(err)
+ }
+ var langs []string
+ for _, dir := range langDirs {
+ if !dir.IsDir() {
+ continue
+ }
+ lang := dir.Name()
+ if jsonData, err := ioutil.ReadFile(filepath.Join("locales", lang, "messages.gotext.json")); err == nil {
+ var translations pipeline.Messages
+ if err := json.Unmarshal(jsonData, &translations); err != nil {
+ panic(err)
+ }
+ lang = translations.Language.String()
+ if lang != dir.Name() {
+ err = os.Rename(filepath.Join("locales", dir.Name()), filepath.Join("locales", lang))
+ if err != nil {
+ panic(err)
+ }
+ }
+ } else if os.IsNotExist(err) {
+ panic(err)
+ }
+ langs = append(langs, lang)
+ }
+ if len(langs) == 0 {
+ panic("no locales found")
+ }
gotext, err := ioutil.TempFile("", "gotext*.exe")
if err != nil {
panic(err)
@@ -29,7 +64,7 @@ func main() {
if err != nil {
panic(err)
}
- cmd = exec.Command(gotextFilename, os.Args[1:]...)
+ cmd = exec.Command(gotextFilename, "-srclang=en", "update", "-out=zgotext.go", "-lang="+strings.Join(langs, ","))
cmd.Env = append(os.Environ(), "GOOS=windows", "GOARCH=amd64", "CGO_ENABLED=1", "CC=x86_64-w64-mingw32-gcc")
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
diff --git a/locales/de/messages.gotext.json b/locales/de/messages.gotext.json
index 85353269..95c636b1 100644
--- a/locales/de/messages.gotext.json
+++ b/locales/de/messages.gotext.json
@@ -496,12 +496,6 @@
"translatorComment": "Copied from source."
},
{
- "id": "Invalid config key is missing an equals separator",
- "message": "Invalid config key is missing an equals separator",
- "translation": "Ungültiger Konfigurationseintrag, es fehlt ein = Trennzeichen",
- "translatorComment": "Copied from source."
- },
- {
"id": "Key must have a value",
"message": "Key must have a value",
"translation": "Eintrag muss einen Wert haben",
diff --git a/locales/fa/messages.gotext.json b/locales/fa/messages.gotext.json
new file mode 100644
index 00000000..5933b60c
--- /dev/null
+++ b/locales/fa/messages.gotext.json
@@ -0,0 +1,863 @@
+{
+ "language": "fa",
+ "messages": [
+ {
+ "id": "Error",
+ "message": "Error",
+ "translation": "خطا",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Command Line Options",
+ "message": "Command Line Options",
+ "translation": "گزینه‌های خط فرمان",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "You must use the 64-bit version of WireGuard on this computer.",
+ "message": "You must use the 64-bit version of WireGuard on this computer.",
+ "translation": "شما باید نگارش ۶۴-بیت WireGuard را در این رایانه استفاده کنید.",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Now",
+ "message": "Now",
+ "translation": "هم اکنون",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "{Years} year(s)",
+ "message": "{Years} year(s)",
+ "translation": {
+ "select": {
+ "feature": "plural",
+ "arg": "Years",
+ "cases": {
+ "one": {
+ "msg": "{Years} سال"
+ },
+ "other": {
+ "msg": "{Years} سال"
+ }
+ }
+ }
+ },
+ "placeholders": [
+ {
+ "id": "Years",
+ "string": "%[1]d",
+ "type": "int64",
+ "underlyingType": "int64",
+ "argNum": 1,
+ "expr": "years"
+ }
+ ]
+ },
+ {
+ "id": "{Days} day(s)",
+ "message": "{Days} day(s)",
+ "translation": {
+ "select": {
+ "feature": "plural",
+ "arg": "Days",
+ "cases": {
+ "one": {
+ "msg": "{Days} روز"
+ },
+ "other": {
+ "msg": "{Days} روز"
+ }
+ }
+ }
+ },
+ "placeholders": [
+ {
+ "id": "Days",
+ "string": "%[1]d",
+ "type": "int64",
+ "underlyingType": "int64",
+ "argNum": 1,
+ "expr": "days"
+ }
+ ]
+ },
+ {
+ "id": "{Hours} hour(s)",
+ "message": "{Hours} hour(s)",
+ "translation": {
+ "select": {
+ "feature": "plural",
+ "arg": "Hours",
+ "cases": {
+ "one": {
+ "msg": "{Hours} ساعت"
+ },
+ "other": {
+ "msg": "{Hours} ساعت"
+ }
+ }
+ }
+ },
+ "placeholders": [
+ {
+ "id": "Hours",
+ "string": "%[1]d",
+ "type": "int64",
+ "underlyingType": "int64",
+ "argNum": 1,
+ "expr": "hours"
+ }
+ ]
+ },
+ {
+ "id": "{Minutes} minute(s)",
+ "message": "{Minutes} minute(s)",
+ "translation": {
+ "select": {
+ "feature": "plural",
+ "arg": "Minutes",
+ "cases": {
+ "one": {
+ "msg": "{Minutes} دقیقه"
+ },
+ "other": {
+ "msg": "{Minutes} دقیقه"
+ }
+ }
+ }
+ },
+ "placeholders": [
+ {
+ "id": "Minutes",
+ "string": "%[1]d",
+ "type": "int64",
+ "underlyingType": "int64",
+ "argNum": 1,
+ "expr": "minutes"
+ }
+ ]
+ },
+ {
+ "id": "{Seconds} second(s)",
+ "message": "{Seconds} second(s)",
+ "translation": {
+ "select": {
+ "feature": "plural",
+ "arg": "Seconds",
+ "cases": {
+ "one": {
+ "msg": "{Seconds} ثانیه"
+ },
+ "other": {
+ "msg": "{Seconds} ثانیه"
+ }
+ }
+ }
+ },
+ "placeholders": [
+ {
+ "id": "Seconds",
+ "string": "%[1]d",
+ "type": "int64",
+ "underlyingType": "int64",
+ "argNum": 1,
+ "expr": "seconds"
+ }
+ ]
+ },
+ {
+ "id": "{Timestamp} ago",
+ "message": "{Timestamp} ago",
+ "translation": "{Timestamp} پیش",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "Timestamp",
+ "string": "%[1]s",
+ "type": "string",
+ "underlyingType": "string",
+ "argNum": 1,
+ "expr": "timestamp"
+ }
+ ]
+ },
+ {
+ "id": "{Bytes} B",
+ "message": "{Bytes} B",
+ "translation": "{Bytes} بایت",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "Bytes",
+ "string": "%[1]d",
+ "type": "golang.zx2c4.com/wireguard/windows/conf.Bytes",
+ "underlyingType": "uint64",
+ "argNum": 1,
+ "expr": "b"
+ }
+ ]
+ },
+ {
+ "id": "Invalid IP address",
+ "message": "Invalid IP address",
+ "translation": "نشانی آی‌پی نامعتبر است",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Invalid MTU",
+ "message": "Invalid MTU",
+ "translation": "MTU نامعتبر است",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Invalid port",
+ "message": "Invalid port",
+ "translation": "پورت نامعتبر",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Key must have a value",
+ "message": "Key must have a value",
+ "translation": "کلید باید یک مقدار داشته باشد",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "[none specified]",
+ "message": "[none specified]",
+ "translation": "[مشخص نشده]",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "All peers must have public keys",
+ "message": "All peers must have public keys",
+ "translation": "همه همتاها باید کلید‌های عمومی داشته باشند",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Error in getting configuration",
+ "message": "Error in getting configuration",
+ "translation": "خطا در دریافت پیکربندی",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "[EnumerationSeparator]",
+ "message": "[EnumerationSeparator]",
+ "translation": "، ",
+ "comment": "Text to insert between items when listing - most western languages will translate ‘[EnumerationSeparator]’ into ‘, ’ to produce lists like ‘apple, orange, strawberry’. Eastern languages might translate into ‘、’ to produce lists like ‘リンゴ、オレンジ、イチゴ’."
+ },
+ {
+ "id": "[UnitSeparator]",
+ "message": "[UnitSeparator]",
+ "translation": "، ",
+ "comment": "Text to insert when combining units of a measure - most languages will translate ‘[UnitSeparator]’ into ‘ ’ (space) to produce lists like ‘2 minuti 30 sekund’, or empty string ‘’ to produce ‘2分30秒’."
+ },
+ {
+ "id": "About WireGuard",
+ "message": "About WireGuard",
+ "translation": "درباره WireGuard",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Close",
+ "message": "Close",
+ "translation": "بستن",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "♥ &Donate!",
+ "message": "♥ &Donate!",
+ "translation": "♥&کمک‌مالی!",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Status:",
+ "message": "Status:",
+ "translation": "وضعیت:",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "&Deactivate",
+ "message": "&Deactivate",
+ "translation": "&غیرفعال‌سازی",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "&Activate",
+ "message": "&Activate",
+ "translation": "&فعال‌سازی",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Public key:",
+ "message": "Public key:",
+ "translation": "کلید عمومی:",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Listen port:",
+ "message": "Listen port:",
+ "translation": "پورت شنود:",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "MTU:",
+ "message": "MTU:",
+ "translation": "MTU:",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Addresses:",
+ "message": "Addresses:",
+ "translation": "نشانی‌ها:",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "DNS servers:",
+ "message": "DNS servers:",
+ "translation": "سرورهای DNS:",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Preshared key:",
+ "message": "Preshared key:",
+ "translation": "کلید از پیش تقسیم شده:",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Allowed IPs:",
+ "message": "Allowed IPs:",
+ "translation": "IPهای مجاز:",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Endpoint:",
+ "message": "Endpoint:",
+ "translation": "نقطه پایان:",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Persistent keepalive:",
+ "message": "Persistent keepalive:",
+ "translation": "زنده نگه‌داشتن پیوسته:",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Transfer:",
+ "message": "Transfer:",
+ "translation": "انتقال:",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "enabled",
+ "message": "enabled",
+ "translation": "فعال شده",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Interface: {Name}",
+ "message": "Interface: {Name}",
+ "translation": "رابط: {Name}",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "Name",
+ "string": "%[1]s",
+ "type": "string",
+ "underlyingType": "string",
+ "argNum": 1,
+ "expr": "config.Name"
+ }
+ ]
+ },
+ {
+ "id": "Peer",
+ "message": "Peer",
+ "translation": "همتا",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Create new tunnel",
+ "message": "Create new tunnel",
+ "translation": "ایجاد تونل جدید",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Edit tunnel",
+ "message": "Edit tunnel",
+ "translation": "ویرایش تونل",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "&Name:",
+ "message": "&Name:",
+ "translation": "&نام:",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "&Public key:",
+ "message": "&Public key:",
+ "translation": "&کلید عمومی:",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "(unknown)",
+ "message": "(unknown)",
+ "translation": "(ناشناخته)",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "&Save",
+ "message": "&Save",
+ "translation": "&ذخیره",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Cancel",
+ "message": "Cancel",
+ "translation": "لغو",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "&Configuration:",
+ "message": "&Configuration:",
+ "translation": "&پیکربندی:",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Invalid name",
+ "message": "Invalid name",
+ "translation": "نام نامعتبر",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "A name is required.",
+ "message": "A name is required.",
+ "translation": "یک نام الزامی است.",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Unable to list existing tunnels",
+ "message": "Unable to list existing tunnels",
+ "translation": "نمی‌توان تونل‌های موجود را فهرست کرد",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Tunnel already exists",
+ "message": "Tunnel already exists",
+ "translation": "تونل هم‌اکنون موجود است",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Active",
+ "message": "Active",
+ "translation": "فعال",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Activating",
+ "message": "Activating",
+ "translation": "در حال فعال‌سازی",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Inactive",
+ "message": "Inactive",
+ "translation": "غیرفعال",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Deactivating",
+ "message": "Deactivating",
+ "translation": "در حال غیرفعال‌سازی",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Unknown state",
+ "message": "Unknown state",
+ "translation": "وضعیت ناشناخته",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Log",
+ "message": "Log",
+ "translation": "گزارش وقایع",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "&Copy",
+ "message": "&Copy",
+ "translation": "&روگرفت",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "&Save to file…",
+ "message": "&Save to file…",
+ "translation": "&ذخیره در پرونده…",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Time",
+ "message": "Time",
+ "translation": "زمان",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Log message",
+ "message": "Log message",
+ "translation": "پیام گزارش رویداد",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Export log to file",
+ "message": "Export log to file",
+ "translation": "برون‌برد گزارش رویداد به پرونده",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "&About WireGuard…",
+ "message": "&About WireGuard…",
+ "translation": "&درباره WireGuard…",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Tunnel Error",
+ "message": "Tunnel Error",
+ "translation": "خطالی تونل",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Status: Unknown",
+ "message": "Status: Unknown",
+ "translation": "وضعیت: ناشناخته",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Addresses: None",
+ "message": "Addresses: None",
+ "translation": "نشانی‌ها: هیچ",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "&Manage tunnels…",
+ "message": "&Manage tunnels…",
+ "translation": "&مدیریت تونل‌ها…",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "WireGuard Tunnel Error",
+ "message": "WireGuard Tunnel Error",
+ "translation": "خطای تونل WireGuard",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Status: {StateText}",
+ "message": "Status: {StateText}",
+ "translation": "وضعیت: {StateText}",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "StateText",
+ "string": "%[1]s",
+ "type": "string",
+ "underlyingType": "string",
+ "argNum": 1,
+ "expr": "stateText"
+ }
+ ]
+ },
+ {
+ "id": "Addresses: {String}",
+ "message": "Addresses: {String}",
+ "translation": "نشانی‌ها: {String}",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "String",
+ "string": "%[1]s",
+ "type": "string",
+ "underlyingType": "string",
+ "argNum": 1,
+ "expr": "sb.String()"
+ }
+ ]
+ },
+ {
+ "id": "WireGuard Activated",
+ "message": "WireGuard Activated",
+ "translation": "WireGuard فعال‌شد",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "The {Name} tunnel has been activated.",
+ "message": "The {Name} tunnel has been activated.",
+ "translation": "تونل {Name} فعال‌شده.",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "Name",
+ "string": "%[1]s",
+ "type": "string",
+ "underlyingType": "string",
+ "argNum": 1,
+ "expr": "tunnel.Name"
+ }
+ ]
+ },
+ {
+ "id": "WireGuard Deactivated",
+ "message": "WireGuard Deactivated",
+ "translation": "WireGuard غیرفعال شد",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "An Update is Available!",
+ "message": "An Update is Available!",
+ "translation": "یک به‌روزرسانی در دسترس است!",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "WireGuard Update Available",
+ "message": "WireGuard Update Available",
+ "translation": "به‌روزرسانی WireGuard در دسترس است",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Tunnels",
+ "message": "Tunnels",
+ "translation": "تونل‌ها",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "&Edit",
+ "message": "&Edit",
+ "translation": "&ویرایش",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Add &empty tunnel…",
+ "message": "Add &empty tunnel…",
+ "translation": "افزودن &خالی‌کردن تونل…",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Add Tunnel",
+ "message": "Add Tunnel",
+ "translation": "افزودن تونل",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Remove selected tunnel(s)",
+ "message": "Remove selected tunnel(s)",
+ "translation": "حذف تونل(ها) انتخابی",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Export all tunnels to zip",
+ "message": "Export all tunnels to zip",
+ "translation": "برون‌بری همه تونل‌ها به زیپ",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Export all tunnels to &zip…",
+ "message": "Export all tunnels to &zip…",
+ "translation": "برون‌بری همه تونل‌ها به &زیپ…",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Imported tunnels",
+ "message": "Imported tunnels",
+ "translation": "تونل‌های وارد شده",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Imported {M} tunnels",
+ "message": "Imported {M} tunnels",
+ "translation": {
+ "select": {
+ "feature": "plural",
+ "arg": "M",
+ "cases": {
+ "one": {
+ "msg": "{M} تونل وارد شد"
+ },
+ "other": {
+ "msg": "{M} تونل وارد شد"
+ }
+ }
+ }
+ },
+ "placeholders": [
+ {
+ "id": "M",
+ "string": "%[1]d",
+ "type": "int",
+ "underlyingType": "int",
+ "argNum": 1,
+ "expr": "m"
+ }
+ ]
+ },
+ {
+ "id": "Imported {M} of {N} tunnels",
+ "message": "Imported {M} of {N} tunnels",
+ "translation": {
+ "select": {
+ "feature": "plural",
+ "arg": "N",
+ "cases": {
+ "one": {
+ "msg": "{M} از {N} تونل وارد شد"
+ },
+ "other": {
+ "msg": "{M} از {N} تونل وارد شد"
+ }
+ }
+ }
+ },
+ "placeholders": [
+ {
+ "id": "M",
+ "string": "%[1]d",
+ "type": "int",
+ "underlyingType": "int",
+ "argNum": 1,
+ "expr": "m"
+ },
+ {
+ "id": "N",
+ "string": "%[2]d",
+ "type": "int",
+ "underlyingType": "int",
+ "argNum": 2,
+ "expr": "n"
+ }
+ ]
+ },
+ {
+ "id": "Unable to create tunnel",
+ "message": "Unable to create tunnel",
+ "translation": "نمی‌توان تونل ایجاد کرد",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Delete {TunnelCount} tunnels",
+ "message": "Delete {TunnelCount} tunnels",
+ "translation": {
+ "select": {
+ "feature": "plural",
+ "arg": "TunnelCount",
+ "cases": {
+ "one": {
+ "msg": "حذف {TunnelCount} تونل"
+ },
+ "other": {
+ "msg": "حذف {TunnelCount} تونل"
+ }
+ }
+ }
+ },
+ "placeholders": [
+ {
+ "id": "TunnelCount",
+ "string": "%[1]d",
+ "type": "int",
+ "underlyingType": "int",
+ "argNum": 1,
+ "expr": "tunnelCount"
+ }
+ ]
+ },
+ {
+ "id": "Delete tunnel ‘{TunnelName}’",
+ "message": "Delete tunnel ‘{TunnelName}’",
+ "translation": "حذف تونل ‘{TunnelName}’",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "TunnelName",
+ "string": "%[1]s",
+ "type": "string",
+ "underlyingType": "string",
+ "argNum": 1,
+ "expr": "tunnelName"
+ }
+ ]
+ },
+ {
+ "id": "Unable to delete tunnel",
+ "message": "Unable to delete tunnel",
+ "translation": "حذف تونل‌ امکان‌پذیر نیست",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Unable to delete tunnels",
+ "message": "Unable to delete tunnels",
+ "translation": "نمی‌توان تونل‌ها را حذف کرد",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Import tunnel(s) from file",
+ "message": "Import tunnel(s) from file",
+ "translation": "وارد کردن تونل(ها) از پرونده",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Configuration ZIP Files (*.zip)|*.zip",
+ "message": "Configuration ZIP Files (*.zip)|*.zip",
+ "translation": "پرونده‌های پیکربندی زیپ (*.zip)|*.zip",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Export tunnels to zip",
+ "message": "Export tunnels to zip",
+ "translation": "برون‌بری تونل‌ها به زیپ",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Error Exiting WireGuard",
+ "message": "Error Exiting WireGuard",
+ "translation": "خطا در هنگام خارج شدن از WireGuard",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Status: Waiting for user",
+ "message": "Status: Waiting for user",
+ "translation": "وضعیت: درانتظار برای کاربر",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Update Now",
+ "message": "Update Now",
+ "translation": "اکنون به‌روز رسانی کن",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Status: Waiting for updater service",
+ "message": "Status: Waiting for updater service",
+ "translation": "وضعیت: درانتظار برای سرویس به‌روزرسانی",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Error: {Err}. Please try again.",
+ "message": "Error: {Err}. Please try again.",
+ "translation": "خطا: {Err}. لطفا دوباره تلاش کنید.",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "Err",
+ "string": "%[1]v",
+ "type": "error",
+ "underlyingType": "interface{Error() string}",
+ "argNum": 1,
+ "expr": "err"
+ }
+ ]
+ },
+ {
+ "id": "Status: Complete!",
+ "message": "Status: Complete!",
+ "translation": "وضعیت: کامل شد!",
+ "translatorComment": "Copied from source."
+ }
+ ]
+} \ No newline at end of file
diff --git a/locales/fr/messages.gotext.json b/locales/fr/messages.gotext.json
index 87100f52..220d2bc2 100644
--- a/locales/fr/messages.gotext.json
+++ b/locales/fr/messages.gotext.json
@@ -496,12 +496,6 @@
"translatorComment": "Copied from source."
},
{
- "id": "Invalid config key is missing an equals separator",
- "message": "Invalid config key is missing an equals separator",
- "translation": "Clé de configuration non valide, il manque le séparateur est égal à",
- "translatorComment": "Copied from source."
- },
- {
"id": "Key must have a value",
"message": "Key must have a value",
"translation": "Clé doit avoir une valeur",
diff --git a/locales/id/messages.gotext.json b/locales/id/messages.gotext.json
new file mode 100644
index 00000000..e3ebdd87
--- /dev/null
+++ b/locales/id/messages.gotext.json
@@ -0,0 +1,874 @@
+{
+ "language": "id",
+ "messages": [
+ {
+ "id": "Error",
+ "message": "Error",
+ "translation": "Kesalahan",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "(no argument): elevate and install manager service",
+ "message": "(no argument): elevate and install manager service",
+ "translation": "(tidak ada argumen): naikkan akses dan instal servis manajer",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Usage: {Args0} [\n{String}]",
+ "message": "Usage: {Args0} [\n{String}]",
+ "translation": "Penggunaan: {Args0} [\n{String}]",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "Args0",
+ "string": "%[1]s",
+ "type": "string",
+ "underlyingType": "string",
+ "argNum": 1,
+ "expr": "os.Args[0]"
+ },
+ {
+ "id": "String",
+ "string": "%[2]s",
+ "type": "string",
+ "underlyingType": "string",
+ "argNum": 2,
+ "expr": "builder.String()"
+ }
+ ]
+ },
+ {
+ "id": "Command Line Options",
+ "message": "Command Line Options",
+ "translation": "Opsi Command Line",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Unable to determine whether the process is running under WOW64: {Err}",
+ "message": "Unable to determine whether the process is running under WOW64: {Err}",
+ "translation": "Tidak dapat menentukan apakah proses sedang berjalan di bawah WOW64: {Err}",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "Err",
+ "string": "%[1]v",
+ "type": "error",
+ "underlyingType": "interface{Error() string}",
+ "argNum": 1,
+ "expr": "err"
+ }
+ ]
+ },
+ {
+ "id": "You must use the 64-bit version of WireGuard on this computer.",
+ "message": "You must use the 64-bit version of WireGuard on this computer.",
+ "translation": "Anda harus menggunakan WireGuard versi 64-bit di komputer ini.",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Unable to open current process token: {Err}",
+ "message": "Unable to open current process token: {Err}",
+ "translation": "Tidak dapat membuka token proses saat ini: {Err}",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "Err",
+ "string": "%[1]v",
+ "type": "error",
+ "underlyingType": "interface{Error() string}",
+ "argNum": 1,
+ "expr": "err"
+ }
+ ]
+ },
+ {
+ "id": "WireGuard may only be used by users who are a member of the Builtin {AdminGroupName} group.",
+ "message": "WireGuard may only be used by users who are a member of the Builtin {AdminGroupName} group.",
+ "translation": "WireGuard hanya dapat digunakan oleh pengguna yang merupakan anggota grup Bawaan {AdminGroupName}.",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "AdminGroupName",
+ "string": "%[1]s",
+ "type": "string",
+ "underlyingType": "string",
+ "argNum": 1,
+ "expr": "elevate.AdminGroupName()"
+ }
+ ]
+ },
+ {
+ "id": "WireGuard is running, but the UI is only accessible from desktops of the Builtin {AdminGroupName} group.",
+ "message": "WireGuard is running, but the UI is only accessible from desktops of the Builtin {AdminGroupName} group.",
+ "translation": "WireGuard sedang berjalan, tetapi UI hanya dapat diakses dari desktop grup Bawaan {AdminGroupName}.",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "AdminGroupName",
+ "string": "%[1]s",
+ "type": "string",
+ "underlyingType": "string",
+ "argNum": 1,
+ "expr": "elevate.AdminGroupName()"
+ }
+ ]
+ },
+ {
+ "id": "WireGuard system tray icon did not appear after 30 seconds.",
+ "message": "WireGuard system tray icon did not appear after 30 seconds.",
+ "translation": "Ikon sistem WireGuard tidak muncul setelah 30 detik.",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Now",
+ "message": "Now",
+ "translation": "Sekarang",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "System clock wound backward!",
+ "message": "System clock wound backward!",
+ "translation": "Jam sistem mundur!",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "{Years} year(s)",
+ "message": "{Years} year(s)",
+ "translation": {
+ "select": {
+ "feature": "plural",
+ "arg": "Years",
+ "cases": {
+ "other": {
+ "msg": "{Years} tahun\n{Years} tahun"
+ }
+ }
+ }
+ },
+ "placeholders": [
+ {
+ "id": "Years",
+ "string": "%[1]d",
+ "type": "int64",
+ "underlyingType": "int64",
+ "argNum": 1,
+ "expr": "years"
+ }
+ ]
+ },
+ {
+ "id": "{Days} day(s)",
+ "message": "{Days} day(s)",
+ "translation": {
+ "select": {
+ "feature": "plural",
+ "arg": "Days",
+ "cases": {
+ "other": {
+ "msg": "{Days} Hari"
+ }
+ }
+ }
+ },
+ "placeholders": [
+ {
+ "id": "Days",
+ "string": "%[1]d",
+ "type": "int64",
+ "underlyingType": "int64",
+ "argNum": 1,
+ "expr": "days"
+ }
+ ]
+ },
+ {
+ "id": "{Hours} hour(s)",
+ "message": "{Hours} hour(s)",
+ "translation": {
+ "select": {
+ "feature": "plural",
+ "arg": "Hours",
+ "cases": {
+ "other": {
+ "msg": "{Hours} jam"
+ }
+ }
+ }
+ },
+ "placeholders": [
+ {
+ "id": "Hours",
+ "string": "%[1]d",
+ "type": "int64",
+ "underlyingType": "int64",
+ "argNum": 1,
+ "expr": "hours"
+ }
+ ]
+ },
+ {
+ "id": "{Minutes} minute(s)",
+ "message": "{Minutes} minute(s)",
+ "translation": {
+ "select": {
+ "feature": "plural",
+ "arg": "Minutes",
+ "cases": {
+ "other": {
+ "msg": "{Minutes} menit"
+ }
+ }
+ }
+ },
+ "placeholders": [
+ {
+ "id": "Minutes",
+ "string": "%[1]d",
+ "type": "int64",
+ "underlyingType": "int64",
+ "argNum": 1,
+ "expr": "minutes"
+ }
+ ]
+ },
+ {
+ "id": "{Seconds} second(s)",
+ "message": "{Seconds} second(s)",
+ "translation": {
+ "select": {
+ "feature": "plural",
+ "arg": "Seconds",
+ "cases": {
+ "other": {
+ "msg": "{Seconds} detik"
+ }
+ }
+ }
+ },
+ "placeholders": [
+ {
+ "id": "Seconds",
+ "string": "%[1]d",
+ "type": "int64",
+ "underlyingType": "int64",
+ "argNum": 1,
+ "expr": "seconds"
+ }
+ ]
+ },
+ {
+ "id": "{Timestamp} ago",
+ "message": "{Timestamp} ago",
+ "translation": "{Timestamp} yang lalu",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "Timestamp",
+ "string": "%[1]s",
+ "type": "string",
+ "underlyingType": "string",
+ "argNum": 1,
+ "expr": "timestamp"
+ }
+ ]
+ },
+ {
+ "id": "{Bytes} B",
+ "message": "{Bytes} B",
+ "translation": "{Bytes} B",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "Bytes",
+ "string": "%[1]d",
+ "type": "golang.zx2c4.com/wireguard/windows/conf.Bytes",
+ "underlyingType": "uint64",
+ "argNum": 1,
+ "expr": "b"
+ }
+ ]
+ },
+ {
+ "id": "{Float64b__1024} KiB",
+ "message": "{Float64b__1024} KiB",
+ "translation": "{Float64b__1024} KiB",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "Float64b__1024",
+ "string": "%.2[1]f",
+ "type": "float64",
+ "underlyingType": "float64",
+ "argNum": 1,
+ "expr": "float64(b) / 1024"
+ }
+ ]
+ },
+ {
+ "id": "{Float64b__1024__1024} MiB",
+ "message": "{Float64b__1024__1024} MiB",
+ "translation": "{Float64b__1024__1024} MiB",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "Float64b__1024__1024",
+ "string": "%.2[1]f",
+ "type": "float64",
+ "underlyingType": "float64",
+ "argNum": 1,
+ "expr": "float64(b) / (1024 * 1024)"
+ }
+ ]
+ },
+ {
+ "id": "{Float64b__1024__1024__1024} GiB",
+ "message": "{Float64b__1024__1024__1024} GiB",
+ "translation": "{Float64b__1024__1024__1024} GiB",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "Float64b__1024__1024__1024",
+ "string": "%.2[1]f",
+ "type": "float64",
+ "underlyingType": "float64",
+ "argNum": 1,
+ "expr": "float64(b) / (1024 * 1024 * 1024)"
+ }
+ ]
+ },
+ {
+ "id": "{Float64b__1024__1024__1024__1024} TiB",
+ "message": "{Float64b__1024__1024__1024__1024} TiB",
+ "translation": "{Float64b__1024__1024__1024__1024} TiB",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "Float64b__1024__1024__1024__1024",
+ "string": "%.2[1]f",
+ "type": "float64",
+ "underlyingType": "float64",
+ "argNum": 1,
+ "expr": "float64(b) / (1024 * 1024 * 1024) / 1024"
+ }
+ ]
+ },
+ {
+ "id": "{Why}: {Offender}",
+ "message": "{Why}: {Offender}",
+ "translation": "{Why}: {Offender}",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "Why",
+ "string": "%[1]s",
+ "type": "string",
+ "underlyingType": "string",
+ "argNum": 1,
+ "expr": "e.why"
+ },
+ {
+ "id": "Offender",
+ "string": "%[2]q",
+ "type": "string",
+ "underlyingType": "string",
+ "argNum": 2,
+ "expr": "e.offender"
+ }
+ ]
+ },
+ {
+ "id": "Invalid IP address",
+ "message": "Invalid IP address",
+ "translation": "Alamat IP tidak valid",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Invalid network prefix length",
+ "message": "Invalid network prefix length",
+ "translation": "Network prefix tidak valid",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Missing port from endpoint",
+ "message": "Missing port from endpoint",
+ "translation": "Port belum terisi dari endpoint",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Invalid endpoint host",
+ "message": "Invalid endpoint host",
+ "translation": "Host endpoint tidak valid",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Brackets must contain an IPv6 address",
+ "message": "Brackets must contain an IPv6 address",
+ "translation": "Dalam Kurung harus berisi alamat IPv6",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Invalid MTU",
+ "message": "Invalid MTU",
+ "translation": "MTU tidak valid",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Invalid port",
+ "message": "Invalid port",
+ "translation": "Port tidak valid",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Invalid persistent keepalive",
+ "message": "Invalid persistent keepalive",
+ "translation": "Persistent keepalive tidak valid",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Invalid key: {Err}",
+ "message": "Invalid key: {Err}",
+ "translation": "Kunci tidak sah:{Err}",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "Err",
+ "string": "%[1]v",
+ "type": "error",
+ "underlyingType": "interface{Error() string}",
+ "argNum": 1,
+ "expr": "err"
+ }
+ ]
+ },
+ {
+ "id": "Keys must decode to exactly 32 bytes",
+ "message": "Keys must decode to exactly 32 bytes",
+ "translation": "Kunci harus diterjemahkan tepat 32 byte",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Number must be a number between 0 and 2^64-1: {Err}",
+ "message": "Number must be a number between 0 and 2^64-1: {Err}",
+ "translation": "Nomor harus diantara 0 sampai dengan 2^64-1:{Err}",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "Err",
+ "string": "%[1]v",
+ "type": "error",
+ "underlyingType": "interface{Error() string}",
+ "argNum": 1,
+ "expr": "err"
+ }
+ ]
+ },
+ {
+ "id": "Two commas in a row",
+ "message": "Two commas in a row",
+ "translation": "Dua koma dalam satu baris",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Tunnel name is not valid",
+ "message": "Tunnel name is not valid",
+ "translation": "Nama Tunnel tidak valid",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Line must occur in a section",
+ "message": "Line must occur in a section",
+ "translation": "Garis harus muncul perbagian",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Key must have a value",
+ "message": "Key must have a value",
+ "translation": "Kunci harus memiliki value",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Invalid key for [Interface] section",
+ "message": "Invalid key for [Interface] section",
+ "translation": "Kunci tidak valid pada bagian [Interface]",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Invalid key for [Peer] section",
+ "message": "Invalid key for [Peer] section",
+ "translation": "Kunci tidak valid pada bagian [Peer]",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "An interface must have a private key",
+ "message": "An interface must have a private key",
+ "translation": "Interface harus memiliki Private Key",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "[none specified]",
+ "message": "[none specified]",
+ "translation": "Tidak Ditetapkan",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "All peers must have public keys",
+ "message": "All peers must have public keys",
+ "translation": "Semua peers harus memiliki kunci publik",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Error in getting configuration",
+ "message": "Error in getting configuration",
+ "translation": "Eror ketika mendapatkan konfigurasi",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Invalid key for interface section",
+ "message": "Invalid key for interface section",
+ "translation": "Kunci tidak valid pada bagian [Interface]",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Protocol version must be 1",
+ "message": "Protocol version must be 1",
+ "translation": "Versi protokol harus 1",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Invalid key for peer section",
+ "message": "Invalid key for peer section",
+ "translation": "Kunci tidak valid pada bagian [Peer]",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "[EnumerationSeparator]",
+ "message": "[EnumerationSeparator]",
+ "translation": ", ",
+ "comment": "Text to insert between items when listing - most western languages will translate ‘[EnumerationSeparator]’ into ‘, ’ to produce lists like ‘apple, orange, strawberry’. Eastern languages might translate into ‘、’ to produce lists like ‘リンゴ、オレンジ、イチゴ’."
+ },
+ {
+ "id": "About WireGuard",
+ "message": "About WireGuard",
+ "translation": "Tentang WireGuard",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "App version: {Number}\nGo backend version: {WireGuardGoVersion}\nGo version: {Version_go}\nOperating system: {OsName}\nArchitecture: {GOARCH}",
+ "message": "App version: {Number}\nGo backend version: {WireGuardGoVersion}\nGo version: {Version_go}\nOperating system: {OsName}\nArchitecture: {GOARCH}",
+ "translation": "Versi Aplikasi: {Number}\nVersi back-end Go: {WireGuardGoVersion}\nVersi Go: {Version_go}\nSistem Operasi: {OsName}\nArsitektur: {GOARCH}",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "Number",
+ "string": "%[1]s",
+ "type": "string",
+ "underlyingType": "string",
+ "argNum": 1,
+ "expr": "version.Number"
+ },
+ {
+ "id": "WireGuardGoVersion",
+ "string": "%[2]s",
+ "type": "string",
+ "underlyingType": "string",
+ "argNum": 2,
+ "expr": "device.WireGuardGoVersion"
+ },
+ {
+ "id": "Version_go",
+ "string": "%[3]s",
+ "type": "string",
+ "underlyingType": "string",
+ "argNum": 3,
+ "expr": "strings.TrimPrefix(runtime.Version(), \"go\")"
+ },
+ {
+ "id": "OsName",
+ "string": "%[4]s",
+ "type": "string",
+ "underlyingType": "string",
+ "argNum": 4,
+ "expr": "version.OsName()"
+ },
+ {
+ "id": "GOARCH",
+ "string": "%[5]s",
+ "type": "string",
+ "underlyingType": "string",
+ "argNum": 5,
+ "expr": "runtime.GOARCH"
+ }
+ ]
+ },
+ {
+ "id": "Close",
+ "message": "Close",
+ "translation": "Tutup",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "♥ &Donate!",
+ "message": "♥ &Donate!",
+ "translation": "♥ &Donasi!",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Status:",
+ "message": "Status:",
+ "translation": "Status:",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Active",
+ "message": "Active",
+ "translation": "Aktif",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Activating",
+ "message": "Activating",
+ "translation": "Mengaktifkan",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Inactive",
+ "message": "Inactive",
+ "translation": "Nonaktif",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Deactivating",
+ "message": "Deactivating",
+ "translation": "Menonaktifkan",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Unknown state",
+ "message": "Unknown state",
+ "translation": "Status tidak diketahui",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Log",
+ "message": "Log",
+ "translation": "Catatan",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "&Copy",
+ "message": "&Copy",
+ "translation": "Salin",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Select &all",
+ "message": "Select &all",
+ "translation": "Pilih semua",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "&Save to file…",
+ "message": "&Save to file…",
+ "translation": "Menyimpan ke dalam berkas…",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Time",
+ "message": "Time",
+ "translation": "Waktu",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Log message",
+ "message": "Log message",
+ "translation": "Pesan log",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Text Files (*.txt)|*.txt|All Files (*.*)|*.*",
+ "message": "Text Files (*.txt)|*.txt|All Files (*.*)|*.*",
+ "translation": "Berkas Txt (*.Txt)|*.Txt|Semua berkas (*.*)|*.*",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Export log to file",
+ "message": "Export log to file",
+ "translation": "Ekspor log kedalam file",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "&About WireGuard…",
+ "message": "&About WireGuard…",
+ "translation": "&Tentang WireGuard…",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Tunnel Error",
+ "message": "Tunnel Error",
+ "translation": "Tunnel eror",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "{ErrMsg}\n\nPlease consult the log for more information.",
+ "message": "{ErrMsg}\n\nPlease consult the log for more information.",
+ "translation": "{ErrMsg}\n\nSilakan baca log untuk informasi lebih lanjut.",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "ErrMsg",
+ "string": "%[1]s",
+ "type": "string",
+ "underlyingType": "string",
+ "argNum": 1,
+ "expr": "errMsg"
+ }
+ ]
+ },
+ {
+ "id": "{Title} (out of date)",
+ "message": "{Title} (out of date)",
+ "translation": "{Title} (kadaluarsa)",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "Title",
+ "string": "%[1]s",
+ "type": "string",
+ "underlyingType": "string",
+ "argNum": 1,
+ "expr": "mtw.Title()"
+ }
+ ]
+ },
+ {
+ "id": "WireGuard Detection Error",
+ "message": "WireGuard Detection Error",
+ "translation": "Deteksi eror WireGuard",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Unable to wait for WireGuard window to appear: {Err}",
+ "message": "Unable to wait for WireGuard window to appear: {Err}",
+ "translation": "Tidak dapat menunggu jendela WireGuard muncul: {Err}",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "Err",
+ "string": "%[1]v",
+ "type": "error",
+ "underlyingType": "interface{Error() string}",
+ "argNum": 1,
+ "expr": "err"
+ }
+ ]
+ },
+ {
+ "id": "WireGuard: Deactivated",
+ "message": "WireGuard: Deactivated",
+ "translation": "WireGuard: Dinonaktifkan",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Status: Unknown",
+ "message": "Status: Unknown",
+ "translation": "Status: Tidak diketahui",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Addresses: None",
+ "message": "Addresses: None",
+ "translation": "Alamat: Kosong",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "&Manage tunnels…",
+ "message": "&Manage tunnels…",
+ "translation": "&Manajer Tunnel…",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "&Import tunnel(s) from file…",
+ "message": "&Import tunnel(s) from file…",
+ "translation": "&Impor tunnel dari file…",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "E&xit",
+ "message": "E&xit",
+ "translation": "&Keluar",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "WireGuard Tunnel Error",
+ "message": "WireGuard Tunnel Error",
+ "translation": "Wireguard Tunnel Eror",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "WireGuard: {TextForStateglobalState_true}",
+ "message": "WireGuard: {TextForStateglobalState_true}",
+ "translation": "WireGuard: {TextForStateglobalState_true}",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "TextForStateglobalState_true",
+ "string": "%[1]s",
+ "type": "string",
+ "underlyingType": "string",
+ "argNum": 1,
+ "expr": "textForState(globalState, true)"
+ }
+ ]
+ },
+ {
+ "id": "Status: {StateText}",
+ "message": "Status: {StateText}",
+ "translation": "Status: {StateText}",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "StateText",
+ "string": "%[1]s",
+ "type": "string",
+ "underlyingType": "string",
+ "argNum": 1,
+ "expr": "stateText"
+ }
+ ]
+ },
+ {
+ "id": "Export all tunnels to &zip…",
+ "message": "Export all tunnels to &zip…",
+ "translation": "Ekspor semua tunnel ke &zip…",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Edit &selected tunnel…",
+ "message": "Edit &selected tunnel…",
+ "translation": "Ubah tunnel &terpilih…",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "&Remove selected tunnel(s)",
+ "message": "&Remove selected tunnel(s)",
+ "translation": "&Hapus tunnel terpilih",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Could not import selected configuration: {LastErr}",
+ "message": "Could not import selected configuration: {LastErr}",
+ "translation": "Tidak dapat mengimpor konfigurasi yang dipilih: {LastErr}",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "LastErr",
+ "string": "%[1]v",
+ "type": "error",
+ "underlyingType": "interface{Error() string}",
+ "argNum": 1,
+ "expr": "lastErr"
+ }
+ ]
+ }
+ ]
+} \ No newline at end of file
diff --git a/locales/it/messages.gotext.json b/locales/it/messages.gotext.json
index c2ff1eec..7943e5da 100644
--- a/locales/it/messages.gotext.json
+++ b/locales/it/messages.gotext.json
@@ -496,12 +496,6 @@
"translatorComment": "Copied from source."
},
{
- "id": "Invalid config key is missing an equals separator",
- "message": "Invalid config key is missing an equals separator",
- "translation": "Chiave di configurazione non valida manca di un separatore di uguale",
- "translatorComment": "Copied from source."
- },
- {
"id": "Key must have a value",
"message": "Key must have a value",
"translation": "La chiave deve avere un valore",
diff --git a/locales/ja/messages.gotext.json b/locales/ja/messages.gotext.json
index 8c1a7ddc..fefebc1d 100644
--- a/locales/ja/messages.gotext.json
+++ b/locales/ja/messages.gotext.json
@@ -481,12 +481,6 @@
"translatorComment": "Copied from source."
},
{
- "id": "Invalid config key is missing an equals separator",
- "message": "Invalid config key is missing an equals separator",
- "translation": "イコール(=)が無いためキー項目として不正です",
- "translatorComment": "Copied from source."
- },
- {
"id": "Key must have a value",
"message": "Key must have a value",
"translation": "キー項目に対応する値がありません",
diff --git a/locales/pl/messages.gotext.json b/locales/pl/messages.gotext.json
new file mode 100644
index 00000000..da52f616
--- /dev/null
+++ b/locales/pl/messages.gotext.json
@@ -0,0 +1,23 @@
+{
+ "language": "pl",
+ "messages": [
+ {
+ "id": "Error",
+ "message": "Error",
+ "translation": "Błąd",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Command Line Options",
+ "message": "Command Line Options",
+ "translation": "Opcje wiersza poleceń",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "You must use the 64-bit version of WireGuard on this computer.",
+ "message": "You must use the 64-bit version of WireGuard on this computer.",
+ "translation": "Musisz użyć 64-bitowej wersji WireGuard na tym komputerze.",
+ "translatorComment": "Copied from source."
+ }
+ ]
+} \ No newline at end of file
diff --git a/locales/ru/messages.gotext.json b/locales/ru/messages.gotext.json
index 1d5f6775..eac73b4c 100644
--- a/locales/ru/messages.gotext.json
+++ b/locales/ru/messages.gotext.json
@@ -526,12 +526,6 @@
"translatorComment": "Copied from source."
},
{
- "id": "Invalid config key is missing an equals separator",
- "message": "Invalid config key is missing an equals separator",
- "translation": "В ключе конфигурации отсутствует разделитель",
- "translatorComment": "Copied from source."
- },
- {
"id": "Key must have a value",
"message": "Key must have a value",
"translation": "Ключ должен иметь значение",
diff --git a/locales/sl/messages.gotext.json b/locales/sl/messages.gotext.json
index 2c7bd56d..0b1b4cbc 100644
--- a/locales/sl/messages.gotext.json
+++ b/locales/sl/messages.gotext.json
@@ -526,12 +526,6 @@
"translatorComment": "Copied from source."
},
{
- "id": "Invalid config key is missing an equals separator",
- "message": "Invalid config key is missing an equals separator",
- "translation": "Napačnemu ključu konfiguracije manjka ločilo-enačaj",
- "translatorComment": "Copied from source."
- },
- {
"id": "Key must have a value",
"message": "Key must have a value",
"translation": "Ključ mora imeti vrednost",
diff --git a/locales/vi/messages.gotext.json b/locales/vi/messages.gotext.json
new file mode 100644
index 00000000..b167b27f
--- /dev/null
+++ b/locales/vi/messages.gotext.json
@@ -0,0 +1,382 @@
+{
+ "language": "vi",
+ "messages": [
+ {
+ "id": "Error",
+ "message": "Error",
+ "translation": "Lỗi",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Now",
+ "message": "Now",
+ "translation": "Vừa xong",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "{Years} year(s)",
+ "message": "{Years} year(s)",
+ "translation": {
+ "select": {
+ "feature": "plural",
+ "arg": "Years",
+ "cases": {
+ "other": {
+ "msg": "{Years} năm"
+ }
+ }
+ }
+ },
+ "placeholders": [
+ {
+ "id": "Years",
+ "string": "%[1]d",
+ "type": "int64",
+ "underlyingType": "int64",
+ "argNum": 1,
+ "expr": "years"
+ }
+ ]
+ },
+ {
+ "id": "{Days} day(s)",
+ "message": "{Days} day(s)",
+ "translation": {
+ "select": {
+ "feature": "plural",
+ "arg": "Days",
+ "cases": {
+ "other": {
+ "msg": "{Days} ngày"
+ }
+ }
+ }
+ },
+ "placeholders": [
+ {
+ "id": "Days",
+ "string": "%[1]d",
+ "type": "int64",
+ "underlyingType": "int64",
+ "argNum": 1,
+ "expr": "days"
+ }
+ ]
+ },
+ {
+ "id": "{Hours} hour(s)",
+ "message": "{Hours} hour(s)",
+ "translation": {
+ "select": {
+ "feature": "plural",
+ "arg": "Hours",
+ "cases": {
+ "other": {
+ "msg": "{Hours} giờ"
+ }
+ }
+ }
+ },
+ "placeholders": [
+ {
+ "id": "Hours",
+ "string": "%[1]d",
+ "type": "int64",
+ "underlyingType": "int64",
+ "argNum": 1,
+ "expr": "hours"
+ }
+ ]
+ },
+ {
+ "id": "{Minutes} minute(s)",
+ "message": "{Minutes} minute(s)",
+ "translation": {
+ "select": {
+ "feature": "plural",
+ "arg": "Minutes",
+ "cases": {
+ "other": {
+ "msg": "{Minutes} phút"
+ }
+ }
+ }
+ },
+ "placeholders": [
+ {
+ "id": "Minutes",
+ "string": "%[1]d",
+ "type": "int64",
+ "underlyingType": "int64",
+ "argNum": 1,
+ "expr": "minutes"
+ }
+ ]
+ },
+ {
+ "id": "{Seconds} second(s)",
+ "message": "{Seconds} second(s)",
+ "translation": {
+ "select": {
+ "feature": "plural",
+ "arg": "Seconds",
+ "cases": {
+ "other": {
+ "msg": "{Seconds} giây"
+ }
+ }
+ }
+ },
+ "placeholders": [
+ {
+ "id": "Seconds",
+ "string": "%[1]d",
+ "type": "int64",
+ "underlyingType": "int64",
+ "argNum": 1,
+ "expr": "seconds"
+ }
+ ]
+ },
+ {
+ "id": "{Timestamp} ago",
+ "message": "{Timestamp} ago",
+ "translation": "{Timestamp} trước",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "Timestamp",
+ "string": "%[1]s",
+ "type": "string",
+ "underlyingType": "string",
+ "argNum": 1,
+ "expr": "timestamp"
+ }
+ ]
+ },
+ {
+ "id": "Invalid IP address",
+ "message": "Invalid IP address",
+ "translation": "Địa chỉ IP không hợp lệ",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Invalid port",
+ "message": "Invalid port",
+ "translation": "Cổng (port) không hợp lệ",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Tunnel name is not valid",
+ "message": "Tunnel name is not valid",
+ "translation": "Tên VPN không hợp lệ",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "About WireGuard",
+ "message": "About WireGuard",
+ "translation": "Thông tin về WireGuard",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "WireGuard logo image",
+ "message": "WireGuard logo image",
+ "translation": "Logo WireGuard",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "App version: {Number}\nGo backend version: {WireGuardGoVersion}\nGo version: {Version_go}\nOperating system: {OsName}\nArchitecture: {GOARCH}",
+ "message": "App version: {Number}\nGo backend version: {WireGuardGoVersion}\nGo version: {Version_go}\nOperating system: {OsName}\nArchitecture: {GOARCH}",
+ "translation": "Phiên bản ứng dụng: {Number}\nPhiên bản Golang của WG: {WireGuardGoVersion}\nPhiên bản Golang: {Version_go}\nHệ điều hành: {OsName}\nKiến trúc xử lý: {GOARCH}",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "Number",
+ "string": "%[1]s",
+ "type": "string",
+ "underlyingType": "string",
+ "argNum": 1,
+ "expr": "version.Number"
+ },
+ {
+ "id": "WireGuardGoVersion",
+ "string": "%[2]s",
+ "type": "string",
+ "underlyingType": "string",
+ "argNum": 2,
+ "expr": "device.WireGuardGoVersion"
+ },
+ {
+ "id": "Version_go",
+ "string": "%[3]s",
+ "type": "string",
+ "underlyingType": "string",
+ "argNum": 3,
+ "expr": "strings.TrimPrefix(runtime.Version(), \"go\")"
+ },
+ {
+ "id": "OsName",
+ "string": "%[4]s",
+ "type": "string",
+ "underlyingType": "string",
+ "argNum": 4,
+ "expr": "version.OsName()"
+ },
+ {
+ "id": "GOARCH",
+ "string": "%[5]s",
+ "type": "string",
+ "underlyingType": "string",
+ "argNum": 5,
+ "expr": "runtime.GOARCH"
+ }
+ ]
+ },
+ {
+ "id": "Close",
+ "message": "Close",
+ "translation": "Đóng",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Status:",
+ "message": "Status:",
+ "translation": "Trạng thái:",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Endpoint:",
+ "message": "Endpoint:",
+ "translation": "Đầu cuối:",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "enabled",
+ "message": "enabled",
+ "translation": "đã kích hoạt",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "{String} received, {String_1} sent",
+ "message": "{String} received, {String_1} sent",
+ "translation": "Nhận {String}, gứi {String_1}",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "String",
+ "string": "%[1]s",
+ "type": "string",
+ "underlyingType": "string",
+ "argNum": 1,
+ "expr": "c.RxBytes.String()"
+ },
+ {
+ "id": "String_1",
+ "string": "%[2]s",
+ "type": "string",
+ "underlyingType": "string",
+ "argNum": 2,
+ "expr": "c.TxBytes.String()"
+ }
+ ]
+ },
+ {
+ "id": "Failed to determine tunnel state",
+ "message": "Failed to determine tunnel state",
+ "translation": "Không thể xác định tình trạng VPN",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Failed to activate tunnel",
+ "message": "Failed to activate tunnel",
+ "translation": "Không thể kích hoạt VPN",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Failed to deactivate tunnel",
+ "message": "Failed to deactivate tunnel",
+ "translation": "Không thể vô hiệu hóa VPN",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Peer",
+ "message": "Peer",
+ "translation": "Mạng ngang hàng",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Create new tunnel",
+ "message": "Create new tunnel",
+ "translation": "Tạo VPN",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Edit tunnel",
+ "message": "Edit tunnel",
+ "translation": "Chỉnh sửa VPN",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Cancel",
+ "message": "Cancel",
+ "translation": "Huỷ",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Invalid name",
+ "message": "Invalid name",
+ "translation": "Tên không hợp lệ",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "A name is required.",
+ "message": "A name is required.",
+ "translation": "Yêu cầu nhập tên.",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Tunnel name ‘{NewName}’ is invalid.",
+ "message": "Tunnel name ‘{NewName}’ is invalid.",
+ "translation": "Tên VPN ‘{NewName}' không hợp lệ.",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "NewName",
+ "string": "%[1]s",
+ "type": "string",
+ "underlyingType": "string",
+ "argNum": 1,
+ "expr": "newName"
+ }
+ ]
+ },
+ {
+ "id": "Unable to list existing tunnels",
+ "message": "Unable to list existing tunnels",
+ "translation": "Không thể liệt kê các VPN",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Tunnel already exists",
+ "message": "Tunnel already exists",
+ "translation": "VPN đã tồn tại",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Another tunnel already exists with the name ‘{NewName}’.",
+ "message": "Another tunnel already exists with the name ‘{NewName}’.",
+ "translation": "Đã tồn tại VPN với tên ‘{NewName}’.",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "NewName",
+ "string": "%[1]s",
+ "type": "string",
+ "underlyingType": "string",
+ "argNum": 1,
+ "expr": "newName"
+ }
+ ]
+ }
+ ]
+} \ No newline at end of file
diff --git a/locales/zh-CN/messages.gotext.json b/locales/zh-CN/messages.gotext.json
index d16d523d..26929dc5 100644
--- a/locales/zh-CN/messages.gotext.json
+++ b/locales/zh-CN/messages.gotext.json
@@ -481,12 +481,6 @@
"translatorComment": "Copied from source."
},
{
- "id": "Invalid config key is missing an equals separator",
- "message": "Invalid config key is missing an equals separator",
- "translation": "无效的配置键缺少一个等于分隔符",
- "translatorComment": "Copied from source."
- },
- {
"id": "Key must have a value",
"message": "Key must have a value",
"translation": "键必须有一个值",
diff --git a/locales/zh-TW/messages.gotext.json b/locales/zh-TW/messages.gotext.json
new file mode 100644
index 00000000..55167a1e
--- /dev/null
+++ b/locales/zh-TW/messages.gotext.json
@@ -0,0 +1,1761 @@
+{
+ "language": "zh-TW",
+ "messages": [
+ {
+ "id": "Error",
+ "message": "Error",
+ "translation": "錯誤",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "(no argument): elevate and install manager service",
+ "message": "(no argument): elevate and install manager service",
+ "translation": "(無參數):提升權限並安裝管理服務",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Usage: {Args0} [\n{String}]",
+ "message": "Usage: {Args0} [\n{String}]",
+ "translation": "使用方法: {Args0} [\n{String}]",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "Args0",
+ "string": "%[1]s",
+ "type": "string",
+ "underlyingType": "string",
+ "argNum": 1,
+ "expr": "os.Args[0]"
+ },
+ {
+ "id": "String",
+ "string": "%[2]s",
+ "type": "string",
+ "underlyingType": "string",
+ "argNum": 2,
+ "expr": "builder.String()"
+ }
+ ]
+ },
+ {
+ "id": "Command Line Options",
+ "message": "Command Line Options",
+ "translation": "命令列選項",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Unable to determine whether the process is running under WOW64: {Err}",
+ "message": "Unable to determine whether the process is running under WOW64: {Err}",
+ "translation": "無法確定該處理程序是否在 WOW64 下執行: {Err}",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "Err",
+ "string": "%[1]v",
+ "type": "error",
+ "underlyingType": "interface{Error() string}",
+ "argNum": 1,
+ "expr": "err"
+ }
+ ]
+ },
+ {
+ "id": "You must use the 64-bit version of WireGuard on this computer.",
+ "message": "You must use the 64-bit version of WireGuard on this computer.",
+ "translation": "您必須在此電腦上執行 64 位元版本的 WireGuard。",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Unable to open current process token: {Err}",
+ "message": "Unable to open current process token: {Err}",
+ "translation": "無法開啓目前處理程序的權杖: {Err}",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "Err",
+ "string": "%[1]v",
+ "type": "error",
+ "underlyingType": "interface{Error() string}",
+ "argNum": 1,
+ "expr": "err"
+ }
+ ]
+ },
+ {
+ "id": "WireGuard may only be used by users who are a member of the Builtin {AdminGroupName} group.",
+ "message": "WireGuard may only be used by users who are a member of the Builtin {AdminGroupName} group.",
+ "translation": "WireGuard 可能只能被內建的「{AdminGroupName}」群組成員使用。",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "AdminGroupName",
+ "string": "%[1]s",
+ "type": "string",
+ "underlyingType": "string",
+ "argNum": 1,
+ "expr": "elevate.AdminGroupName()"
+ }
+ ]
+ },
+ {
+ "id": "WireGuard is running, but the UI is only accessible from desktops of the Builtin {AdminGroupName} group.",
+ "message": "WireGuard is running, but the UI is only accessible from desktops of the Builtin {AdminGroupName} group.",
+ "translation": "WireGuard 正在執行,但 UI 只能從內建的內建的「{AdminGroupName}」群組成員的桌面存取。",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "AdminGroupName",
+ "string": "%[1]s",
+ "type": "string",
+ "underlyingType": "string",
+ "argNum": 1,
+ "expr": "elevate.AdminGroupName()"
+ }
+ ]
+ },
+ {
+ "id": "WireGuard system tray icon did not appear after 30 seconds.",
+ "message": "WireGuard system tray icon did not appear after 30 seconds.",
+ "translation": "WireGuard 的工作列圖示在 30 秒後並沒有顯示。",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Now",
+ "message": "Now",
+ "translation": "就是現在",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "System clock wound backward!",
+ "message": "System clock wound backward!",
+ "translation": "系統時鐘倒退了!",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "{Years} year(s)",
+ "message": "{Years} year(s)",
+ "translation": {
+ "select": {
+ "feature": "plural",
+ "arg": "Years",
+ "cases": {
+ "other": {
+ "msg": "{Years} 年"
+ }
+ }
+ }
+ },
+ "placeholders": [
+ {
+ "id": "Years",
+ "string": "%[1]d",
+ "type": "int64",
+ "underlyingType": "int64",
+ "argNum": 1,
+ "expr": "years"
+ }
+ ]
+ },
+ {
+ "id": "{Days} day(s)",
+ "message": "{Days} day(s)",
+ "translation": {
+ "select": {
+ "feature": "plural",
+ "arg": "Days",
+ "cases": {
+ "other": {
+ "msg": "{Days} 天"
+ }
+ }
+ }
+ },
+ "placeholders": [
+ {
+ "id": "Days",
+ "string": "%[1]d",
+ "type": "int64",
+ "underlyingType": "int64",
+ "argNum": 1,
+ "expr": "days"
+ }
+ ]
+ },
+ {
+ "id": "{Hours} hour(s)",
+ "message": "{Hours} hour(s)",
+ "translation": {
+ "select": {
+ "feature": "plural",
+ "arg": "Hours",
+ "cases": {
+ "other": {
+ "msg": "{Hours} 小時"
+ }
+ }
+ }
+ },
+ "placeholders": [
+ {
+ "id": "Hours",
+ "string": "%[1]d",
+ "type": "int64",
+ "underlyingType": "int64",
+ "argNum": 1,
+ "expr": "hours"
+ }
+ ]
+ },
+ {
+ "id": "{Minutes} minute(s)",
+ "message": "{Minutes} minute(s)",
+ "translation": {
+ "select": {
+ "feature": "plural",
+ "arg": "Minutes",
+ "cases": {
+ "other": {
+ "msg": "{Minutes} 分鐘"
+ }
+ }
+ }
+ },
+ "placeholders": [
+ {
+ "id": "Minutes",
+ "string": "%[1]d",
+ "type": "int64",
+ "underlyingType": "int64",
+ "argNum": 1,
+ "expr": "minutes"
+ }
+ ]
+ },
+ {
+ "id": "{Seconds} second(s)",
+ "message": "{Seconds} second(s)",
+ "translation": {
+ "select": {
+ "feature": "plural",
+ "arg": "Seconds",
+ "cases": {
+ "other": {
+ "msg": "{Seconds} 秒"
+ }
+ }
+ }
+ },
+ "placeholders": [
+ {
+ "id": "Seconds",
+ "string": "%[1]d",
+ "type": "int64",
+ "underlyingType": "int64",
+ "argNum": 1,
+ "expr": "seconds"
+ }
+ ]
+ },
+ {
+ "id": "{Timestamp} ago",
+ "message": "{Timestamp} ago",
+ "translation": "{Timestamp} 前",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "Timestamp",
+ "string": "%[1]s",
+ "type": "string",
+ "underlyingType": "string",
+ "argNum": 1,
+ "expr": "timestamp"
+ }
+ ]
+ },
+ {
+ "id": "{Bytes} B",
+ "message": "{Bytes} B",
+ "translation": "{Bytes} B",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "Bytes",
+ "string": "%[1]d",
+ "type": "golang.zx2c4.com/wireguard/windows/conf.Bytes",
+ "underlyingType": "uint64",
+ "argNum": 1,
+ "expr": "b"
+ }
+ ]
+ },
+ {
+ "id": "{Float64b__1024} KiB",
+ "message": "{Float64b__1024} KiB",
+ "translation": "{Float64b__1024} KiB",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "Float64b__1024",
+ "string": "%.2[1]f",
+ "type": "float64",
+ "underlyingType": "float64",
+ "argNum": 1,
+ "expr": "float64(b) / 1024"
+ }
+ ]
+ },
+ {
+ "id": "{Float64b__1024__1024} MiB",
+ "message": "{Float64b__1024__1024} MiB",
+ "translation": "{Float64b__1024__1024} MiB",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "Float64b__1024__1024",
+ "string": "%.2[1]f",
+ "type": "float64",
+ "underlyingType": "float64",
+ "argNum": 1,
+ "expr": "float64(b) / (1024 * 1024)"
+ }
+ ]
+ },
+ {
+ "id": "{Float64b__1024__1024__1024} GiB",
+ "message": "{Float64b__1024__1024__1024} GiB",
+ "translation": "{Float64b__1024__1024__1024} GiB",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "Float64b__1024__1024__1024",
+ "string": "%.2[1]f",
+ "type": "float64",
+ "underlyingType": "float64",
+ "argNum": 1,
+ "expr": "float64(b) / (1024 * 1024 * 1024)"
+ }
+ ]
+ },
+ {
+ "id": "{Float64b__1024__1024__1024__1024} TiB",
+ "message": "{Float64b__1024__1024__1024__1024} TiB",
+ "translation": "{Float64b__1024__1024__1024__1024} TiB",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "Float64b__1024__1024__1024__1024",
+ "string": "%.2[1]f",
+ "type": "float64",
+ "underlyingType": "float64",
+ "argNum": 1,
+ "expr": "float64(b) / (1024 * 1024 * 1024) / 1024"
+ }
+ ]
+ },
+ {
+ "id": "{Why}: {Offender}",
+ "message": "{Why}: {Offender}",
+ "translation": "{Why}: {Offender}",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "Why",
+ "string": "%[1]s",
+ "type": "string",
+ "underlyingType": "string",
+ "argNum": 1,
+ "expr": "e.why"
+ },
+ {
+ "id": "Offender",
+ "string": "%[2]q",
+ "type": "string",
+ "underlyingType": "string",
+ "argNum": 2,
+ "expr": "e.offender"
+ }
+ ]
+ },
+ {
+ "id": "Invalid IP address",
+ "message": "Invalid IP address",
+ "translation": "無效的 IP 位址",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Invalid network prefix length",
+ "message": "Invalid network prefix length",
+ "translation": "無效的網路位址首碼長度",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Missing port from endpoint",
+ "message": "Missing port from endpoint",
+ "translation": "Endpoint 中沒有指定埠號",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Invalid endpoint host",
+ "message": "Invalid endpoint host",
+ "translation": "無效的 Endpoint 位址",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Brackets must contain an IPv6 address",
+ "message": "Brackets must contain an IPv6 address",
+ "translation": "括號中必須包含一個 IPv6 位址",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Invalid MTU",
+ "message": "Invalid MTU",
+ "translation": "無效的 MTU",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Invalid port",
+ "message": "Invalid port",
+ "translation": "無效的埠號",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Invalid persistent keepalive",
+ "message": "Invalid persistent keepalive",
+ "translation": "無效的 Persistent Keepalive 設定",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Invalid key: {Err}",
+ "message": "Invalid key: {Err}",
+ "translation": "無效的金鑰: {Err}",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "Err",
+ "string": "%[1]v",
+ "type": "error",
+ "underlyingType": "interface{Error() string}",
+ "argNum": 1,
+ "expr": "err"
+ }
+ ]
+ },
+ {
+ "id": "Keys must decode to exactly 32 bytes",
+ "message": "Keys must decode to exactly 32 bytes",
+ "translation": "金鑰必須剛好長 32 bytes",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Number must be a number between 0 and 2^64-1: {Err}",
+ "message": "Number must be a number between 0 and 2^64-1: {Err}",
+ "translation": "數值必須介於 0 到 2^64-1: {Err}",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "Err",
+ "string": "%[1]v",
+ "type": "error",
+ "underlyingType": "interface{Error() string}",
+ "argNum": 1,
+ "expr": "err"
+ }
+ ]
+ },
+ {
+ "id": "Two commas in a row",
+ "message": "Two commas in a row",
+ "translation": "一行中有兩個逗號",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Tunnel name is not valid",
+ "message": "Tunnel name is not valid",
+ "translation": "隧道名稱無效",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Line must occur in a section",
+ "message": "Line must occur in a section",
+ "translation": "行必須出現在段落中",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Config key is missing an equals separator",
+ "message": "Config key is missing an equals separator",
+ "translation": "設定的項目必須要有一個等號",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Key must have a value",
+ "message": "Key must have a value",
+ "translation": "必須要有一個值",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Invalid key for [Interface] section",
+ "message": "Invalid key for [Interface] section",
+ "translation": "[Interface] 中有無效選項",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Invalid key for [Peer] section",
+ "message": "Invalid key for [Peer] section",
+ "translation": "[Peer] 中有無效選項",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "An interface must have a private key",
+ "message": "An interface must have a private key",
+ "translation": "Interface 中必須要有一把私鑰",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "[none specified]",
+ "message": "[none specified]",
+ "translation": "[未指定]",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "All peers must have public keys",
+ "message": "All peers must have public keys",
+ "translation": "每個 Peer 都必須要有公鑰",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Error in getting configuration",
+ "message": "Error in getting configuration",
+ "translation": "讀取設定時發生錯誤",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Invalid key for interface section",
+ "message": "Invalid key for interface section",
+ "translation": "Interface 中的金鑰無效",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Protocol version must be 1",
+ "message": "Protocol version must be 1",
+ "translation": "協定版本必須為 1",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Invalid key for peer section",
+ "message": "Invalid key for peer section",
+ "translation": "Peer 中的金鑰無效",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "[EnumerationSeparator]",
+ "message": "[EnumerationSeparator]",
+ "translation": "、",
+ "comment": "Text to insert between items when listing - most western languages will translate ‘[EnumerationSeparator]’ into ‘, ’ to produce lists like ‘apple, orange, strawberry’. Eastern languages might translate into ‘、’ to produce lists like ‘リンゴ、オレンジ、イチゴ’."
+ },
+ {
+ "id": "[UnitSeparator]",
+ "message": "[UnitSeparator]",
+ "translation": " ",
+ "comment": "Text to insert when combining units of a measure - most languages will translate ‘[UnitSeparator]’ into ‘ ’ (space) to produce lists like ‘2 minuti 30 sekund’, or empty string ‘’ to produce ‘2分30秒’."
+ },
+ {
+ "id": "About WireGuard",
+ "message": "About WireGuard",
+ "translation": "關於 WireGuard",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "WireGuard logo image",
+ "message": "WireGuard logo image",
+ "translation": "WireGuard logo 圖片",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "App version: {Number}\nGo backend version: {WireGuardGoVersion}\nGo version: {Version_go}\nOperating system: {OsName}\nArchitecture: {GOARCH}",
+ "message": "App version: {Number}\nGo backend version: {WireGuardGoVersion}\nGo version: {Version_go}\nOperating system: {OsName}\nArchitecture: {GOARCH}",
+ "translation": "應用程式版本: {Number}\n後端程式(Go 實作)版本: {WireGuardGoVersion}\nGo 版本: {Version_go}\n作業系統: {OsName}\n架構: {GOARCH}",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "Number",
+ "string": "%[1]s",
+ "type": "string",
+ "underlyingType": "string",
+ "argNum": 1,
+ "expr": "version.Number"
+ },
+ {
+ "id": "WireGuardGoVersion",
+ "string": "%[2]s",
+ "type": "string",
+ "underlyingType": "string",
+ "argNum": 2,
+ "expr": "device.WireGuardGoVersion"
+ },
+ {
+ "id": "Version_go",
+ "string": "%[3]s",
+ "type": "string",
+ "underlyingType": "string",
+ "argNum": 3,
+ "expr": "strings.TrimPrefix(runtime.Version(), \"go\")"
+ },
+ {
+ "id": "OsName",
+ "string": "%[4]s",
+ "type": "string",
+ "underlyingType": "string",
+ "argNum": 4,
+ "expr": "version.OsName()"
+ },
+ {
+ "id": "GOARCH",
+ "string": "%[5]s",
+ "type": "string",
+ "underlyingType": "string",
+ "argNum": 5,
+ "expr": "runtime.GOARCH"
+ }
+ ]
+ },
+ {
+ "id": "Close",
+ "message": "Close",
+ "translation": "關閉",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "♥ &Donate!",
+ "message": "♥ &Donate!",
+ "translation": "♥ 捐贈! (&D)",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Status:",
+ "message": "Status:",
+ "translation": "狀態",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "&Deactivate",
+ "message": "&Deactivate",
+ "translation": "中斷連線 (&D)",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "&Activate",
+ "message": "&Activate",
+ "translation": "連線 (&A)",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Public key:",
+ "message": "Public key:",
+ "translation": "公鑰",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Listen port:",
+ "message": "Listen port:",
+ "translation": "監聽埠",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "MTU:",
+ "message": "MTU:",
+ "translation": "MTU",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Addresses:",
+ "message": "Addresses:",
+ "translation": "位址",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "DNS servers:",
+ "message": "DNS servers:",
+ "translation": "DNS 伺服器",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Preshared key:",
+ "message": "Preshared key:",
+ "translation": "預交換金鑰",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Allowed IPs:",
+ "message": "Allowed IPs:",
+ "translation": "允許的位址",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Endpoint:",
+ "message": "Endpoint:",
+ "translation": "連接點",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Persistent keepalive:",
+ "message": "Persistent keepalive:",
+ "translation": "Keepalive 間隔",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Latest handshake:",
+ "message": "Latest handshake:",
+ "translation": "最後交握時間",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Transfer:",
+ "message": "Transfer:",
+ "translation": "流量",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "enabled",
+ "message": "enabled",
+ "translation": "已啓用",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "{String} received, {String_1} sent",
+ "message": "{String} received, {String_1} sent",
+ "translation": "已收到 {String};已傳送 {String_1}",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "String",
+ "string": "%[1]s",
+ "type": "string",
+ "underlyingType": "string",
+ "argNum": 1,
+ "expr": "c.RxBytes.String()"
+ },
+ {
+ "id": "String_1",
+ "string": "%[2]s",
+ "type": "string",
+ "underlyingType": "string",
+ "argNum": 2,
+ "expr": "c.TxBytes.String()"
+ }
+ ]
+ },
+ {
+ "id": "Failed to determine tunnel state",
+ "message": "Failed to determine tunnel state",
+ "translation": "無法確認隧道狀態",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Failed to activate tunnel",
+ "message": "Failed to activate tunnel",
+ "translation": "無法連接隧道",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Failed to deactivate tunnel",
+ "message": "Failed to deactivate tunnel",
+ "translation": "無法斷開隧道連線",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Interface: {Name}",
+ "message": "Interface: {Name}",
+ "translation": "[隧道] {Name}",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "Name",
+ "string": "%[1]s",
+ "type": "string",
+ "underlyingType": "string",
+ "argNum": 1,
+ "expr": "config.Name"
+ }
+ ]
+ },
+ {
+ "id": "Peer",
+ "message": "Peer",
+ "translation": "節點",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Create new tunnel",
+ "message": "Create new tunnel",
+ "translation": "建立新隧道",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Edit tunnel",
+ "message": "Edit tunnel",
+ "translation": "編輯隧道設定",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "&Name:",
+ "message": "&Name:",
+ "translation": "名稱 (&N)",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "&Public key:",
+ "message": "&Public key:",
+ "translation": "公鑰 (&P)",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "(unknown)",
+ "message": "(unknown)",
+ "translation": "(未知)",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "&Block untunneled traffic (kill-switch)",
+ "message": "&Block untunneled traffic (kill-switch)",
+ "translation": "阻斷未經過隧道的流量(kill-switch) (&B)",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "When a configuration has exactly one peer, and that peer has an allowed IPs containing at least one of 0.0.0.0/0 or ::/0, then the tunnel service engages a firewall ruleset to block all traffic that is neither to nor from the tunnel interface, with special exceptions for DHCP and NDP.",
+ "message": "When a configuration has exactly one peer, and that peer has an allowed IPs containing at least one of 0.0.0.0/0 or ::/0, then the tunnel service engages a firewall ruleset to block all traffic that is neither to nor from the tunnel interface, with special exceptions for DHCP and NDP.",
+ "translation": "只有一個節點且該節點允許位址包含 0.0.0.0/0 或 ::/0 時,使用防火牆攔截所有非通過隧道的流量。\n(DHCP 及 NDP 流量除外)",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "&Save",
+ "message": "&Save",
+ "translation": "儲存 (&S)",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Cancel",
+ "message": "Cancel",
+ "translation": "取消",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "&Configuration:",
+ "message": "&Configuration:",
+ "translation": "設定 (&C)",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Invalid name",
+ "message": "Invalid name",
+ "translation": "無效的名稱",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "A name is required.",
+ "message": "A name is required.",
+ "translation": "必須填寫名稱。",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Tunnel name ‘{NewName}’ is invalid.",
+ "message": "Tunnel name ‘{NewName}’ is invalid.",
+ "translation": "無效的隧道名稱「{NewName}」。",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "NewName",
+ "string": "%[1]s",
+ "type": "string",
+ "underlyingType": "string",
+ "argNum": 1,
+ "expr": "newName"
+ }
+ ]
+ },
+ {
+ "id": "Unable to list existing tunnels",
+ "message": "Unable to list existing tunnels",
+ "translation": "無法列出現有隧道",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Tunnel already exists",
+ "message": "Tunnel already exists",
+ "translation": "隧道已存在",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Another tunnel already exists with the name ‘{NewName}’.",
+ "message": "Another tunnel already exists with the name ‘{NewName}’.",
+ "translation": "已有同名隧道「{NewName}」。",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "NewName",
+ "string": "%[1]s",
+ "type": "string",
+ "underlyingType": "string",
+ "argNum": 1,
+ "expr": "newName"
+ }
+ ]
+ },
+ {
+ "id": "Unable to create new configuration",
+ "message": "Unable to create new configuration",
+ "translation": "無法建立新的隧道設定",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Writing file failed",
+ "message": "Writing file failed",
+ "translation": "檔案寫入失敗",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "File ‘{FilePath}’ already exists.\n\nDo you want to overwrite it?",
+ "message": "File ‘{FilePath}’ already exists.\n\nDo you want to overwrite it?",
+ "translation": "檔案已存在: {FilePath}\n\n您確定要覆蓋嗎?",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "FilePath",
+ "string": "%[1]s",
+ "type": "string",
+ "underlyingType": "string",
+ "argNum": 1,
+ "expr": "filePath"
+ }
+ ]
+ },
+ {
+ "id": "Active",
+ "message": "Active",
+ "translation": "已連線",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Activating",
+ "message": "Activating",
+ "translation": "正在連線…",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Inactive",
+ "message": "Inactive",
+ "translation": "已中斷連線",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Deactivating",
+ "message": "Deactivating",
+ "translation": "正在中斷…",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Unknown state",
+ "message": "Unknown state",
+ "translation": "未知",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Log",
+ "message": "Log",
+ "translation": "日誌",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "&Copy",
+ "message": "&Copy",
+ "translation": "複製 (&C)",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Select &all",
+ "message": "Select &all",
+ "translation": "全選 (&A)",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "&Save to file…",
+ "message": "&Save to file…",
+ "translation": "匯出… (&S)",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Time",
+ "message": "Time",
+ "translation": "時間",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Log message",
+ "message": "Log message",
+ "translation": "日誌訊息",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Text Files (*.txt)|*.txt|All Files (*.*)|*.*",
+ "message": "Text Files (*.txt)|*.txt|All Files (*.*)|*.*",
+ "translation": "純文字 (*.txt)|*.txt|所有檔案 (*.*)|*.*",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Export log to file",
+ "message": "Export log to file",
+ "translation": "匯出日誌…",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "&About WireGuard…",
+ "message": "&About WireGuard…",
+ "translation": "關於 WireGuard (&A)",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Tunnel Error",
+ "message": "Tunnel Error",
+ "translation": "隧道錯誤",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "{ErrMsg}\n\nPlease consult the log for more information.",
+ "message": "{ErrMsg}\n\nPlease consult the log for more information.",
+ "translation": "{ErrMsg}\n\n如需更多資訊,請查看日誌。",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "ErrMsg",
+ "string": "%[1]s",
+ "type": "string",
+ "underlyingType": "string",
+ "argNum": 1,
+ "expr": "errMsg"
+ }
+ ]
+ },
+ {
+ "id": "{Title} (out of date)",
+ "message": "{Title} (out of date)",
+ "translation": "{Title}(已過時)",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "Title",
+ "string": "%[1]s",
+ "type": "string",
+ "underlyingType": "string",
+ "argNum": 1,
+ "expr": "mtw.Title()"
+ }
+ ]
+ },
+ {
+ "id": "WireGuard Detection Error",
+ "message": "WireGuard Detection Error",
+ "translation": "偵測 WireGuard 錯誤",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Unable to wait for WireGuard window to appear: {Err}",
+ "message": "Unable to wait for WireGuard window to appear: {Err}",
+ "translation": "無法等待 WireGuard 視窗開啓: {Err}",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "Err",
+ "string": "%[1]v",
+ "type": "error",
+ "underlyingType": "interface{Error() string}",
+ "argNum": 1,
+ "expr": "err"
+ }
+ ]
+ },
+ {
+ "id": "WireGuard: Deactivated",
+ "message": "WireGuard: Deactivated",
+ "translation": "WireGuard - 未連線",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Status: Unknown",
+ "message": "Status: Unknown",
+ "translation": "[狀態] 未知",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Addresses: None",
+ "message": "Addresses: None",
+ "translation": "[位址] 無",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "&Manage tunnels…",
+ "message": "&Manage tunnels…",
+ "translation": "管理隧道 (&M)",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "&Import tunnel(s) from file…",
+ "message": "&Import tunnel(s) from file…",
+ "translation": "從檔案匯入… (&I)",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "E&xit",
+ "message": "E&xit",
+ "translation": "離開 (&X)",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "WireGuard Tunnel Error",
+ "message": "WireGuard Tunnel Error",
+ "translation": "WireGuard 隧道錯誤",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "WireGuard: {TextForStateglobalState_true}",
+ "message": "WireGuard: {TextForStateglobalState_true}",
+ "translation": "WireGuard - {TextForStateglobalState_true}",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "TextForStateglobalState_true",
+ "string": "%[1]s",
+ "type": "string",
+ "underlyingType": "string",
+ "argNum": 1,
+ "expr": "textForState(globalState, true)"
+ }
+ ]
+ },
+ {
+ "id": "Status: {StateText}",
+ "message": "Status: {StateText}",
+ "translation": "[狀態] {StateText}",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "StateText",
+ "string": "%[1]s",
+ "type": "string",
+ "underlyingType": "string",
+ "argNum": 1,
+ "expr": "stateText"
+ }
+ ]
+ },
+ {
+ "id": "Addresses: {String}",
+ "message": "Addresses: {String}",
+ "translation": "[位址] {String}",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "String",
+ "string": "%[1]s",
+ "type": "string",
+ "underlyingType": "string",
+ "argNum": 1,
+ "expr": "sb.String()"
+ }
+ ]
+ },
+ {
+ "id": "WireGuard Activated",
+ "message": "WireGuard Activated",
+ "translation": "WireGuard 已連線",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "The {Name} tunnel has been activated.",
+ "message": "The {Name} tunnel has been activated.",
+ "translation": "已連線至隧道 - {Name}",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "Name",
+ "string": "%[1]s",
+ "type": "string",
+ "underlyingType": "string",
+ "argNum": 1,
+ "expr": "tunnel.Name"
+ }
+ ]
+ },
+ {
+ "id": "WireGuard Deactivated",
+ "message": "WireGuard Deactivated",
+ "translation": "WireGuard 已中斷連線",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "The {Name} tunnel has been deactivated.",
+ "message": "The {Name} tunnel has been deactivated.",
+ "translation": "已中斷與隧道的連線 - {Name}",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "Name",
+ "string": "%[1]s",
+ "type": "string",
+ "underlyingType": "string",
+ "argNum": 1,
+ "expr": "tunnel.Name"
+ }
+ ]
+ },
+ {
+ "id": "An Update is Available!",
+ "message": "An Update is Available!",
+ "translation": "更新",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "WireGuard Update Available",
+ "message": "WireGuard Update Available",
+ "translation": "WireGuard 更新",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "An update to WireGuard is now available. You are advised to update as soon as possible.",
+ "message": "An update to WireGuard is now available. You are advised to update as soon as possible.",
+ "translation": "更新的 WireGuard 已經為您準備好了。\n強烈建議您立即更新 WireGuard。",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Tunnels",
+ "message": "Tunnels",
+ "translation": "隧道",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "&Edit",
+ "message": "&Edit",
+ "translation": "編輯 (&E)",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Add &empty tunnel…",
+ "message": "Add &empty tunnel…",
+ "translation": "新增隧道精靈 (&E)",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Add Tunnel",
+ "message": "Add Tunnel",
+ "translation": "新增隧道",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Remove selected tunnel(s)",
+ "message": "Remove selected tunnel(s)",
+ "translation": "刪除選取隧道",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Export all tunnels to zip",
+ "message": "Export all tunnels to zip",
+ "translation": "匯出所有隧道(ZIP 格式)",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "&Toggle",
+ "message": "&Toggle",
+ "translation": "切換連線狀態 (&T)",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Export all tunnels to &zip…",
+ "message": "Export all tunnels to &zip…",
+ "translation": "匯出所有隧道至 &ZIP 壓縮檔",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Edit &selected tunnel…",
+ "message": "Edit &selected tunnel…",
+ "translation": "編輯選取隧道 (&S)",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "&Remove selected tunnel(s)",
+ "message": "&Remove selected tunnel(s)",
+ "translation": "刪除已選取隧道 (&R)",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Could not import selected configuration: {LastErr}",
+ "message": "Could not import selected configuration: {LastErr}",
+ "translation": "無法匯入設定: {LastErr}",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "LastErr",
+ "string": "%[1]v",
+ "type": "error",
+ "underlyingType": "interface{Error() string}",
+ "argNum": 1,
+ "expr": "lastErr"
+ }
+ ]
+ },
+ {
+ "id": "Could not enumerate existing tunnels: {LastErr}",
+ "message": "Could not enumerate existing tunnels: {LastErr}",
+ "translation": "無法列出隧道: {LastErr}",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "LastErr",
+ "string": "%[1]v",
+ "type": "error",
+ "underlyingType": "interface{Error() string}",
+ "argNum": 1,
+ "expr": "lastErr"
+ }
+ ]
+ },
+ {
+ "id": "Another tunnel already exists with the name ‘{Name}’",
+ "message": "Another tunnel already exists with the name ‘{Name}’",
+ "translation": "已有另一個同名的隧道「{Name}」",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "Name",
+ "string": "%[1]s",
+ "type": "string",
+ "underlyingType": "string",
+ "argNum": 1,
+ "expr": "unparsedConfig.Name"
+ }
+ ]
+ },
+ {
+ "id": "Unable to import configuration: {LastErr}",
+ "message": "Unable to import configuration: {LastErr}",
+ "translation": "無法匯入設定: {LastErr}",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "LastErr",
+ "string": "%[1]v",
+ "type": "error",
+ "underlyingType": "interface{Error() string}",
+ "argNum": 1,
+ "expr": "lastErr"
+ }
+ ]
+ },
+ {
+ "id": "Imported tunnels",
+ "message": "Imported tunnels",
+ "translation": "已匯入隧道",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Imported {M} tunnels",
+ "message": "Imported {M} tunnels",
+ "translation": {
+ "select": {
+ "feature": "plural",
+ "arg": "M",
+ "cases": {
+ "other": {
+ "msg": "已匯入 {M} 個隧道"
+ }
+ }
+ }
+ },
+ "placeholders": [
+ {
+ "id": "M",
+ "string": "%[1]d",
+ "type": "int",
+ "underlyingType": "int",
+ "argNum": 1,
+ "expr": "m"
+ }
+ ]
+ },
+ {
+ "id": "Imported {M} of {N} tunnels",
+ "message": "Imported {M} of {N} tunnels",
+ "translation": {
+ "select": {
+ "feature": "plural",
+ "arg": "N",
+ "cases": {
+ "other": {
+ "msg": "已匯入 {M} 個隧道(共 {N} 個)"
+ }
+ }
+ }
+ },
+ "placeholders": [
+ {
+ "id": "M",
+ "string": "%[1]d",
+ "type": "int",
+ "underlyingType": "int",
+ "argNum": 1,
+ "expr": "m"
+ },
+ {
+ "id": "N",
+ "string": "%[2]d",
+ "type": "int",
+ "underlyingType": "int",
+ "argNum": 2,
+ "expr": "n"
+ }
+ ]
+ },
+ {
+ "id": "Unable to create tunnel",
+ "message": "Unable to create tunnel",
+ "translation": "無法建立隧道",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Delete {TunnelCount} tunnels",
+ "message": "Delete {TunnelCount} tunnels",
+ "translation": {
+ "select": {
+ "feature": "plural",
+ "arg": "TunnelCount",
+ "cases": {
+ "other": {
+ "msg": "刪除 {TunnelCount} 個隧道"
+ }
+ }
+ }
+ },
+ "placeholders": [
+ {
+ "id": "TunnelCount",
+ "string": "%[1]d",
+ "type": "int",
+ "underlyingType": "int",
+ "argNum": 1,
+ "expr": "tunnelCount"
+ }
+ ]
+ },
+ {
+ "id": "Are you sure you would like to delete {TunnelCount} tunnels?",
+ "message": "Are you sure you would like to delete {TunnelCount} tunnels?",
+ "translation": {
+ "select": {
+ "feature": "plural",
+ "arg": "TunnelCount",
+ "cases": {
+ "other": {
+ "msg": "您確定要刪除 {TunnelCount} 個隧道嗎?"
+ }
+ }
+ }
+ },
+ "placeholders": [
+ {
+ "id": "TunnelCount",
+ "string": "%[1]d",
+ "type": "int",
+ "underlyingType": "int",
+ "argNum": 1,
+ "expr": "tunnelCount"
+ }
+ ]
+ },
+ {
+ "id": "Delete tunnel ‘{TunnelName}’",
+ "message": "Delete tunnel ‘{TunnelName}’",
+ "translation": "刪除隧道 - {TunnelName}",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "TunnelName",
+ "string": "%[1]s",
+ "type": "string",
+ "underlyingType": "string",
+ "argNum": 1,
+ "expr": "tunnelName"
+ }
+ ]
+ },
+ {
+ "id": "Are you sure you would like to delete tunnel ‘{TunnelName}’?",
+ "message": "Are you sure you would like to delete tunnel ‘{TunnelName}’?",
+ "translation": "您確定要刪除隧道「{TunnelName}」嗎?",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "TunnelName",
+ "string": "%[1]s",
+ "type": "string",
+ "underlyingType": "string",
+ "argNum": 1,
+ "expr": "tunnelName"
+ }
+ ]
+ },
+ {
+ "id": "{Question} You cannot undo this action.",
+ "message": "{Question} You cannot undo this action.",
+ "translation": "{Question}\n\n您將無法復原此操作。",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "Question",
+ "string": "%[1]s",
+ "type": "string",
+ "underlyingType": "string",
+ "argNum": 1,
+ "expr": "question"
+ }
+ ]
+ },
+ {
+ "id": "Unable to delete tunnel",
+ "message": "Unable to delete tunnel",
+ "translation": "無法刪除隧道",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "A tunnel was unable to be removed: {Error}",
+ "message": "A tunnel was unable to be removed: {Error}",
+ "translation": "無法刪除隧道: {Error}",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "Error",
+ "string": "%[1]s",
+ "type": "string",
+ "underlyingType": "string",
+ "argNum": 1,
+ "expr": "errors[0].Error()"
+ }
+ ]
+ },
+ {
+ "id": "Unable to delete tunnels",
+ "message": "Unable to delete tunnels",
+ "translation": "無法刪除隧道",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "{Lenerrors} tunnels were unable to be removed.",
+ "message": "{Lenerrors} tunnels were unable to be removed.",
+ "translation": {
+ "select": {
+ "feature": "plural",
+ "arg": "Lenerrors",
+ "cases": {
+ "other": {
+ "msg": "無法刪除 {Lenerrors} 個隧道"
+ }
+ }
+ }
+ },
+ "placeholders": [
+ {
+ "id": "Lenerrors",
+ "string": "%[1]d",
+ "type": "int",
+ "underlyingType": "int",
+ "argNum": 1,
+ "expr": "len(errors)"
+ }
+ ]
+ },
+ {
+ "id": "Configuration Files (*.zip, *.conf)|*.zip;*.conf|All Files (*.*)|*.*",
+ "message": "Configuration Files (*.zip, *.conf)|*.zip;*.conf|All Files (*.*)|*.*",
+ "translation": "隧道設定檔 (*.zip, *.conf)|*.zip;*.conf|所有檔案 (*.*)|*.*",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Import tunnel(s) from file",
+ "message": "Import tunnel(s) from file",
+ "translation": "從檔案中匯入隧道…",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Configuration ZIP Files (*.zip)|*.zip",
+ "message": "Configuration ZIP Files (*.zip)|*.zip",
+ "translation": "隧道設定檔 (*.zip)|*.zip",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Export tunnels to zip",
+ "message": "Export tunnels to zip",
+ "translation": "匯出隧道設定至…",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "{Title} (unsigned build, no updates)",
+ "message": "{Title} (unsigned build, no updates)",
+ "translation": "{Title}(未簽署發行版本,無法自動更新)",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "Title",
+ "string": "%[1]s",
+ "type": "string",
+ "underlyingType": "string",
+ "argNum": 1,
+ "expr": "mtw.Title()"
+ }
+ ]
+ },
+ {
+ "id": "Error Exiting WireGuard",
+ "message": "Error Exiting WireGuard",
+ "translation": "離開 WireGuard 失敗",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Unable to exit service due to: {Err}. You may want to stop WireGuard from the service manager.",
+ "message": "Unable to exit service due to: {Err}. You may want to stop WireGuard from the service manager.",
+ "translation": "無法結束服務: {Err}。\n您可能需要手動從服務管理中結束 WireGuard 服務。",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "Err",
+ "string": "%[1]v",
+ "type": "error",
+ "underlyingType": "interface{Error() string}",
+ "argNum": 1,
+ "expr": "err"
+ }
+ ]
+ },
+ {
+ "id": "An update to WireGuard is available. It is highly advisable to update without delay.",
+ "message": "An update to WireGuard is available. It is highly advisable to update without delay.",
+ "translation": "更新的 WireGuard 已經為您準備好了。\n強烈建議您立即進行更新。",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Status: Waiting for user",
+ "message": "Status: Waiting for user",
+ "translation": "狀態:等待使用者",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Update Now",
+ "message": "Update Now",
+ "translation": "立即更新",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Status: Waiting for updater service",
+ "message": "Status: Waiting for updater service",
+ "translation": "狀態:等待更新服務",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "Error: {Err}. Please try again.",
+ "message": "Error: {Err}. Please try again.",
+ "translation": "錯誤: {Err}。請稍後再試。",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "Err",
+ "string": "%[1]v",
+ "type": "error",
+ "underlyingType": "interface{Error() string}",
+ "argNum": 1,
+ "expr": "err"
+ }
+ ]
+ },
+ {
+ "id": "Status: Complete!",
+ "message": "Status: Complete!",
+ "translation": "狀態:已完成!",
+ "translatorComment": "Copied from source."
+ },
+ {
+ "id": "http2: Framer {F}: failed to decode just-written frame",
+ "message": "http2: Framer {F}: failed to decode just-written frame",
+ "translation": "http2: Framer {F}: failed to decode just-written frame",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "F",
+ "string": "%[1]p",
+ "type": "*net/http.http2Framer",
+ "underlyingType": "*net/http.http2Framer",
+ "argNum": 1,
+ "expr": "f"
+ }
+ ]
+ },
+ {
+ "id": "http2: Framer {F}: wrote {Http2summarizeFramefr}",
+ "message": "http2: Framer {F}: wrote {Http2summarizeFramefr}",
+ "translation": "http2: Framer {F}: wrote {Http2summarizeFramefr}",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "F",
+ "string": "%[1]p",
+ "type": "*net/http.http2Framer",
+ "underlyingType": "*net/http.http2Framer",
+ "argNum": 1,
+ "expr": "f"
+ },
+ {
+ "id": "Http2summarizeFramefr",
+ "string": "%[2]v",
+ "type": "string",
+ "underlyingType": "string",
+ "argNum": 2,
+ "expr": "http2summarizeFrame(fr)"
+ }
+ ]
+ },
+ {
+ "id": "http2: Framer {Fr}: read {Http2summarizeFramef}",
+ "message": "http2: Framer {Fr}: read {Http2summarizeFramef}",
+ "translation": "http2: Framer {Fr}: read {Http2summarizeFramef}",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "Fr",
+ "string": "%[1]p",
+ "type": "*net/http.http2Framer",
+ "underlyingType": "*net/http.http2Framer",
+ "argNum": 1,
+ "expr": "fr"
+ },
+ {
+ "id": "Http2summarizeFramef",
+ "string": "%[2]v",
+ "type": "string",
+ "underlyingType": "string",
+ "argNum": 2,
+ "expr": "http2summarizeFrame(f)"
+ }
+ ]
+ },
+ {
+ "id": "http2: decoded hpack field {HeaderField}",
+ "message": "http2: decoded hpack field {HeaderField}",
+ "translation": "http2: decoded hpack field {HeaderField}",
+ "translatorComment": "Copied from source.",
+ "placeholders": [
+ {
+ "id": "HeaderField",
+ "string": "%+[1]v",
+ "type": "vendor/golang.org/x/net/http2/hpack.HeaderField",
+ "underlyingType": "struct{Name string; Value string; Sensitive bool}",
+ "argNum": 1,
+ "expr": "hf"
+ }
+ ]
+ }
+ ]
+} \ No newline at end of file
diff --git a/resources.rc b/resources.rc
index c1794582..f66ef4b5 100644
--- a/resources.rc
+++ b/resources.rc
@@ -76,3 +76,10 @@ VERSIONINFO_TEMPLATE(
"WireGuard: hiter, sodoben, varen tunel VPN",
"https://www.wireguard.com/"
)
+
+LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL
+VERSIONINFO_TEMPLATE(
+ "040404b0", 0x404, 0x4b0,
+ "WireGuard:快速、現代、安全的 VPN 隧道",
+ "https://www.wireguard.com/"
+) \ No newline at end of file
diff --git a/zgotext.go b/zgotext.go
index e5a933e5..cad29d30 100644
--- a/zgotext.go
+++ b/zgotext.go
@@ -29,12 +29,17 @@ func init() {
dict := map[string]catalog.Dictionary{
"de": &dictionary{index: deIndex, data: deData},
"en": &dictionary{index: enIndex, data: enData},
+ "fa": &dictionary{index: faIndex, data: faData},
"fr": &dictionary{index: frIndex, data: frData},
+ "id": &dictionary{index: idIndex, data: idData},
"it": &dictionary{index: itIndex, data: itData},
"ja": &dictionary{index: jaIndex, data: jaData},
+ "pl": &dictionary{index: plIndex, data: plData},
"ru": &dictionary{index: ruIndex, data: ruData},
"sl": &dictionary{index: slIndex, data: slData},
+ "vi": &dictionary{index: viIndex, data: viData},
"zh_CN": &dictionary{index: zh_CNIndex, data: zh_CNData},
+ "zh_TW": &dictionary{index: zh_TWIndex, data: zh_TWData},
}
fallback := language.MustParse("en")
cat, err := catalog.NewFromMap(dict, catalog.Fallback(fallback))
@@ -516,6 +521,99 @@ const enData string = "" + // Size: 5174 bytes
"te %[2]v\x02http2: Framer %[1]p: read %[2]v\x02http2: decoded hpack fiel" +
"d %+[1]v\x02Config key is missing an equals separator"
+var faIndex = []uint32{ // 177 elements
+ // Entry 0 - 1F
+ 0x00000000, 0x00000007, 0x00000007, 0x00000007,
+ 0x0000002b, 0x0000002b, 0x00000093, 0x00000093,
+ 0x00000093, 0x00000093, 0x00000093, 0x000000a3,
+ 0x000000a3, 0x000000c6, 0x000000e9, 0x00000110,
+ 0x0000013b, 0x00000166, 0x00000173, 0x00000183,
+ 0x00000183, 0x00000183, 0x00000183, 0x00000183,
+ 0x00000183, 0x000001b0, 0x000001b0, 0x000001b0,
+ 0x000001b0, 0x000001b0, 0x000001ca, 0x000001e2,
+ // Entry 20 - 3F
+ 0x000001e2, 0x000001e2, 0x000001e2, 0x000001e2,
+ 0x000001e2, 0x000001e2, 0x000001e2, 0x00000218,
+ 0x00000218, 0x00000218, 0x00000218, 0x0000022c,
+ 0x0000027c, 0x000002a6, 0x000002a6, 0x000002a6,
+ 0x000002a6, 0x000002aa, 0x000002ae, 0x000002c5,
+ 0x000002c5, 0x000002c5, 0x000002ce, 0x000002e5,
+ 0x000002f1, 0x0000030c, 0x00000321, 0x00000336,
+ 0x00000349, 0x0000034e, 0x00000361, 0x00000375,
+ // Entry 40 - 5F
+ 0x0000039d, 0x000003b0, 0x000003c5, 0x000003f0,
+ 0x000003f0, 0x000003fe, 0x0000040e, 0x0000040e,
+ 0x0000040e, 0x0000040e, 0x0000040e, 0x0000041e,
+ 0x00000427, 0x00000444, 0x0000045a, 0x00000463,
+ 0x00000479, 0x0000048c, 0x0000048c, 0x0000048c,
+ 0x00000498, 0x0000049f, 0x000004b2, 0x000004c8,
+ 0x000004e9, 0x000004e9, 0x0000052f, 0x0000055c,
+ 0x0000055c, 0x0000055c, 0x0000055c, 0x0000055c,
+ // Entry 60 - 7F
+ 0x00000565, 0x00000585, 0x00000594, 0x000005ba,
+ 0x000005d6, 0x000005ec, 0x000005fa, 0x000005fa,
+ 0x0000061b, 0x00000624, 0x00000645, 0x00000645,
+ 0x00000681, 0x0000069c, 0x000006b0, 0x000006b0,
+ 0x000006b0, 0x000006b0, 0x000006b0, 0x000006b0,
+ 0x000006cd, 0x000006e7, 0x00000708, 0x00000708,
+ 0x00000708, 0x00000724, 0x00000724, 0x00000736,
+ 0x0000074f, 0x00000769, 0x0000078b, 0x000007a9,
+ // Entry 80 - 9F
+ 0x000007a9, 0x000007de, 0x00000817, 0x00000817,
+ 0x00000827, 0x00000835, 0x00000863, 0x00000879,
+ 0x0000089e, 0x000008d3, 0x000008d3, 0x0000090c,
+ 0x0000090c, 0x0000090c, 0x0000090c, 0x0000090c,
+ 0x0000090c, 0x0000090c, 0x0000092e, 0x00000971,
+ 0x000009c9, 0x000009f6, 0x00000a2b, 0x00000a2b,
+ 0x00000a47, 0x00000a47, 0x00000a47, 0x00000a79,
+ 0x00000a79, 0x00000aae, 0x00000aae, 0x00000aae,
+ // Entry A0 - BF
+ 0x00000ae1, 0x00000b1d, 0x00000b4b, 0x00000b4b,
+ 0x00000b81, 0x00000b81, 0x00000b81, 0x00000bb2,
+ 0x00000bdb, 0x00000c24, 0x00000c5c, 0x00000c77,
+ 0x00000c77, 0x00000c77, 0x00000c77, 0x00000c77,
+ 0x00000c77,
+} // Size: 732 bytes
+
+const faData string = "" + // Size: 3191 bytes
+ "\x02خطا\x02گزینه\u200cهای خط فرمان\x02شما باید نگارش ۶۴-بیت WireGuard را" +
+ " در این رایانه استفاده کنید.\x02هم اکنون\x14\x01\x81\x01\x00\x02\x0d\x02" +
+ "%[1]d سال\x00\x0d\x02%[1]d سال\x14\x01\x81\x01\x00\x02\x0d\x02%[1]d روز" +
+ "\x00\x0d\x02%[1]d روز\x14\x01\x81\x01\x00\x02\x0f\x02%[1]d ساعت\x00\x0f" +
+ "\x02%[1]d ساعت\x14\x01\x81\x01\x00\x02\x11\x02%[1]d دقیقه\x00\x11\x02%[1" +
+ "]d دقیقه\x14\x01\x81\x01\x00\x02\x11\x02%[1]d ثانیه\x00\x11\x02%[1]d ثان" +
+ "یه\x02%[1]s پیش\x02%[1]d\u00a0بایت\x02نشانی آی\u200cپی نامعتبر است\x02M" +
+ "TU نامعتبر است\x02پورت نامعتبر\x02کلید باید یک مقدار داشته باشد\x02[مشخص" +
+ " نشده]\x02همه همتاها باید کلید\u200cهای عمومی داشته باشند\x02خطا در دریا" +
+ "فت پیکربندی\x02، \x02، \x02درباره WireGuard\x02بستن\x02♥&کمک\u200cمالی!" +
+ "\x02وضعیت:\x02&غیرفعال\u200cسازی\x02&فعال\u200cسازی\x02کلید عمومی:\x02پو" +
+ "رت شنود:\x02MTU:\x02نشانی\u200cها:\x02سرورهای DNS:\x02کلید از پیش تقسیم" +
+ " شده:\x02IPهای مجاز:\x02نقطه پایان:\x02زنده نگه\u200cداشتن پیوسته:\x02ان" +
+ "تقال:\x02فعال شده\x02رابط: %[1]s\x02همتا\x02ایجاد تونل جدید\x02ویرایش ت" +
+ "ونل\x02&نام:\x02&کلید عمومی:\x02(ناشناخته)\x02&ذخیره\x02لغو\x02&پیکربند" +
+ "ی:\x02نام نامعتبر\x02یک نام الزامی است.\x02نمی\u200cتوان تونل\u200cهای " +
+ "موجود را فهرست کرد\x02تونل هم\u200cاکنون موجود است\x02فعال\x02در حال فع" +
+ "ال\u200cسازی\x02غیرفعال\x02در حال غیرفعال\u200cسازی\x02وضعیت ناشناخته" +
+ "\x02گزارش وقایع\x02&روگرفت\x02&ذخیره در پرونده…\x02زمان\x02پیام گزارش رو" +
+ "یداد\x02برون\u200cبرد گزارش رویداد به پرونده\x02&درباره WireGuard…\x02خ" +
+ "طالی تونل\x02وضعیت: ناشناخته\x02نشانی\u200cها: هیچ\x02&مدیریت تونل" +
+ "\u200cها…\x02خطای تونل WireGuard\x02وضعیت: %[1]s\x02نشانی\u200cها: %[1]s" +
+ "\x02WireGuard فعال\u200cشد\x02تونل %[1]s فعال\u200cشده.\x02WireGuard غیر" +
+ "فعال شد\x02یک به\u200cروزرسانی در دسترس است!\x02به\u200cروزرسانی WireGu" +
+ "ard در دسترس است\x02تونل\u200cها\x02&ویرایش\x02افزودن &خالی\u200cکردن تو" +
+ "نل…\x02افزودن تونل\x02حذف تونل(ها) انتخابی\x02برون\u200cبری همه تونل" +
+ "\u200cها به زیپ\x02برون\u200cبری همه تونل\u200cها به &زیپ…\x02تونل\u200c" +
+ "های وارد شده\x14\x01\x81\x01\x00\x02\x1d\x02%[1]d تونل وارد شد\x00\x1d" +
+ "\x02%[1]d تونل وارد شد\x14\x02\x80\x01\x02(\x02%[1]d از %[2]d تونل وارد " +
+ "شد\x00(\x02%[1]d از %[2]d تونل وارد شد\x02نمی\u200cتوان تونل ایجاد کرد" +
+ "\x14\x01\x81\x01\x00\x02\x16\x02حذف %[1]d تونل\x00\x16\x02حذف %[1]d تونل" +
+ "\x02حذف تونل ‘%[1]s’\x02حذف تونل\u200c امکان\u200cپذیر نیست\x02نمی\u200c" +
+ "توان تونل\u200cها را حذف کرد\x02وارد کردن تونل(ها) از پرونده\x02پرونده" +
+ "\u200cهای پیکربندی زیپ (*.zip)|*.zip\x02برون\u200cبری تونل\u200cها به زی" +
+ "پ\x02خطا در هنگام خارج شدن از WireGuard\x02وضعیت: درانتظار برای کاربر" +
+ "\x02اکنون به\u200cروز رسانی کن\x02وضعیت: درانتظار برای سرویس به\u200cروز" +
+ "رسانی\x02خطا: %[1]v. لطفا دوباره تلاش کنید.\x02وضعیت: کامل شد!"
+
var frIndex = []uint32{ // 177 elements
// Entry 0 - 1F
0x00000000, 0x00000007, 0x00000046, 0x00000063,
@@ -671,6 +769,100 @@ const frData string = "" + // Size: 6398 bytes
".\x02http2: Trameur %[1]p: a écrit %[2]v\x02http2: Trameur %[1]p : a lu " +
"%[2]v\x02http2 : champ hpack %+[1]v décodé"
+var idIndex = []uint32{ // 177 elements
+ // Entry 0 - 1F
+ 0x00000000, 0x0000000a, 0x00000047, 0x00000062,
+ 0x00000074, 0x000000bf, 0x000000fe, 0x0000012f,
+ 0x00000187, 0x000001e0, 0x00000215, 0x0000021e,
+ 0x00000231, 0x00000250, 0x00000262, 0x00000273,
+ 0x00000286, 0x00000299, 0x000002a9, 0x000002b1,
+ 0x000002bd, 0x000002c9, 0x000002d5, 0x000002e1,
+ 0x000002ee, 0x00000304, 0x0000031f, 0x0000033f,
+ 0x00000359, 0x0000037f, 0x0000038f, 0x000003a0,
+ // Entry 20 - 3F
+ 0x000003c1, 0x000003d7, 0x000003ff, 0x00000431,
+ 0x0000044b, 0x00000463, 0x00000480, 0x0000049b,
+ 0x000004c5, 0x000004ea, 0x0000050f, 0x00000520,
+ 0x00000548, 0x0000056c, 0x00000596, 0x000005ad,
+ 0x000005d2, 0x000005d5, 0x000005d5, 0x000005e7,
+ 0x000005e7, 0x0000064e, 0x00000654, 0x00000661,
+ 0x00000669, 0x00000669, 0x00000669, 0x00000669,
+ 0x00000669, 0x00000669, 0x00000669, 0x00000669,
+ // Entry 40 - 5F
+ 0x00000669, 0x00000669, 0x00000669, 0x00000669,
+ 0x00000669, 0x00000669, 0x00000669, 0x00000669,
+ 0x00000669, 0x00000669, 0x00000669, 0x00000669,
+ 0x00000669, 0x00000669, 0x00000669, 0x00000669,
+ 0x00000669, 0x00000669, 0x00000669, 0x00000669,
+ 0x00000669, 0x00000669, 0x00000669, 0x00000669,
+ 0x00000669, 0x00000669, 0x00000669, 0x00000669,
+ 0x00000669, 0x00000669, 0x00000669, 0x00000669,
+ // Entry 60 - 7F
+ 0x0000066f, 0x0000067c, 0x00000685, 0x00000693,
+ 0x000006aa, 0x000006b2, 0x000006b8, 0x000006c4,
+ 0x000006e1, 0x000006e7, 0x000006f1, 0x00000721,
+ 0x00000739, 0x0000074f, 0x0000075b, 0x00000791,
+ 0x000007a4, 0x000007bb, 0x000007f0, 0x00000809,
+ 0x00000821, 0x00000830, 0x00000843, 0x0000085e,
+ 0x00000866, 0x0000087c, 0x0000088d, 0x0000089b,
+ 0x0000089b, 0x0000089b, 0x0000089b, 0x0000089b,
+ // Entry 80 - 9F
+ 0x0000089b, 0x0000089b, 0x0000089b, 0x0000089b,
+ 0x0000089b, 0x0000089b, 0x0000089b, 0x0000089b,
+ 0x0000089b, 0x0000089b, 0x0000089b, 0x000008ba,
+ 0x000008d3, 0x000008ea, 0x00000920, 0x00000920,
+ 0x00000920, 0x00000920, 0x00000920, 0x00000920,
+ 0x00000920, 0x00000920, 0x00000920, 0x00000920,
+ 0x00000920, 0x00000920, 0x00000920, 0x00000920,
+ 0x00000920, 0x00000920, 0x00000920, 0x00000920,
+ // Entry A0 - BF
+ 0x00000920, 0x00000920, 0x00000920, 0x00000920,
+ 0x00000920, 0x00000920, 0x00000920, 0x00000920,
+ 0x00000920, 0x00000920, 0x00000920, 0x00000920,
+ 0x00000920, 0x00000920, 0x00000920, 0x00000920,
+ 0x00000920,
+} // Size: 732 bytes
+
+const idData string = "" + // Size: 2336 bytes
+ "\x02Kesalahan\x02(tidak ada argumen): naikkan akses dan instal servis ma" +
+ "najer\x02Penggunaan: %[1]s [\x0a%[2]s]\x02Opsi Command Line\x02Tidak dap" +
+ "at menentukan apakah proses sedang berjalan di bawah WOW64: %[1]v\x02And" +
+ "a harus menggunakan WireGuard versi 64-bit di komputer ini.\x02Tidak dap" +
+ "at membuka token proses saat ini: %[1]v\x02WireGuard hanya dapat digunak" +
+ "an oleh pengguna yang merupakan anggota grup Bawaan %[1]s.\x02WireGuard " +
+ "sedang berjalan, tetapi UI hanya dapat diakses dari desktop grup Bawaan " +
+ "%[1]s.\x02Ikon sistem WireGuard tidak muncul setelah 30 detik.\x02Sekara" +
+ "ng\x02Jam sistem mundur!\x14\x01\x81\x01\x00\x00\x18\x02%[1]d tahun\x0a%" +
+ "[1]d tahun\x14\x01\x81\x01\x00\x00\x0b\x02%[1]d Hari\x14\x01\x81\x01\x00" +
+ "\x00\x0a\x02%[1]d jam\x14\x01\x81\x01\x00\x00\x0c\x02%[1]d menit\x14\x01" +
+ "\x81\x01\x00\x00\x0c\x02%[1]d detik\x02%[1]s yang lalu\x02%[1]d B\x02%.2" +
+ "[1]f KiB\x02%.2[1]f MiB\x02%.2[1]f GiB\x02%.2[1]f TiB\x02%[1]s: %[2]q" +
+ "\x02Alamat IP tidak valid\x02Network prefix tidak valid\x02Port belum te" +
+ "risi dari endpoint\x02Host endpoint tidak valid\x02Dalam Kurung harus be" +
+ "risi alamat IPv6\x02MTU tidak valid\x02Port tidak valid\x02Persistent ke" +
+ "epalive tidak valid\x02Kunci tidak sah:%[1]v\x02Kunci harus diterjemahka" +
+ "n tepat 32 byte\x02Nomor harus diantara 0 sampai dengan 2^64-1:%[1]v\x02" +
+ "Dua koma dalam satu baris\x02Nama Tunnel tidak valid\x02Garis harus munc" +
+ "ul perbagian\x02Kunci harus memiliki value\x02Kunci tidak valid pada bag" +
+ "ian [Interface]\x02Kunci tidak valid pada bagian [Peer]\x02Interface har" +
+ "us memiliki Private Key\x02Tidak Ditetapkan\x02Semua peers harus memilik" +
+ "i kunci publik\x02Eror ketika mendapatkan konfigurasi\x02Kunci tidak val" +
+ "id pada bagian [Interface]\x02Versi protokol harus 1\x02Kunci tidak vali" +
+ "d pada bagian [Peer]\x02, \x02Tentang WireGuard\x02Versi Aplikasi: %[1]s" +
+ "\x0aVersi back-end Go: %[2]s\x0aVersi Go: %[3]s\x0aSistem Operasi: %[4]s" +
+ "\x0aArsitektur: %[5]s\x02Tutup\x02♥ &Donasi!\x02Status:\x02Aktif\x02Meng" +
+ "aktifkan\x02Nonaktif\x02Menonaktifkan\x02Status tidak diketahui\x02Catat" +
+ "an\x02Salin\x02Pilih semua\x02Menyimpan ke dalam berkas…\x02Waktu\x02Pes" +
+ "an log\x02Berkas Txt (*.Txt)|*.Txt|Semua berkas (*.*)|*.*\x02Ekspor log " +
+ "kedalam file\x02&Tentang WireGuard…\x02Tunnel eror\x02%[1]s\x0a\x0aSilak" +
+ "an baca log untuk informasi lebih lanjut.\x02%[1]s (kadaluarsa)\x02Detek" +
+ "si eror WireGuard\x02Tidak dapat menunggu jendela WireGuard muncul: %[1]" +
+ "v\x02WireGuard: Dinonaktifkan\x02Status: Tidak diketahui\x02Alamat: Koso" +
+ "ng\x02&Manajer Tunnel…\x02&Impor tunnel dari file…\x02&Keluar\x02Wiregua" +
+ "rd Tunnel Eror\x02WireGuard: %[1]s\x02Status: %[1]s\x02Ekspor semua tunn" +
+ "el ke &zip…\x02Ubah tunnel &terpilih…\x02&Hapus tunnel terpilih\x02Tidak" +
+ " dapat mengimpor konfigurasi yang dipilih: %[1]v"
+
var itIndex = []uint32{ // 177 elements
// Entry 0 - 1F
0x00000000, 0x00000007, 0x00000044, 0x0000005d,
@@ -933,6 +1125,64 @@ const jaData string = "" + // Size: 6754 bytes
"tp2: Framer %[1]p: %[2]v を書き込みました\x02http2: Framer %[1]p: %[2]v を読み込みました" +
"\x02http2: hpack フィールド %+[1]v をデコードしました"
+var plIndex = []uint32{ // 177 elements
+ // Entry 0 - 1F
+ 0x00000000, 0x00000007, 0x00000007, 0x00000007,
+ 0x0000001e, 0x0000001e, 0x0000005b, 0x0000005b,
+ 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b,
+ 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b,
+ 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b,
+ 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b,
+ 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b,
+ 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b,
+ // Entry 20 - 3F
+ 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b,
+ 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b,
+ 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b,
+ 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b,
+ 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b,
+ 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b,
+ 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b,
+ 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b,
+ // Entry 40 - 5F
+ 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b,
+ 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b,
+ 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b,
+ 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b,
+ 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b,
+ 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b,
+ 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b,
+ 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b,
+ // Entry 60 - 7F
+ 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b,
+ 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b,
+ 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b,
+ 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b,
+ 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b,
+ 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b,
+ 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b,
+ 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b,
+ // Entry 80 - 9F
+ 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b,
+ 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b,
+ 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b,
+ 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b,
+ 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b,
+ 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b,
+ 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b,
+ 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b,
+ // Entry A0 - BF
+ 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b,
+ 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b,
+ 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b,
+ 0x0000005b, 0x0000005b, 0x0000005b, 0x0000005b,
+ 0x0000005b,
+} // Size: 732 bytes
+
+const plData string = "" + // Size: 91 bytes
+ "\x02Błąd\x02Opcje wiersza poleceń\x02Musisz użyć 64-bitowej wersji WireG" +
+ "uard na tym komputerze."
+
var ruIndex = []uint32{ // 177 elements
// Entry 0 - 1F
0x00000000, 0x0000000d, 0x000000a9, 0x000000d4,
@@ -1237,6 +1487,75 @@ const slData string = "" + // Size: 5980 bytes
" %[2]v\x02http2: Framer %[1]p: prebrano %[2]v\x02http2: dekodirano polje" +
" hpack %+[1]v"
+var viIndex = []uint32{ // 177 elements
+ // Entry 0 - 1F
+ 0x00000000, 0x00000006, 0x00000006, 0x00000006,
+ 0x00000006, 0x00000006, 0x00000006, 0x00000006,
+ 0x00000006, 0x00000006, 0x00000006, 0x00000011,
+ 0x00000011, 0x00000023, 0x00000036, 0x00000049,
+ 0x0000005c, 0x0000006f, 0x0000007e, 0x0000007e,
+ 0x0000007e, 0x0000007e, 0x0000007e, 0x0000007e,
+ 0x0000007e, 0x000000a0, 0x000000a0, 0x000000a0,
+ 0x000000a0, 0x000000a0, 0x000000a0, 0x000000c0,
+ // Entry 20 - 3F
+ 0x000000c0, 0x000000c0, 0x000000c0, 0x000000c0,
+ 0x000000c0, 0x000000db, 0x000000db, 0x000000db,
+ 0x000000db, 0x000000db, 0x000000db, 0x000000db,
+ 0x000000db, 0x000000db, 0x000000db, 0x000000db,
+ 0x000000db, 0x000000db, 0x000000db, 0x000000f5,
+ 0x00000104, 0x0000019b, 0x000001a2, 0x000001a2,
+ 0x000001b1, 0x000001b1, 0x000001b1, 0x000001b1,
+ 0x000001b1, 0x000001b1, 0x000001b1, 0x000001b1,
+ // Entry 40 - 5F
+ 0x000001b1, 0x000001b1, 0x000001c0, 0x000001c0,
+ 0x000001c0, 0x000001c0, 0x000001d2, 0x000001ec,
+ 0x00000218, 0x00000236, 0x00000257, 0x00000257,
+ 0x0000026a, 0x00000274, 0x00000286, 0x00000286,
+ 0x00000286, 0x00000286, 0x00000286, 0x00000286,
+ 0x00000286, 0x0000028c, 0x0000028c, 0x000002a3,
+ 0x000002bb, 0x000002e1, 0x00000302, 0x00000317,
+ 0x00000344, 0x00000344, 0x00000344, 0x00000344,
+ // Entry 60 - 7F
+ 0x00000344, 0x00000344, 0x00000344, 0x00000344,
+ 0x00000344, 0x00000344, 0x00000344, 0x00000344,
+ 0x00000344, 0x00000344, 0x00000344, 0x00000344,
+ 0x00000344, 0x00000344, 0x00000344, 0x00000344,
+ 0x00000344, 0x00000344, 0x00000344, 0x00000344,
+ 0x00000344, 0x00000344, 0x00000344, 0x00000344,
+ 0x00000344, 0x00000344, 0x00000344, 0x00000344,
+ 0x00000344, 0x00000344, 0x00000344, 0x00000344,
+ // Entry 80 - 9F
+ 0x00000344, 0x00000344, 0x00000344, 0x00000344,
+ 0x00000344, 0x00000344, 0x00000344, 0x00000344,
+ 0x00000344, 0x00000344, 0x00000344, 0x00000344,
+ 0x00000344, 0x00000344, 0x00000344, 0x00000344,
+ 0x00000344, 0x00000344, 0x00000344, 0x00000344,
+ 0x00000344, 0x00000344, 0x00000344, 0x00000344,
+ 0x00000344, 0x00000344, 0x00000344, 0x00000344,
+ 0x00000344, 0x00000344, 0x00000344, 0x00000344,
+ // Entry A0 - BF
+ 0x00000344, 0x00000344, 0x00000344, 0x00000344,
+ 0x00000344, 0x00000344, 0x00000344, 0x00000344,
+ 0x00000344, 0x00000344, 0x00000344, 0x00000344,
+ 0x00000344, 0x00000344, 0x00000344, 0x00000344,
+ 0x00000344,
+} // Size: 732 bytes
+
+const viData string = "" + // Size: 836 bytes
+ "\x02Lỗi\x02Vừa xong\x14\x01\x81\x01\x00\x00\x0b\x02%[1]d năm\x14\x01\x81" +
+ "\x01\x00\x00\x0c\x02%[1]d ngày\x14\x01\x81\x01\x00\x00\x0c\x02%[1]d giờ" +
+ "\x14\x01\x81\x01\x00\x00\x0c\x02%[1]d phút\x14\x01\x81\x01\x00\x00\x0c" +
+ "\x02%[1]d giây\x02%[1]s trước\x02Địa chỉ IP không hợp lệ\x02Cổng (port) " +
+ "không hợp lệ\x02Tên VPN không hợp lệ\x02Thông tin về WireGuard\x02Logo W" +
+ "ireGuard\x02Phiên bản ứng dụng: %[1]s\x0aPhiên bản Golang của WG: %[2]s" +
+ "\x0aPhiên bản Golang: %[3]s\x0aHệ điều hành: %[4]s\x0aKiến trúc xử lý: %" +
+ "[5]s\x02Đóng\x02Trạng thái:\x02Đầu cuối:\x02đã kích hoạt\x02Nhận %[1]s, " +
+ "gứi %[2]s\x02Không thể xác định tình trạng VPN\x02Không thể kích hoạt VP" +
+ "N\x02Không thể vô hiệu hóa VPN\x02Mạng ngang hàng\x02Tạo VPN\x02Chỉnh sử" +
+ "a VPN\x02Huỷ\x02Tên không hợp lệ\x02Yêu cầu nhập tên.\x02Tên VPN ‘%[1]s'" +
+ " không hợp lệ.\x02Không thể liệt kê các VPN\x02VPN đã tồn tại\x02Đã tồn " +
+ "tại VPN với tên ‘%[1]s’."
+
var zh_CNIndex = []uint32{ // 177 elements
// Entry 0 - 1F
0x00000000, 0x00000007, 0x00000031, 0x00000048,
@@ -1337,4 +1656,107 @@ const zh_CNData string = "" + // Size: 4463 bytes
" %[1]p: 写入了 %[2]v\x02http2: 成帧器 %[1]p: 读取了 %[2]v\x02http2: 解码的 hpack 字段 " +
"%+[1]v"
- // Total table size 56355 bytes (55KiB); checksum: 712539F7
+var zh_TWIndex = []uint32{ // 177 elements
+ // Entry 0 - 1F
+ 0x00000000, 0x00000007, 0x00000037, 0x00000056,
+ 0x00000066, 0x000000a4, 0x000000e3, 0x00000114,
+ 0x00000157, 0x000001bc, 0x000001f8, 0x00000205,
+ 0x0000021e, 0x0000022f, 0x00000240, 0x00000254,
+ 0x00000268, 0x00000279, 0x00000283, 0x0000028c,
+ 0x00000299, 0x000002a6, 0x000002b3, 0x000002c0,
+ 0x000002cf, 0x000002e3, 0x00000305, 0x00000324,
+ 0x0000033e, 0x00000366, 0x00000374, 0x00000384,
+ // Entry 20 - 3F
+ 0x000003aa, 0x000003c3, 0x000003e2, 0x0000040b,
+ 0x00000424, 0x00000437, 0x00000453, 0x00000469,
+ 0x00000488, 0x000004a2, 0x000004c8, 0x000004d4,
+ 0x000004f6, 0x00000512, 0x0000052f, 0x00000547,
+ 0x0000055f, 0x00000563, 0x00000565, 0x00000576,
+ 0x0000058c, 0x0000060c, 0x00000613, 0x00000626,
+ 0x0000062d, 0x0000063f, 0x0000064b, 0x00000652,
+ 0x0000065c, 0x00000660, 0x00000667, 0x00000675,
+ // Entry 40 - 5F
+ 0x00000685, 0x00000695, 0x0000069f, 0x000006b0,
+ 0x000006c3, 0x000006ca, 0x000006d4, 0x000006f6,
+ 0x0000070f, 0x00000722, 0x0000073b, 0x0000074a,
+ 0x00000751, 0x00000761, 0x00000774, 0x00000780,
+ 0x0000078c, 0x00000795, 0x000007ca, 0x0000086b,
+ 0x00000877, 0x0000087e, 0x0000088a, 0x0000089a,
+ 0x000008b0, 0x000008d4, 0x000008ed, 0x000008fd,
+ 0x0000091e, 0x0000093d, 0x00000950, 0x00000983,
+ // Entry 60 - 7F
+ 0x0000098d, 0x0000099d, 0x000009ad, 0x000009bd,
+ 0x000009c4, 0x000009cb, 0x000009d7, 0x000009e3,
+ 0x000009f2, 0x000009f9, 0x00000a06, 0x00000a35,
+ 0x00000a45, 0x00000a5b, 0x00000a68, 0x00000a97,
+ 0x00000aac, 0x00000ac4, 0x00000af1, 0x00000b07,
+ 0x00000b17, 0x00000b24, 0x00000b36, 0x00000b4e,
+ 0x00000b5a, 0x00000b71, 0x00000b83, 0x00000b92,
+ 0x00000ba1, 0x00000bb5, 0x00000bd0, 0x00000bea,
+ // Entry 80 - 9F
+ 0x00000c0e, 0x00000c15, 0x00000c26, 0x00000c7f,
+ 0x00000c86, 0x00000c92, 0x00000caa, 0x00000cb7,
+ 0x00000cca, 0x00000ced, 0x00000d05, 0x00000d2a,
+ 0x00000d42, 0x00000d5d, 0x00000d79, 0x00000d95,
+ 0x00000dbf, 0x00000ddb, 0x00000deb, 0x00000e0c,
+ 0x00000e3f, 0x00000e52, 0x00000e70, 0x00000ea0,
+ 0x00000eb5, 0x00000edf, 0x00000f05, 0x00000f18,
+ 0x00000f34, 0x00000f47, 0x00000f6b, 0x00000faf,
+ // Entry A0 - BF
+ 0x00000fcb, 0x00000fe9, 0x00001002, 0x00001038,
+ 0x00001050, 0x000010b1, 0x00001106, 0x0000111f,
+ 0x0000112c, 0x00001148, 0x0000116d, 0x00001183,
+ 0x000011bc, 0x000011dd, 0x000011fd, 0x0000121f,
+ 0x00001247,
+} // Size: 732 bytes
+
+const zh_TWData string = "" + // Size: 4679 bytes
+ "\x02錯誤\x02(無參數):提升權限並安裝管理服務\x02使用方法: %[1]s [\x0a%[2]s]\x02命令列選項\x02無法確定該" +
+ "處理程序是否在 WOW64 下執行: %[1]v\x02您必須在此電腦上執行 64 位元版本的 WireGuard。\x02無法開啓目前處理" +
+ "程序的權杖: %[1]v\x02WireGuard 可能只能被內建的「%[1]s」群組成員使用。\x02WireGuard 正在執行,但 U" +
+ "I 只能從內建的內建的「%[1]s」群組成員的桌面存取。\x02WireGuard 的工作列圖示在 30 秒後並沒有顯示。\x02就是現在" +
+ "\x02系統時鐘倒退了!\x14\x01\x81\x01\x00\x00\x0a\x02%[1]d 年\x14\x01\x81\x01\x00" +
+ "\x00\x0a\x02%[1]d 天\x14\x01\x81\x01\x00\x00\x0d\x02%[1]d 小時\x14\x01\x81" +
+ "\x01\x00\x00\x0d\x02%[1]d 分鐘\x14\x01\x81\x01\x00\x00\x0a\x02%[1]d 秒\x02%" +
+ "[1]s 前\x02%[1]d\u00a0B\x02%.2[1]f\u00a0KiB\x02%.2[1]f\u00a0MiB\x02%.2[1]" +
+ "f\u00a0GiB\x02%.2[1]f\u00a0TiB\x02%[1]s: %[2]q\x02無效的 IP 位址\x02無效的網路位址首碼" +
+ "長度\x02Endpoint 中沒有指定埠號\x02無效的 Endpoint 位址\x02括號中必須包含一個 IPv6 位址\x02無效的 " +
+ "MTU\x02無效的埠號\x02無效的 Persistent Keepalive 設定\x02無效的金鑰: %[1]v\x02金鑰必須剛好長 3" +
+ "2 bytes\x02數值必須介於 0 到 2^64-1: %[1]v\x02一行中有兩個逗號\x02隧道名稱無效\x02行必須出現在段落中" +
+ "\x02必須要有一個值\x02[Interface] 中有無效選項\x02[Peer] 中有無效選項\x02Interface 中必須要有一把私" +
+ "鑰\x02[未指定]\x02每個 Peer 都必須要有公鑰\x02讀取設定時發生錯誤\x02Interface 中的金鑰無效\x02協定版本" +
+ "必須為 1\x02Peer 中的金鑰無效\x02、\x02 \x02關於 WireGuard\x02WireGuard logo 圖片" +
+ "\x02應用程式版本: %[1]s\x0a後端程式(Go 實作)版本: %[2]s\x0aGo 版本: %[3]s\x0a作業系統: %[4]s" +
+ "\x0a架構: %[5]s\x02關閉\x02♥ 捐贈! (&D)\x02狀態\x02中斷連線 (&D)\x02連線 (&A)\x02公鑰" +
+ "\x02監聽埠\x02MTU\x02位址\x02DNS 伺服器\x02預交換金鑰\x02允許的位址\x02連接點\x02Keepalive 間隔" +
+ "\x02最後交握時間\x02流量\x02已啓用\x02已收到 %[1]s;已傳送 %[2]s\x02無法確認隧道狀態\x02無法連接隧道\x02" +
+ "無法斷開隧道連線\x02[隧道] %[1]s\x02節點\x02建立新隧道\x02編輯隧道設定\x02名稱 (&N)\x02公鑰 (&P)" +
+ "\x02(未知)\x02阻斷未經過隧道的流量(kill-switch) (&B)\x02只有一個節點且該節點允許位址包含 0.0.0.0/0 或" +
+ " ::/0 時,使用防火牆攔截所有非通過隧道的流量。\x0a(DHCP 及 NDP 流量除外)\x02儲存 (&S)\x02取消\x02設定 (" +
+ "&C)\x02無效的名稱\x02必須填寫名稱。\x02無效的隧道名稱「%[1]s」。\x02無法列出現有隧道\x02隧道已存在\x02已有同名隧" +
+ "道「%[1]s」。\x02無法建立新的隧道設定\x02檔案寫入失敗\x02檔案已存在: %[1]s\x0a\x0a您確定要覆蓋嗎?\x02已" +
+ "連線\x02正在連線…\x02已中斷連線\x02正在中斷…\x02未知\x02日誌\x02複製 (&C)\x02全選 (&A)\x02匯出…" +
+ " (&S)\x02時間\x02日誌訊息\x02純文字 (*.txt)|*.txt|所有檔案 (*.*)|*.*\x02匯出日誌…\x02關於 W" +
+ "ireGuard (&A)\x02隧道錯誤\x02%[1]s\x0a\x0a如需更多資訊,請查看日誌。\x02%[1]s(已過時)\x02偵測 " +
+ "WireGuard 錯誤\x02無法等待 WireGuard 視窗開啓: %[1]v\x02WireGuard - 未連線\x02[狀態] 未知" +
+ "\x02[位址] 無\x02管理隧道 (&M)\x02從檔案匯入… (&I)\x02離開 (&X)\x02WireGuard 隧道錯誤\x02W" +
+ "ireGuard - %[1]s\x02[狀態] %[1]s\x02[位址] %[1]s\x02WireGuard 已連線\x02已連線至隧道 " +
+ "- %[1]s\x02WireGuard 已中斷連線\x02已中斷與隧道的連線 - %[1]s\x02更新\x02WireGuard 更新" +
+ "\x02更新的 WireGuard 已經為您準備好了。\x0a強烈建議您立即更新 WireGuard。\x02隧道\x02編輯 (&E)\x02" +
+ "新增隧道精靈 (&E)\x02新增隧道\x02刪除選取隧道\x02匯出所有隧道(ZIP 格式)\x02切換連線狀態 (&T)\x02匯出所有" +
+ "隧道至 &ZIP 壓縮檔\x02編輯選取隧道 (&S)\x02刪除已選取隧道 (&R)\x02無法匯入設定: %[1]v\x02無法列出隧道" +
+ ": %[1]v\x02已有另一個同名的隧道「%[1]s」\x02無法匯入設定: %[1]v\x02已匯入隧道\x14\x01\x81\x01" +
+ "\x00\x00\x1a\x02已匯入 %[1]d 個隧道\x14\x02\x80\x01\x00-\x02已匯入 %[1]d 個隧道(共 %[" +
+ "2]d 個)\x02無法建立隧道\x14\x01\x81\x01\x00\x00\x17\x02刪除 %[1]d 個隧道\x14\x01\x81" +
+ "\x01\x00\x00)\x02您確定要刪除 %[1]d 個隧道嗎?\x02刪除隧道 - %[1]s\x02您確定要刪除隧道「%[1]s」嗎?" +
+ "\x02%[1]s\x0a\x0a您將無法復原此操作。\x02無法刪除隧道\x02無法刪除隧道: %[1]s\x02無法刪除隧道\x14\x01" +
+ "\x81\x01\x00\x00\x1d\x02無法刪除 %[1]d 個隧道\x02隧道設定檔 (*.zip, *.conf)|*.zip;*." +
+ "conf|所有檔案 (*.*)|*.*\x02從檔案中匯入隧道…\x02隧道設定檔 (*.zip)|*.zip\x02匯出隧道設定至…\x02%" +
+ "[1]s(未簽署發行版本,無法自動更新)\x02離開 WireGuard 失敗\x02無法結束服務: %[1]v。\x0a您可能需要手動從服務管" +
+ "理中結束 WireGuard 服務。\x02更新的 WireGuard 已經為您準備好了。\x0a強烈建議您立即進行更新。\x02狀態:等待" +
+ "使用者\x02立即更新\x02狀態:等待更新服務\x02錯誤: %[1]v。請稍後再試。\x02狀態:已完成!\x02http2: Fram" +
+ "er %[1]p: failed to decode just-written frame\x02http2: Framer %[1]p: wr" +
+ "ote %[2]v\x02http2: Framer %[1]p: read %[2]v\x02http2: decoded hpack fie" +
+ "ld %+[1]v\x02設定的項目必須要有一個等號"
+
+ // Total table size 71148 bytes (69KiB); checksum: 16378E4E