From 99cb546b5964fe72adf5d8251fb769d8d3061e83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iker=20Garc=C3=ADa=20Calvi=C3=B1o?= Date: Tue, 15 Jul 2025 12:51:26 +0200 Subject: [PATCH] Changes to migrate to BCP 47 locale standard --- src/dashboard.py | 4 +- src/static/locale/active_languages.json | 127 ---- src/static/locale/hu-hu.json | 369 ---------- src/static/locale/id.json | 361 ---------- src/static/locale/pt-br.json | 369 ---------- src/static/locale/verify_locale_files.py | 62 -- .../{locale/ar-sa.json => locales/ar-SA.json} | 0 .../{locale/be.json => locales/be-BY.json} | 0 .../{locale/ca.json => locales/ca-ES.json} | 0 .../{locale/cs.json => locales/cs-CZ.json} | 0 .../{locale/de-de.json => locales/de-DE.json} | 0 .../{locale/es-es.json => locales/es-ES.json} | 643 ++++++++++-------- .../{locale/fa.json => locales/fa-IR.json} | 0 .../{locale/fr-ca.json => locales/fr-CA.json} | 0 .../{locale/fr-fr.json => locales/fr-FR.json} | 0 .../{locale/it-it.json => locales/it-IT.json} | 0 .../{locale/ja-jp.json => locales/ja-JP.json} | 0 .../{locale/ko.json => locales/ko-KR.json} | 0 src/static/locales/locale_manager.py | 301 ++++++++ .../locale_template.json} | 0 .../{locale/nl-nl.json => locales/nl-NL.json} | 0 .../{locale/pl.json => locales/pl-PL.json} | 0 .../{locale/ru.json => locales/ru-RU.json} | 0 src/static/locales/supported_locales.json | 134 ++++ .../{locale/sv-se.json => locales/sv-SE.json} | 0 .../{locale/th.json => locales/th-TH.json} | 0 .../{locale/tr-tr.json => locales/tr-TR.json} | 0 .../{locale/uk.json => locales/uk-UA.json} | 0 .../{locale/zh-cn.json => locales/zh-CN.json} | 0 .../{locale/zh-hk.json => locales/zh-HK.json} | 0 30 files changed, 787 insertions(+), 1583 deletions(-) delete mode 100644 src/static/locale/active_languages.json delete mode 100644 src/static/locale/hu-hu.json delete mode 100644 src/static/locale/id.json delete mode 100644 src/static/locale/pt-br.json delete mode 100644 src/static/locale/verify_locale_files.py rename src/static/{locale/ar-sa.json => locales/ar-SA.json} (100%) rename src/static/{locale/be.json => locales/be-BY.json} (100%) rename src/static/{locale/ca.json => locales/ca-ES.json} (100%) rename src/static/{locale/cs.json => locales/cs-CZ.json} (100%) rename src/static/{locale/de-de.json => locales/de-DE.json} (100%) rename src/static/{locale/es-es.json => locales/es-ES.json} (90%) rename src/static/{locale/fa.json => locales/fa-IR.json} (100%) rename src/static/{locale/fr-ca.json => locales/fr-CA.json} (100%) rename src/static/{locale/fr-fr.json => locales/fr-FR.json} (100%) rename src/static/{locale/it-it.json => locales/it-IT.json} (100%) rename src/static/{locale/ja-jp.json => locales/ja-JP.json} (100%) rename src/static/{locale/ko.json => locales/ko-KR.json} (100%) create mode 100644 src/static/locales/locale_manager.py rename src/static/{locale/language_template.json => locales/locale_template.json} (100%) rename src/static/{locale/nl-nl.json => locales/nl-NL.json} (100%) rename src/static/{locale/pl.json => locales/pl-PL.json} (100%) rename src/static/{locale/ru.json => locales/ru-RU.json} (100%) create mode 100644 src/static/locales/supported_locales.json rename src/static/{locale/sv-se.json => locales/sv-SE.json} (100%) rename src/static/{locale/th.json => locales/th-TH.json} (100%) rename src/static/{locale/tr-tr.json => locales/tr-TR.json} (100%) rename src/static/{locale/uk.json => locales/uk-UA.json} (100%) rename src/static/{locale/zh-cn.json => locales/zh-CN.json} (100%) rename src/static/{locale/zh-hk.json => locales/zh-HK.json} (100%) diff --git a/src/dashboard.py b/src/dashboard.py index fbdc3120..90654616 100644 --- a/src/dashboard.py +++ b/src/dashboard.py @@ -1110,9 +1110,9 @@ def API_Welcome_Finish(): class Locale: def __init__(self): - self.localePath = './static/locale/' + self.localePath = './static/locales/' self.activeLanguages = {} - with open(os.path.join(f"{self.localePath}active_languages.json"), "r") as f: + with open(os.path.join(f"{self.localePath}supported_locales.json"), "r") as f: self.activeLanguages = sorted(json.loads(''.join(f.readlines())), key=lambda x : x['lang_name']) def getLanguage(self) -> dict | None: diff --git a/src/static/locale/active_languages.json b/src/static/locale/active_languages.json deleted file mode 100644 index 79a2c228..00000000 --- a/src/static/locale/active_languages.json +++ /dev/null @@ -1,127 +0,0 @@ -[ - { - "lang_id": "id", - "lang_name": "Bahasa Indonesia", - "lang_name_localized": "Bahasa Indonesia" - }, - { - "lang_id": "zh-cn", - "lang_name": "Chinese (Simplified)", - "lang_name_localized": "中文(简体)" - }, - { - "lang_id": "be", - "lang_name": "Belarusian", - "lang_name_localized": "Беларуская" - }, - { - "lang_id": "ca", - "lang_name": "Catalan", - "lang_name_localized": "Català" - }, - { - "lang_id": "zh-hk", - "lang_name": "Chinese (Traditional)", - "lang_name_localized": "中文(繁體)" - }, - { - "lang_id": "cs", - "lang_name": "Czech", - "lang_name_localized": "Česky" - }, - { - "lang_id": "nl-nl", - "lang_name": "Dutch", - "lang_name_localized": "Nederlands" - }, - { - "lang_id": "ar-sa", - "lang_name": "Arabic", - "lang_name_localized": "العربية" - }, - { - "lang_id": "en", - "lang_name": "English", - "lang_name_localized": "English" - }, - { - "lang_id": "fa", - "lang_name": "Farsi", - "lang_name_localized": "فارسی" - }, - { - "lang_id": "fr-ca", - "lang_name": "French (Quebec)", - "lang_name_localized": "Français (Québec)" - }, - { - "lang_id": "fr-fr", - "lang_name": "French (France)", - "lang_name_localized": "Français (France)" - }, - { - "lang_id": "de-de", - "lang_name": "German", - "lang_name_localized": "Deutsch" - }, - { - "lang_id": "hu-hu", - "lang_name": "Hungarian", - "lang_name_localized": "Magyar" - }, - { - "lang_id": "it-it", - "lang_name": "Italian", - "lang_name_localized": "Italiano" - }, - { - "lang_id": "ja-jp", - "lang_name": "Japanese", - "lang_name_localized": "日本語" - }, - { - "lang_id": "ko", - "lang_name": "Korean", - "lang_name_localized": "한국어" - }, - { - "lang_id": "pl", - "lang_name": "Polish", - "lang_name_localized": "Polski" - }, - { - "lang_id": "pt-br", - "lang_name": "Portuguese (Brazil)", - "lang_name_localized": "Português (Brasil)" - }, - { - "lang_id": "ru", - "lang_name": "Russian", - "lang_name_localized": "Русский" - }, - { - "lang_id": "es-es", - "lang_name": "Spanish", - "lang_name_localized": "Español" - }, - { - "lang_id": "sv-se", - "lang_name": "Swedish", - "lang_name_localized": "Svenska" - }, - { - "lang_id": "th", - "lang_name": "Thai", - "lang_name_localized": "ภาษาไทย" - }, - { - "lang_id": "tr-tr", - "lang_name": "Turkish", - "lang_name_localized": "Türkçe" - }, - { - "lang_id": "uk", - "lang_name": "Ukrainian", - "lang_name_localized": "Українська" - } -] diff --git a/src/static/locale/hu-hu.json b/src/static/locale/hu-hu.json deleted file mode 100644 index 2dde659b..00000000 --- a/src/static/locale/hu-hu.json +++ /dev/null @@ -1,369 +0,0 @@ -{ - "Welcome to": "Üdvözlünk a(z) ", - "Username": "Felhasználónév", - "Password": "Jelszó", - "OTP from your authenticator": "Egyszer használatos kód (OTP) az autentikátorodból", - "Sign In": "Bejelentkezés", - "Signing In\\.\\.\\.": "Bejelentkezés folyamatban...", - "Access Remote Server": "Távoli szerver elérése", - "Server": "Szerver", - "Click": "Kattintson", - "Pinging...": "Pingelés...", - "to add your server": "a szerver hozzáadásához", - "Server List": "Szerverlista", - "Sorry, your username or password is incorrect.": "Sajnáljuk, a felhasználónév vagy a jelszó hibás.", - "Home": "Főoldal", - "Settings": "Beállítások", - "Tools": "Eszközök", - "Sign Out": "Kijelentkezés", - "Checking for update...": "Frissítések ellenőrzése...", - "You're on the latest version": "Már a legfrissebb verziót használja", - "WireGuard Configurations": "WireGuard konfigurációk", - "You don't have any WireGuard configurations yet. Please check the configuration folder or change it in Settings. By default the folder is /etc/wireguard.": "Még nincsenek WireGuard konfigurációi. Kérjük, ellenőrizze a konfigurációs mappát, vagy módosítsa a beállításoknál. Alapértelmezés szerint a mappa a /etc/wireguard.", - "Configuration": "Konfiguráció", - "Configurations": "Konfigurációk", - "Peers Default Settings": "Alapértelmezett társ beállítások", - "Dashboard Theme": "Vezérlőpanel téma", - "Light": "Világos", - "Dark": "Sötét", - "This will be changed globally, and will be apply to all peer's QR code and configuration file.": "Ez globálisan változik, és minden társ QR-kódjára és konfigurációs fájljára alkalmazva lesz.", - "WireGuard Configurations Settings": "WireGuard konfiguráció beállításai", - "Configurations Directory": "Konfigurációs könyvtár", - "Remember to remove / at the end of your path. e.g /etc/wireguard": "Ne felejtse el eltávolítani a '/' karaktert az útvonal végéről. (pl. /etc/wireguard)", - "WGDashboard Account Settings": "WGDashboard fiókbeállítások", - "Current Password": "Jelenlegi jelszó", - "New Password": "Új jelszó", - "Repeat New Password": "Új jelszó ismétlése", - "Update Password": "Jelszó frissítése", - "Multi-Factor Authentication \\(MFA\\)": "Többfaktoros hitelesítés (MFA)", - "Reset": "Visszaállítás", - "Setup": "Beállítás", - "API Keys": "API-kulcsok", - "API Key": "API-kulcs", - "Key": "Kulcs", - "Enabled": "Engedélyezve", - "Disabled": "Letiltva", - "No WGDashboard API Key": "Nincs WGDashboard API-kulcs", - "Expire At": "Lejár:", - "Are you sure to delete this API key\\?": "Biztosan törölni szeretné ezt az API-kulcsot?", - "Create API Key": "API-kulcs létrehozása", - "When should this API Key expire\\?": "Mikor járjon le ez az API-kulcs?", - "Never Expire": "Soha ne járjon le", - "Don't think that's a good idea": "Szerintem ez nem jó ötlet", - "Creating\\.\\.\\.": "Létrehozás...", - "Create": "Létrehozás", - "Status": "Állapot", - "On": "Bekapcsolva", - "Off": "Kikapcsolva", - "Turning On\\.\\.\\.": "Bekapcsolás...", - "Turning Off\\.\\.\\.": "Kikapcsolás...", - "Address": "Cím", - "Listen Port": "Port hallgatása", - "Table": "Táblázat", - "Public Key": "Nyilvános kulcs", - "Connected Peers": "Csatlakozott társak", - "Total Usage": "Teljes használat", - "Total Received": "Összes fogadott", - "Total Sent": "Összes elküldött", - "Peers Data Usage": "Társak adatforgalma", - "Real Time Received Data Usage": "Valós idejű fogadott forgalom", - "Real Time Sent Data Usage": "Valós idejű elküldött forgalom", - "Peer": "Társ", - "Peers": "Társak", - "Peer Settings": "Társ beállítások", - "Download All": "Összes letöltése", - "Search": "Keresés", - "Search Peers\\.\\.\\.": "Társak keresése...", - "Display": "Megjelenítés", - "Sort By": "Rendezés", - "Refresh Interval": "Frissítési időköz", - "Name": "Név", - "Allowed IPs": "Engedélyezett IP-k", - "Restricted": "Korlátozott", - "(.*) Seconds": "$1 másodperc", - "(.*) Minutes": "$1 perc", - "Configuration Settings": "Konfiguráció beállítások", - "Peer Jobs": "Társ feladatok", - "Active Jobs": "Aktív feladatok", - "All Active Jobs": "Összes aktív feladat", - "Logs": "Naplók", - "Private Key": "Privát kulcs", - "\\(Required for QR Code and Download\\)": "(Szükséges a QR-kódhoz és letöltéshez)", - "\\(Required\\)": "(Szükséges)", - "Endpoint Allowed IPs": "Végpont engedélyezett IP-k", - "DNS": "DNS", - "Optional Settings": "Opcionális beállítások", - "Pre-Shared Key": "Előre megosztott kulcs", - "MTU": "MTU", - "Persistent Keepalive": "Folyamatos keepalive", - "Reset Data Usage": "Adatforgalom visszaállítása", - "Total": "Összesen", - "Sent": "Elküldött", - "Received": "Fogadott", - "Revert": "Visszaállítás", - "Save Peer": "Társ mentése", - "QR Code": "QR-kód", - "Schedule Jobs": "Feladatok ütemezése", - "Job": "Feladat", - "Job ID": "Feladat azonosító", - "Unsaved Job": "Mentetlen feladat", - "This peer does not have any job yet\\.": "Ennek a társnak még nincs feladata.", - "if": "ha", - "is": "van", - "then": "akkor", - "larger than": "nagyobb mint", - "Date": "Dátum", - "Restrict Peer": "Társ korlátozása", - "Delete Peer": "Társ törlése", - "Edit": "Szerkesztés", - "Delete": "Törlés", - "Deleting...": "Törlés...", - "Cancel": "Mégse", - "Save": "Mentés", - "No active job at the moment\\.": "Jelenleg nincs aktív feladat.", - "Jobs Logs": "Feladatnaplók", - "Updated at": "Frissítve:", - "Refresh": "Frissítés", - "Filter": "Szűrés", - "Success": "Sikeres", - "Failed": "Sikertelen", - "Log ID": "Napló azonosító", - "Message": "Üzenet", - "Share Peer": "Társ megosztása", - "Currently the peer is not sharing": "A társ jelenleg nincs megosztva", - "Sharing\\.\\.\\.": "Megosztás...", - "Start Sharing": "Megosztás indítása", - "Stop Sharing\\.\\.\\.": "Megosztás leállítása...", - "Stop Sharing": "Megosztás leállítása", - "Access Restricted": "Hozzáférés korlátozva", - "Restrict Access": "Hozzáférés korlátozása", - "Restricting\\.\\.\\.": "Korlátozás...", - "Allow Access": "Hozzáférés engedélyezése", - "Allowing Access\\.\\.\\.": "Engedélyezés...", - "Download \\& QR Code is not available due to no private key set for this peer": "Letöltés és QR-kód nem érhető el, mert nincs beállított privát kulcs ehhez a társhoz", - "Add Peers": "Társ hozzáadása", - "Bulk Add": "Tömeges hozzáadás", - "By adding peers by bulk, each peer's name will be auto generated, and Allowed IP will be assign to the next available IP\\.": "Társak tömeges hozzáadásakor minden társ neve automatikusan generálódik, és az engedélyezett IP a következő elérhető IP lesz.", - "How many peers you want to add\\?": "Hány társat szeretne hozzáadni?", - "You can add up to (.*) peers": "Legfeljebb $1 társat adhat hozzá", - "Use your own Private and Public Key": "Használja saját privát és nyilvános kulcsát", - "Enter IP Address/CIDR": "Adja meg az IP-címet/CIDR-t", - "IP Address/CIDR": "IP-cím/CIDR", - "or": "vagy", - "Pick Available IP": "Elérhető IP kiválasztása", - "No available IP containing": "Nincs elérhető IP, amely tartalmazza", - "Add": "Hozzáadás", - "Adding\\.\\.\\.": "Hozzáadás...", - "Failed to check available update": "Nem sikerült ellenőrizni a frissítéseket", - "Nice to meet you!": "Örülök, hogy megismerhetlek!", - "Please fill in the following fields to finish setup": "Töltse ki az alábbi mezőket a beállítás befejezéséhez", - "Create an account": "Fiók létrehozása", - "Enter an username you like": "Adja meg a kívánt felhasználónevet", - "Enter a password": "Adja meg a jelszót", - "\\(At least 8 characters and make sure is strong enough!\\)": "(Legalább 8 karakter, és legyen elég erős!)", - "Confirm password": "Jelszó megerősítése", - "Next": "Tovább", - "Saving\\.\\.\\.": "Mentés...", - "1\\. Please scan the following QR Code to generate TOTP with your choice of authenticator": "1. Kérjük, olvassa be az alábbi QR-kódot, hogy TOTP-t generáljon az Ön által választott autentikátorral", - "Or you can click the link below:": "Vagy kattintson az alábbi hivatkozásra:", - "2\\. Enter the TOTP generated by your authenticator to verify": "2. Adja meg az autentikátor által generált TOTP-t a megerősítéshez", - "TOTP verified!": "TOTP sikeresen ellenőrizve!", - "I don't need MFA": "Nincs szükségem MFA-ra", - "Complete": "Befejezés", - "(v[0-9.]{1,}) is now available for update!": "$1 frissíthető!", - "Current Version:": "Jelenlegi verzió:", - "Oh no\\.\\.\\. This link is either expired or invalid\\.": "Hoppá... Ez a hivatkozás lejárt vagy érvénytelen.", - "Scan QR Code with the WireGuard App to add peer": "Olvassa be a QR-kódot a WireGuard alkalmazással a társ hozzáadásához", - "or click the button below to download the ": "vagy kattintson az alábbi gombra a letöltéshez: ", - " file": " fájl", - "FROM ": "FORRÁS: ", - "(.*) is on": "$1 be van kapcsolva", - "(.*) is off": "$1 ki van kapcsolva", - "Allowed IPs is invalid": "Az engedélyezett IP-k érvénytelenek", - "Peer created successfully": "A társ sikeresen létrejött", - "Please fill in all required box": "Töltse ki az összes kötelező mezőt", - "Please specify amount of peers you want to add": "Adja meg, hány társat szeretne hozzáadni", - "No more available IP can assign": "Nincs több elérhető IP kiosztható", - "The maximum number of peers can add is (.*)": "A hozzáadható társak maximális száma: $1", - "Generating key pairs by bulk failed": "Nem sikerült tömegesen kulcspárokat generálni", - "Failed to add peers in bulk": "Nem sikerült tömegesen hozzáadni a társakat", - "This peer already exist": "Ez a társ már létezik", - "This IP is not available: (.*)": "Ez az IP nem elérhető: $1", - "Configuration does not exist": "A konfiguráció nem létezik", - "Peer does not exist": "A társ nem létezik", - "Please provide a valid configuration name": "Adjon meg érvényes konfigurációs nevet", - "Peer saved": "A társ mentve", - "Allowed IPs already taken by another peer": "Az engedélyezett IP-ket már egy másik társ foglalta le", - "Endpoint Allowed IPs format is incorrect": "A végpont engedélyezett IP-k formátuma helytelen", - "DNS format is incorrect": "A DNS formátum helytelen", - "MTU format is not correct": "Az MTU formátuma helytelen", - "Persistent Keepalive format is not correct": "A folyamatos keepalive formátuma helytelen", - "Private key does not match with the public key": "A privát kulcs nem egyeztethető a nyilvános kulccsal", - "Update peer failed when updating Pre-Shared Key": "A társ frissítése sikertelen volt az előre megosztott kulcs frissítésekor", - "Update peer failed when updating Allowed IPs": "A társ frissítése sikertelen volt az engedélyezett IP-k frissítésekor", - "Update peer failed when saving the configuration": "A társ frissítése sikertelen volt a konfiguráció mentésekor", - "Peer data usage reset successfully": "A társ adatforgalma sikeresen visszaállítva", - "Peer download started": "A társ letöltése elindult", - "Please specify one or more peers": "Jelöljön ki egy vagy több társat", - "Share link failed to create. Reason: (.*)": "Nem sikerült létrehozni a megosztási hivatkozást. Ok: $1", - "Link expire date updated": "A hivatkozás lejárati dátuma frissítve", - "Link expire date failed to update. Reason: (.*)": "A hivatkozás lejárati dátumának frissítése sikertelen. Ok: $1", - "Peer job saved": "A társ feladata mentve", - "Please specify job": "Adja meg a feladatot", - "Please specify peer and configuration": "Jelölje ki a társat és a konfigurációt", - "Peer job deleted": "A társ feladata törölve", - "API Keys function is successfully enabled": "Az API-kulcs funkció sikeresen engedélyezve", - "API Keys function is successfully disabled": "Az API-kulcs funkció sikeresen letiltva", - "API Keys function is failed to enable": "Az API-kulcs funkció engedélyezése sikertelen", - "API Keys function is failed to disable": "Az API-kulcs funkció letiltása sikertelen", - "WGDashboard API Keys function is disabled": "A WGDashboard API-kulcs funkció letiltva", - "WireGuard configuration path saved": "A WireGuard konfigurációs útvonal mentve", - "API Key deleted": "API-kulcs törölve", - "API Key created": "API-kulcs létrehozva", - "Sign in session ended, please sign in again": "A bejelentkezés lejárt, kérjük jelentkezzen be újra", - "Please specify an IP Address (v4/v6)": "Adjon meg egy IP-címet (v4/v6)", - "Please provide ipAddress and count": "Adja meg az IP-címet és a darabszámot", - "Please provide ipAddress": "Adja meg az IP-címet", - "Dashboard Language": "Vezérlőpanel nyelv", - "Dashboard language update failed": "A vezérlőpanel nyelvének frissítése sikertelen", - "Peer Remote Endpoint": "Társ távoli végpontja", - "New Configuration": "Új konfiguráció", - "Configuration Name": "Konfiguráció neve", - "Configuration name is invalid. Possible reasons:": "A konfiguráció neve érvénytelen. Lehetséges okok:", - "Configuration name already exist\\.": "A konfiguráció neve már létezik.", - "Configuration name can only contain 15 lower/uppercase alphabet, numbers, underscore, equal sign, plus sign, period and hyphen\\.": "A konfiguráció neve csak 15 kis- vagy nagybetűt, számokat, alulvonást, egyenlőségjelet, pluszjelet, pontot és kötőjelet tartalmazhat.", - "Invalid Port": "Érvénytelen port", - "Save Configuration": "Konfiguráció mentése", - "IP Address/CIDR is invalid": "Az IP-cím/CIDR érvénytelen", - "IP Address": "IP-cím", - "Enter IP Address / Hostname": "Adja meg az IP-címet / hosztnevet", - "IP Address / Hostname": "IP-cím / hosztnév", - "Dashboard IP Address \\& Listen Port": "Vezérlőpanel IP-cím és hallgató port", - "Count": "Darabszám", - "Hop": "Ugrás", - "Average RTT \\(ms\\)": "Átlagos RTT (ms)", - "Min RTT \\(ms\\)": "Minimum RTT (ms)", - "Max RTT \\(ms\\)": "Maximum RTT (ms)", - "Geolocation": "Földrajzi hely", - "Is Alive": "Élő?", - "Average / Min / Max Round Trip Time": "Átlagos / min / max oda-vissza idő", - "Sent / Received / Lost Package": "Elküldött / fogadott / elveszett csomag", - "Manual restart of WGDashboard is needed to apply changes on IP Address and Listen Port": "A WGDashboard kézi újraindítása szükséges az IP-cím és a portváltoztatások alkalmazásához", - "Restore Configuration": "Konfiguráció visszaállítása", - "Step (.*)": "Lépés $1", - "Select a backup you want to restore": "Válasszon egy visszaállítandó biztonsági másolatot", - "Click to change a backup": "Kattintson a biztonsági mentés megváltoztatásához", - "Selected Backup": "Kiválasztott mentés", - "You don't have any configuration to restore": "Nincs visszaállítandó konfigurációja", - "Help": "Súgó", - "You can visit our: ": "Látogasson el ide:", - "Official Documentation": "Hivatalos dokumentáció", - "Discord Server": "Discord szerver", - "Backup": "Biztonsági mentés", - "([0-9].*) Backups\\?": "$1 mentés?", - "Yes": "Igen", - "No": "Nem", - "Backup not selected": "Nincs kiválasztva mentés", - "Confirm \\& edit restore information": "Visszaállítási információk megerősítése és szerkesztése", - "(.*) Available IP Address": "$1 elérhető IP-cím", - "Database File": "Adatbázis fájl", - "Contain": "Tartalmaz", - "Restricted Peers\\?": "Korlátozott társak?", - "Restore": "Visszaállítás", - "Restoring": "Visszaállítás folyamatban", - "WGDashboard Settings": "WGDashboard beállítások", - "Peers Settings": "Társ beállítások", - "WireGuard Configuration Settings": "WireGuard konfiguráció beállítások", - "Appearance": "Megjelenés", - "Theme": "Téma", - "Language": "Nyelv", - "Account Settings": "Fiókbeállítások", - "Peer Default Settings": "Társ alapértelmezett beállítások", - "Toggle When Start Up": "Indításkor törlése", - "Other Settings": "Egyéb beállítások", - "Select Peers": "Társak kiválasztása", - "Backup & Restore": "Mentés és visszaállítás", - "Delete Configuration": "Konfiguráció törlése", - "Create Backup": "Biztonsági mentés létrehozása", - "No backup yet, click the button above to create backup\\.": "Még nincs mentés, kattintson a fenti gombra a mentés létrehozásához.", - "Are you sure to delete this backup\\?": "Biztosan törölni szeretné ezt a mentést?", - "Are you sure to restore this backup\\?": "Biztosan visszaállítja ezt a mentést?", - "Backup Date": "Mentés dátuma", - "File": "Fájl", - "Are you sure to delete this configuration\\?": "Biztosan törölni szeretné ezt a konfigurációt?", - "Once you deleted this configuration\\:": "Ha törli ezt a konfigurációt:", - "All connected peers will get disconnected": "Minden kapcsolódott társ le lesz választva", - "Both configuration file \\(.conf\\) and database table related to this configuration will get deleted": "A konfigurációhoz tartozó .conf fájl és adatbázis tábla is törlődik", - "Checking backups...": "Mentések ellenőrzése...", - "This configuration have ([0-9].*) backups": "Ennél a konfigurációnál $1 mentés van", - "This configuration have no backup": "Ennél a konfigurációnál nincs mentés", - "If you're sure, please type in the configuration name below and click Delete": "Ha biztos, írja be a konfiguráció nevét alább, és kattintson a Törlésre", - "Select All": "Összes kiválasztása", - "Clear Selection": "Kiválasztás törlése", - "([0-9].*) Peers\\?": "$1 társ?", - "Download": "Letöltés", - "Downloading": "Letöltés...", - "Download Finished": "Letöltés befejezve", - "Done": "Kész", - "Are you sure to delete": "Biztosan törölni szeretné", - "Are you sure to delete this peer\\?": "Biztosan törölni szeretné ezt a társat?", - "Configuration deleted": "Konfiguráció törölve", - "Configuration saved": "Konfiguráció mentve", - "WGDashboard language update failed": "A WGDashboard nyelvének frissítése sikertelen", - "Configuration restored": "Konfiguráció visszaállítva", - "Allowed IP already taken by another peer": "Az engedélyezett IP-t már egy másik társ használja", - "Failed to allow access of peer (.*)": "Nem sikerült engedélyezni a hozzáférést a társ számára: $1", - "Failed to save configuration through WireGuard": "Nem sikerült menteni a konfigurációt WireGuardon keresztül", - "Allow access successfully": "Hozzáférés sikeresen engedélyezve", - "Deleted ([0-9]{1,}) peer\\(s\\)": "Törölve $1 társ", - "Deleted ([0-9]{1,}) peer\\(s\\) successfully. Failed to delete ([0-9]{1,}) peer\\(s\\)": "Sikeresen törölve $1 társ. $2 társ törlése sikertelen", - "Restricted ([0-9]{1,}) peer\\(s\\)": "Korlátozva $1 társ", - "Restricted ([0-9]{1,}) peer\\(s\\) successfully. Failed to restrict ([0-9]{1,}) peer\\(s\\)": "Sikeresen korlátozva $1 társ. $2 társ korlátozása sikertelen", - "Display As": "Megjelenítés", - "List": "Lista", - "Grid": "Rács", - "Protocol": "Protokoll", - "Open File": "Fájl megnyitása", - "Advanced Options": "Haladó beállítások", - "Allowed IPs Validation": "Engedélyezett IP-k érvényesítése", - "Update Name": "Név frissítése", - "To update this configuration's name, WGDashboard will execute the following operations:": "A konfiguráció nevének frissítéséhez a WGDashboard a következő műveleteket hajtja végre:", - "Duplicate current configuration's database table and \\..\\.conf file with the new name": "A jelenlegi konfiguráció adatbázis táblájának és .conf fájljának másolása az új névvel", - "Delete current configuration's database table and \\..\\.conf file": "A jelenlegi konfiguráció adatbázis táblájának és .conf fájljának törlése", - "Danger Zone": "Veszélyes zóna", - "Configuration File": "Konfigurációs fájl", - "Edit Raw Configuration File": "Nyers konfigurációs fájl szerkesztése", - "Peer Configuration File": "Társ konfigurációs fájl", - "Share with Email": "Megosztás e-mailben", - "Email Account": "E-mail fiók", - "Ready": "Kész", - "Port": "Port", - "Encryption": "Titkosítás", - "No Encryption": "Nincs titkosítás", - "Send From": "Feladó", - "Send Test Email": "Teszt e-mail küldése", - "Email Body Template": "E-mail törzs sablon", - "Live Preview": "Élő előnézet", - "Include configuration file as an attachment": "Konfigurációs fájl mellékletként csatolása", - "Send": "Küldés", - "Sending\\.\\.\\.": "Küldés...", - "Email sent successfully!": "Az e-mail sikeresen elküldve!", - "AmneziaWG Peer Setting": "AmneziaWG társ beállítás", - "System Status": "Rendszerállapot", - "CPU": "CPU", - "Memory": "Memória", - "Swap Memory": "Swap memória", - "Processes": "Folyamatok", - "CPU Usage": "CPU használat", - "Memory Usage": "Memória használat", - "Swap Memory Usage": "Swap memória használat", - "Network": "Hálózat", - "([0-9]{1,}) Interfaces": "$1 interfész", - "Storage": "Tároló", - "([0-9]{1,}) Partitions": "$1 partíció", - "(.*) Used": "$1 használva", - "Untitled Peer": "Névtelen társ", - "Who are you sending to\\?": "Kinek küldi?", - "What\\'s the subject\\?": "Mi a tárgy?", - "What\\'s the body\\?": "Mi a szövegtörzs?" -} \ No newline at end of file diff --git a/src/static/locale/id.json b/src/static/locale/id.json deleted file mode 100644 index ef621daf..00000000 --- a/src/static/locale/id.json +++ /dev/null @@ -1,361 +0,0 @@ -{ - "Welcome to": "Selamat Datang di", - "Username": "Nama Pengguna", - "Password": "Kata Sandi", - "OTP from your authenticator": "OTP dari autentikator Anda", - "Sign In": "Masuk", - "Signing In\\.\\.\\.": "Masuk...", - "Access Remote Server": "Akses Server Remot", - "Server": "server", - "Click": "Klik", - "Pinging...": "Pinging...", - "to add your server": "untuk menambahkan server Anda", - "Server List": "Daftar Server", - "Sorry, your username or password is incorrect.": "Maaf, nama pengguna atau kata sandi Anda salah", - "Home": "Beranda", - "Settings": "Pengaturan", - "Tools": "Peralatan", - "Sign Out": "Keluar", - "Checking for update...": "Memeriksa Pembaruan...", - "You're on the latest version": "Anda berada pada versi paling baru", - "WireGuard Configurations": "Konfigurasi WireGuard", - "You don't have any WireGuard configurations yet. Please check the configuration folder or change it in Settings. By default the folder is /etc/wireguard.": "Anda belum memiliki konfigurasi WireGuard. Mohon periksa folder konfigurasi atau ubah di Pengaturan. Secara bawaan folder nya adalah /etc/wireguard.", - "Configuration": "Konfigurasi", - "Configurations": "Konfigurasi", - "Peers Default Settings": "Pengaturan Bawaan Peers", - "Dashboard Theme": "Tema Dasbor", - "Light": "Terang", - "Dark": "Gelap", - "This will be changed globally, and will be apply to all peer's QR code and configuration file.": "Perubahan ini akan di ubah secara global, dan akan berlaku ke semua kode QR peer dan file konfigurasi.", - "WireGuard Configurations Settings": "Pengaturan Konfigurasi WireGuard", - "Configurations Directory": "Direktori Konfigurasi", - "Remember to remove / at the end of your path. e.g /etc/wireguard": "Jangan lupa untuk menghapus / di akhir path Anda. Contoh /etc/wireguard", - "WGDashboard Account Settings": "Pengaturan Akun WGDashboard", - "Current Password": "Kata Sandi Saat Ini", - "New Password": "Kata Sandi Baru", - "Repeat New Password": "Ulangi Kata Sandi Baru", - "Update Password": "Perbarui Kata Sandi", - "Multi-Factor Authentication \\(MFA\\)": "Autentikasi Multi-Faktor (MFA)", - "Reset": "Atur Ulang", - "Setup": "Pengaturan", - "API Keys": "Kunci API", - "API Key": "Kunci API", - "Key": "Kunci", - "Enabled": "Diaktifkan", - "Disabled": "Dimatikan", - "No WGDashboard API Key": "Tidak Ada Kunci API WGDashboard", - "Expire At": "Kedaluwarsa pada", - "Are you sure to delete this API key\\?": "Apa Anda yakin ingin menghapus kunci API berikut?", - "Create API Key": "Buat Kunci API", - "When should this API Key expire\\?": "Kapan kunci API berikut kedaluwarsa?", - "Never Expire": "Tidak Pernah Kedaluwarsa", - "Don't think that's a good idea": "Sepertinya itu bukan ide yang bagus", - "Creating\\.\\.\\.": "Membuat...", - "Create": "Buat", - "Status": "Keadaan", - "On": "Aktif", - "Off": "Mati", - "Turning On\\.\\.\\.": "Mengaktifkan...", - "Turning Off\\.\\.\\.": "Mematikan...", - "Address": "Alamat", - "Listen Port": "Mendengarkan Port", - "Public Key": "Kunci Publik", - "Connected Peers": "Peers Terhubung", - "Total Usage": "Penggunaan Total", - "Total Received": "Total Diterima", - "Total Sent": "Total Dikirim", - "Peers Data Usage": "Penggunaan Data Peers", - "Real Time Received Data Usage": "Waktu Nyata Menerima Penggunaan Data", - "Real Time Sent Data Usage": "Waktu Nyata Mengirim Penggunaan Data", - "Peer": "Peer", - "Peers": "Peers", - "Peer Settings": "Pengaturan Peer", - "Download All": "Unduh Semua", - "Search": "Cari", - "Search Peers\\.\\.\\.": "Cari Peer...", - "Display": "Tampilan", - "Sort By": "Urutkan", - "Refresh Interval": "Memperbarui Interval", - "Name": "Nama", - "Allowed IPs": "Allowed IPs", - "Restricted": "Terbatas", - "(.*) Seconds": "$1 Detik", - "(.*) Minutes": "$1 Menit", - "Configuration Settings": "Pengaturan Konfigurasi", - "Peer Jobs": "Pekerjaan Peer", - "Active Jobs": "Pekerjaan Aktif", - "All Active Jobs": "Semua Pekerjaan Aktif", - "Logs": "Log", - "Private Key": "Kunci Pribadi", - "\\(Required for QR Code and Download\\)": "(Diperlukan untuk Kode QR dan Unduh)", - "\\(Required\\)": "Diperlukan", - "Endpoint Allowed IPs": "Endpoint IP Allowed IPs", - "DNS": "DNS", - "Optional Settings": "Pengaturan Opsional", - "Pre-Shared Key": "Kunci Pra-Berbagi", - "MTU": "MTU", - "Persistent Keepalive": "Persistent Keepalive", - "Reset Data Usage": "Atur Ulang Penggunaan Data", - "Total": "Total", - "Sent": "Dikirim", - "Received": "Diterima", - "Revert": "Kembalikan", - "Save Peer": "Simpan Peer", - "QR Code": "Kode QR", - "Schedule Jobs": "Jadwalkan Pekerjaan", - "Job": "Pekerjaan", - "Job ID": "ID Pekerjaan", - "Unsaved Job": "Pekerjaan yang belum Tersimpan", - "This peer does not have any job yet\\.": "Peer ini belum memiliki pekerjaan", - "if": "jika", - "is": "adalah", - "then": "maka", - "larger than": "lebih besar dari", - "Date": "Tanggal", - "Restrict Peer": "Batasi Peer", - "Delete Peer": "Hapus Peer", - "Edit": "Ubah", - "Delete": "Hapus", - "Deleting...": "Menghapus...", - "Cancel": "Batal", - "Save": "Simpan", - "No active job at the moment\\.": "Tidak ada pekerjaan aktif untuk saat ini.", - "Jobs Logs": "Log Pekerjaan", - "Updated at": "Diperbarui pada", - "Refresh": "Perbarui", - "Filter": "Penyaring", - "Success": "Sukses", - "Failed": "Gagal", - "Log ID": "ID Log", - "Message": "Pesan", - "Share Peer": "Membagikan Peer", - "Currently the peer is not sharing": "Saat ini peer tidak berbagi", - "Sharing\\.\\.\\.": "Membagikan...", - "Start Sharing": "Mulai Membagikan", - "Stop Sharing\\.\\.\\.": "Berhenti Membagikan...", - "Stop Sharing": "Berhenti Membagikan", - "Access Restricted": "Akses Terbatas", - "Restrict Access": "Batasi Akses", - "Restricting\\.\\.\\.": "Membatasi...", - "Allow Access": "Izinkan Akses", - "Allowing Access\\.\\.\\.": "Mengizinkan Akses...", - "Download \\& QR Code is not available due to no private key set for this peer": "Unduh & Kode QR tidak tersedia karena kunci pribadi tidak di atur untuk peer ini", - "Add Peers": "Tambah Peers", - "Bulk Add": "Tambah Massal", - "By adding peers by bulk, each peer's name will be auto generated, and Allowed IP will be assign to the next available IP\\.": "Dengan menambahkan peers secara massal, setiap nama peer akan dibuat secara otomatis, dan Allowed IP akan ditetapkan ke IP berikutnya yang tersedia.", - "How many peers you want to add\\?": "Berapa banyak peers yang ingin Anda tambah?", - "You can add up to (.*) peers": "Anda dapat menambahkan sebanyak $1 peers", - "Use your own Private and Public Key": "Gunakan kunci pribadi dan kunci publik milik Anda", - "Enter IP Address/CIDR": "Masukkan Alamat IP/CIDR", - "IP Address/CIDR": "Alamat IP/CIDR", - "or": "atau", - "Pick Available IP": "Pilih IP yang Tersedia", - "No available IP containing": "Tidak ada IP yang Tersedia yang memiliki", - "Add": "Tambah", - "Adding\\.\\.\\.": "Menambahkan...", - "Failed to check available update": "Gagal untuk memeriksa pembaruan yang tersedia", - "Nice to meet you!": "Senang bertemu dengan Anda!", - "Please fill in the following fields to finish setup": "Silakan isi kolom berikut untuk menyelesaikan pengaturan", - "Create an account": "Buat akun baru", - "Enter an username you like": "Masukkan nama pengguna yang Anda sukai", - "Enter a password": "Masukkan kata sandi", - "\\(At least 8 characters and make sure is strong enough!\\)": "(Setidaknya 8 karakter dan pastikan cukup kuat!)", - "Confirm password": "Konfirmasi kata sandi", - "Next": "Lanjut", - "Saving\\.\\.\\.": "Menyimpan...", - "1\\. Please scan the following QR Code to generate TOTP with your choice of authenticator": "1. Silakan pindai Kode QR berikut untuk menghasilkan TOTP dengan pilihan autentikator Anda", - "Or you can click the link below:": "Atau Anda bisa klik tautan di bawah", - "2\\. Enter the TOTP generated by your authenticator to verify": "2. Masukkan TOTP yang dihasilkan oleh autentikator anda untuk verifikasi", - "TOTP verified!": "TOTP terverifikasi!", - "I don't need MFA": "Saya tidak membutuhkan MFA", - "Complete": "Selesai", - "(v[0-9.]{1,}) is now available for update!": "v$1 telah tersedia untuk pembaruan!", - "Current Version:": "Versi Saat Ini:", - "Oh no\\.\\.\\. This link is either expired or invalid\\.": "Oh tidak... Tautan ini sudah kedaluwarsa atau salah.", - "Scan QR Code with the WireGuard App to add peer": "Pindai Kode QR menggunakan Aplikasi WireGuard untuk menambahkan peer", - "or click the button below to download the ": "atau klik tomboh di bawah untuk mengunduh", - " file": " file", - "FROM ": "DARI", - "(.*) is on": "$1 aktif", - "(.*) is off": "$1 mati", - "Allowed IPs is invalid": "Allowed IPs salah", - "Peer created successfully": "Peer berhasil terbuat", - "Please fill in all required box": "Silakan isi semua kolom diperlukan", - "Please specify amount of peers you want to add": "Silakan tentukan jumlah peers yang ingin Anda tambahkan", - "No more available IP can assign": "Tidak ada lagi IP yang tersedia yang dapat ditetapkan", - "The maximum number of peers can add is (.*)": "Jumlah maksimal peers yang dapat ditambahkan adalah $1", - "Generating key pairs by bulk failed": "Gagal menghasilkan pasangan kunci secara massal", - "Failed to add peers in bulk": "Gagal untuk menambahkan peers secara massal", - "This peer already exist": "Peer ini sudah ada", - "This IP is not available: (.*)": "IP ini sudah tidak tersedia: $1", - "Configuration does not exist": "Konfigurasi tidak ada", - "Peer does not exist": "Peer tidak ada", - "Please provide a valid configuration name": "Harap berikan nama konfigurasi yang benar", - "Peer saved": "Peer tersimpan", - "Allowed IPs already taken by another peer": "Allowed IPs sudah diambil oleh peer lain", - "Endpoint Allowed IPs format is incorrect": "Bentuk Endpoint Allowed IPs tidak tepat", - "DNS format is incorrect": "Bentuk DNS tidak tepat", - "MTU format is not correct": "Bentuk MTU tidak tepat", - "Persistent Keepalive format is not correct": "Bentuk Persistent Keepalive tidak tepat", - "Private key does not match with the public key": "Kunci pribadi tidak cocok dengan kunci publik", - "Update peer failed when updating Pre-Shared Key": "Pembaruan peer gagal saat memperbarui Kunci Pra-Berbagi", - "Update peer failed when updating Allowed IPs": "Pembaruan peer gagal saat memperbarui Allowed IPs", - "Update peer failed when saving the configuration": "Pembaruan peer gagal saat menyimpan konfigurasi", - "Peer data usage reset successfully": "Penggunaan data peer berhasi di atur ulang", - "Peer download started": "Unduh peer dimulai", - "Please specify one or more peers": "Silakan tentukan satu atau lebih peer", - "Share link failed to create. Reason: (.*)": "Tautan berbagi gagal dibuat. Alasan: $1", - "Link expire date updated": "Tanggal kedaluwarsa tautan diperbarui", - "Link expire date failed to update. Reason: (.*)": "Tanggal kedaluwarsa tautan gagal diperbarui. Alasan: $1", - "Peer job saved": "Pekerjaan peer tersimpan", - "Please specify job": "Silakan tentukan pekerjaan", - "Please specify peer and configuration": "Silakan tentukan peer dan konfigurasi", - "Peer job deleted": "Pekerjaan peer terhapus", - "API Keys function is successfully enabled": "Fungsi Kunci API berhasil diaktifkan", - "API Keys function is successfully disabled": "Fungsi Kunci API berhasil dimatikan", - "API Keys function is failed to enable": "Fungsi Kunci API gagal diaktifkan", - "API Keys function is failed to disable": "Fungsi Kunci API gagal dimatikan", - "WGDashboard API Keys function is disabled": "Fungsi Kunci API WGDashboard dimatikan", - "WireGuard configuration path saved": "path konfigurasi WireGuard tersimpan", - "API Key deleted": "Kunci API terhapus", - "API Key created": "Kunci API terbuat", - "Sign in session ended, please sign in again": "Sesi masuk berakhir, silakan masuk kembali", - "Please specify an IP Address (v4/v6)": "Silakan tentukan alamat IP (v4/v6)", - "Please provide ipAddress and count": "Harap berikan Alamat IP dan count", - "Please provide ipAddress": "Harap berikan Alamat IP", - "Dashboard Language": "Bahasa Dasbor", - "Dashboard language update failed": "Pembaruan bahasa dasbor gagal", - "Peer Remote Endpoint": "Endpoint Remot Peer", - "New Configuration": "Konfigurasi Baru", - "Configuration Name": "Nama Konfigurasi", - "Configuration name is invalid. Possible reasons:": "Nama konfigurasi salah. Kemungkinan alasan:", - "Configuration name already exist\\.": "Nama konfigurasi sudah ada.", - "Configuration name can only contain 15 lower/uppercase alphabet, numbers, underscore, equal sign, plus sign, period and hyphen\\.": "Nama konfigurasi hanya bisa memiliki 15 huruf kecil/ huruf besar alfabet, angka, underscore, simbol sama dengan, simbol tambah, titik dan tanda penghubung.", - "Invalid Port": "Port Salah", - "Save Configuration": "Simpan Konfigurasi", - "IP Address/CIDR is invalid": "Alamat IP/CIDR salah", - "IP Address": "Alamat IP", - "Enter IP Address / Hostname": "Masukkan Alamat IP / Nama Host", - "IP Address / Hostname": "Alamat IP / Nama Host", - "Dashboard IP Address \\& Listen Port": "Alamat IP & Mendengarkan Port Dasbor", - "Count": "Count", - "Geolocation": "Lokasi Geografis", - "Is Alive": "Masih Hidup", - "Average / Min / Max Round Trip Time": "Rata - rata / Min / Maks Round Trip Time", - "Sent / Received / Lost Package": "Terkirim / Diterima / Paket Hilang", - "Manual restart of WGDashboard is needed to apply changes on IP Address and Listen Port": "Memulai ulang WGDashboard dibutuhkan untuk menerapkan perubahan pada Alamat IP dan Mendengarkan Port", - "Restore Configuration": "Pulihkan Konfigurasi", - "Step (.*)": "Step $1", - "Select a backup you want to restore": "Pilih cadangan yang ingin dipulihkan", - "Click to change a backup": "Klik untuk mengganti cadangan", - "Selected Backup": "Cadangan yang dipilih", - "You don't have any configuration to restore": "Anda tidak memiliki konfigurasi untuk dipulihkan", - "Help": "Tolong", - "Backup": "Cadangan", - "([0-9].*) Backups?": "$1 Cadangan?", - "Yes": "Ya", - "No": "Tidak", - "Backup not selected": "Cadangan belum dipilih", - "Confirm \\& edit restore information": "Konfirmasi & ubah informasi pemulihan", - "(.*) Available IP Address": "$1 Alamat IP Tersedia", - "Database File": "File Basis Data", - "Contain": "Memiliki", - "Restricted Peers?": "Peers Terbatas?", - "Restore": "Pemulihan", - "Restoring": "Memulihkan", - "WGDashboard Settings": "Pengaturan WGDashboard", - "Peers Settings": "Pengaturan Peers", - "WireGuard Configuration Settings": "Pengaturan Konfigurasi WireGuard", - "Appearance": "Penampilan", - "Theme": "Tema", - "Language": "Bahasa", - "Account Settings": "Pengaturan Akun", - "Peer Default Settings": "Pengaturan Bawaan Peer", - "Toggle When Start Up": "Beralih Kapan Memulai", - "Other Settings": "Pengaturan Lainnya", - "Select Peers": "Pilih Peers", - "Backup & Restore": "Cadangan & Pemulihan", - "Delete Configuration": "Hapus Konfigurasi", - "Create Backup": "Buat Cadangan", - "No backup yet, click the button above to create backup\\.": "Belum ada cadangan, klik tombol di atas untuk membuat cadangan.", - "Are you sure to delete this backup\\?": "Apakah Anda yakin untuk menghaus cadangan ini?", - "Are you sure to restore this backup?\\": "Apakah Anda yakin untuk memulihkan cadangan ini?", - "Backup Date": "Tanggal Cadangan", - "File": "File", - "Are you sure to delete this configuration\\?": "Apakah Anda yakin untuk menghapus konfigurasi ini?", - "Once you deleted this configuration\\:": "Setelah Anda menghapus konfigurasi ini:", - "All connected peers will get disconnected": "Semua peers yang terhubung akan terputus", - "Both configuration file \\(\\.conf\\) and database table related to this configuration will get deleted": "File Konfigurasi (.conf) dan tabel basis data yang terkait dengan konfigurasi ini akan terhapus", - "Checking backups...": "Memeriksa cadangan...", - "This configuration have ([0-9].*) backups": "Konfigurasi ini memiliki $1 cadangan", - "This configuration have no backup": "Konfigurasi ini tidak memiliki cadangan", - "If you're sure, please type in the configuration name below and click Delete": "Jika Anda yakin, silakan ketik nama konfigurasi dibawah dan klik Hapus", - "Select All": "Pilih Semua", - "Clear Selection": "Hapus Pilihan", - "([0-9].*) Peers?": "$1 Peers?", - "Download": "Unduh", - "Downloading": "Mengunduh", - "Download Finished": "Unduh Selesai", - "Done": "Selesai", - "Are you sure to delete": "Apakah Anda yakin untuk menghapus", - "Are you sure to delete this peer\\?": "Apakah Anda yakin untuk menghapus peer ini?", - "Configuration deleted": "Konfigurasi terhapus", - "Configuration saved": "Konfigurasi tersimpan", - "WGDashboard language update failed": "Pembaruan bahasa WGDashboard gagal", - "Configuration restored": "Konfigurasi terpulihkan", - "Allowed IP already taken by another peer": "Allowed IP telah digunakan oleh peer lain", - "Failed to allow access of peer (.*)": "Gagal untuk mengizinkan akses ke peer $1", - "Failed to save configuration through WireGuard": "Gagal untuk menyimpan konfigurasi melalui WireGuard", - "Allow access successfully": "Berhasil mengizinkan akses", - "Deleted ([0-9]{1,}) peer\\(s\\)": "$1 peer(s) terhapus", - "Deleted ([0-9]{1,}) peer\\(s\\) successfully. Failed to delete ([0-9]{1,}) peer\\(s\\)": "$1 peer(s) berhasil terhapus. Gagal untuk menghapus $2 peer(s)", - "Restricted ([0-9]{1,}) peer\\(s\\)": "$1 peer(s) terbatas", - "Display As": "Tampilkan Sebagai", - "List": "Daftar", - "Grid": "Kisi", - "Protocol": "Protokol", - "Open File": "Buka File", - "Advanced Options": "Opsi Lanjutan", - "Allowed IPs Validation": "Validasi Allowed IPs", - "Update Name": "Pembaruan Nama", - "To update this configuration's name, WGDashboard will execute the following operations:": "Untuk memperbarui konfigurasi nama berikut, WGDashboard akan mengeksekusi operasi berikut:", - "Duplicate current configuration's database table and \\.conf file with the new name": "Duplikat konfigurasi tabel basis data saat ini dan file .conf dengan nama baru", - "Delete current configuration's database table and \\.conf file": "Hapus konfigurasi tabel basis data saat ini dan file .conf", - "Danger Zone": "Zona Berbahaya", - "Configuration File": "File Konfigurasi", - "Edit Raw Configuration File": "Edit File Konfigurasi Mentah", - "Peer Configuration File": "File Konfigurasi Peer", - "Share with Email": "Berbagi dengan Email", - "Who are you sending to?": "Anda ingin kirim ke siapa?", - "What's the subject?": "Apa subjeknya?", - "What's the body?": "Apa isiannya?", - "Email Account": "Akun Email", - "Ready": "Siap", - "Port": "Port", - "Encryption": "Enkripsi", - "No Encryption": "Tidak Ada Enkripsi", - "Send From": "Kirim Dari", - "Send Test Email": "Kirim Email Tes", - "Email Body Template": "Template Isi Email", - "Live Preview": "Pratinjau Langsung", - "Include configuration file as an attachment": "Sertakan file konfigurasi sebagai lampiran", - "Send": "Kirim", - "Sending\\.\\.\\.": "Mengirim...", - "Email sent successfully!": "Email berhasil terkirim!", - "AmneziaWG Peer Setting": "Pengaturan Peer AmneziaWG", - "System Status": "Keadaan Sistem", - "CPU": "CPU", - "Memory": "Memori", - "Swap Memory": "Memori Swap", - "Processes": "Proses", - "CPU Usage": "Penggunaan CPU", - "Memory Usage": "Penggunaan Memori", - "Swap Memory Usage": "Penggunaan Memori Swap", - "Network": "Jaringan", - "([0-9]{1,}) Interfaces": "$1 Antarmuka", - "Storage": "Penyimpanan", - "([0-9]{1,}) Partitions": "$1 Partisi", - "(.*) Used": "$1 terpakai", - "Untitled Peer": "Peer Tanpa Judul", - "Restricted ([0-9]{1,}) peer\\(s\\) successfully. Failed to restrict ([0-9]{1,}) peer\\(s\\)": "$1 peer(s) berhasil terbatas. Gagal untuk membatasi $2 peer(s)" -} \ No newline at end of file diff --git a/src/static/locale/pt-br.json b/src/static/locale/pt-br.json deleted file mode 100644 index 037597c2..00000000 --- a/src/static/locale/pt-br.json +++ /dev/null @@ -1,369 +0,0 @@ -{ - "Welcome to": "Bem vindo ao", - "Username": "Usuário", - "Password": "Senha", - "OTP from your authenticator": "Senha de uso único do seu autenticador", - "Sign In": "Entrar", - "Signing In\\.\\.\\.": "Entrando...", - "Access Remote Server": "Acessar Servidor Remoto", - "Server": "Servidor", - "Click": "Clique", - "Pinging...": "Ping em andamento...", - "to add your server": "para adicionar seu servidor", - "Server List": "Lista de Servidores", - "Sorry, your username or password is incorrect.": "Desculpe, seu usuário ou senha está incorreto.", - "Home": "Página principal", - "Settings": "Definições", - "Tools": "Ferramentas", - "Sign Out": "Sair", - "Checking for update...": "Verificando atualizações...", - "You're on the latest version": "Você está na versão mais recente", - "WireGuard Configurations": "Cofigurações do WireGuard", - "You don't have any WireGuard configurations yet. Please check the configuration folder or change it in Settings. By default the folder is /etc/wireguard.": "Você ainda não tem nenhuma configuração do WireGuard. Verifique a pasta de configurações ou altere-a nas Definições. Por padrão, a pasta é /etc/wireguard.", - "Configuration": "Configuração", - "Configurations": "Configurações", - "Peers Default Settings": "Definições Padrão dos Peers", - "Dashboard Theme": "Tema do Painel", - "Light": "Claro", - "Dark": "Escuro", - "This will be changed globally, and will be apply to all peer's QR code and configuration file.": "Estes itens serão alterados globalmente, e serão aplicados a todos os QR codes e arquivos de configuração dos peers.", - "WireGuard Configurations Settings": "Definições de Configurações do WireGuard", - "Configurations Directory": "Diretório de Configurações", - "Remember to remove / at the end of your path. e.g /etc/wireguard": "Certifique-se de remover / no final do caminho. Exemplo: /etc/wireguard", - "WGDashboard Account Settings": "Definições da Conta do WGDashboard", - "Current Password": "Senha Atual", - "New Password": "Nova Senha", - "Repeat New Password": "Repetir Nova Senha", - "Update Password": "Atualizar Senha", - "Multi-Factor Authentication \\(MFA\\)": "Autenticação em duas etapas (MFA)", - "Reset": "Redefinir", - "Setup": "Definir", - "API Keys": "Chaves de API", - "API Key": "Chave de API", - "Key": "Chave", - "Enabled": "Habilitado", - "Disabled": "Desabilitado", - "No WGDashboard API Key": "Nenhuma Chave de API do WGDashboard", - "Expire At": "Expira Em", - "Are you sure to delete this API key\\?": "Tem certeza que deseja remover esta chave de API?", - "Create API Key": "Criar Chave de API", - "When should this API Key expire\\?": "Quando esta Chave de API deve expirar?", - "Never Expire": "Nunca Expira", - "Don't think that's a good idea": "Não acho que seja uma boa ideia", - "Creating\\.\\.\\.": "Criando...", - "Create": "Criar", - "Status": "Status", - "On": "Ligado", - "Off": "Desligado", - "Turning On\\.\\.\\.": "Ligando...", - "Turning Off\\.\\.\\.": "Desligando...", - "Address": "Endereço", - "Listen Port": "Porta", - "Table": "Tabela", - "Public Key": "Chave Pública", - "Connected Peers": "Peers Conectados", - "Total Usage": "Uso Total", - "Total Received": "Total Recebido", - "Total Sent": "Total Enviado", - "Peers Data Usage": "Uso de Dados dos Peers", - "Real Time Received Data Usage": "Uso de Dados Recebidos em Tempo Real", - "Real Time Sent Data Usage": "Uso de Dados Enviados em Tempo Real", - "Peer": "Peer", - "Peers": "Peers", - "Peer Settings": "Definições do Peer", - "Download All": "Baixar Todos", - "Search": "Buscar", - "Search Peers\\.\\.\\.": "Buscando em Peers...", - "Display": "Mostrar", - "Sort By": "Ordenar Por", - "Refresh Interval": "Intervalo de Atualização", - "Name": "Nome", - "Allowed IPs": "IPs Permitidos", - "Restricted": "Restrito", - "(.*) Seconds": "$1 Segundos", - "(.*) Minutes": "$1 Minutos", - "Configuration Settings": "Definição de Configuração", - "Peer Jobs": "Jobs do Peer", - "Active Jobs": "Jobs Ativos", - "All Active Jobs": "Todos os Jobs Ativos", - "Logs": "Logs", - "Private Key": "Chave Privada", - "\\(Required for QR Code and Download\\)": "(Obrigatório para QR Code e Download)", - "\\(Required\\)": "(Obrigatório)", - "Endpoint Allowed IPs": "Endeços IP Permitidos do Endpoint", - "DNS": "DNS", - "Optional Settings": "Definições Opcionais", - "Pre-Shared Key": "Chave Pré-Compartilhada", - "MTU": "MTU", - "Persistent Keepalive": "Keepalive Persistente", - "Reset Data Usage": "Redefinir Uso de Dados", - "Total": "Total", - "Sent": "Enviado", - "Received": "Recebido", - "Revert": "Reverter", - "Save Peer": "Salvar Peer", - "QR Code": "QR Code", - "Schedule Jobs": "Agendar Jobs", - "Job": "Job", - "Job ID": "ID do Job", - "Unsaved Job": "Job não salvo", - "This peer does not have any job yet\\.": "Este peer ainda não tem nenhum job.", - "if": "se", - "is": "é", - "then": "então", - "larger than": "maior que", - "Date": "Data", - "Restrict Peer": "Peer Restrito", - "Delete Peer": "Remover Peer", - "Edit": "Editar", - "Delete": "Remover", - "Deleting...": "Removendo...", - "Cancel": "Cancelar", - "Save": "Salvar", - "No active job at the moment\\.": "Nenhum job ativo no momento.", - "Jobs Logs": "Logs de Jobs", - "Updated at": "Atualizado em", - "Refresh": "Atualizar", - "Filter": "Filtrar", - "Success": "Sucesso", - "Failed": "Falhou", - "Log ID": "ID do Log", - "Message": "Mensagem", - "Share Peer": "Compartilhar Peer", - "Currently the peer is not sharing": "No momento o peer não está compartilhando", - "Sharing\\.\\.\\.": "Compartilhando...", - "Start Sharing": "Iniciar Compartilhamento", - "Stop Sharing\\.\\.\\.": "Parar Compartilhamento...", - "Stop Sharing": "Parar Compartilhamento", - "Access Restricted": "Acesso Restrito", - "Restrict Access": "Restringir Acesso", - "Restricting\\.\\.\\.": "Restringindo...", - "Allow Access": "Permitir Acesso", - "Allowing Access\\.\\.\\.": "Permitindo Acesso...", - "Download \\& QR Code is not available due to no private key set for this peer": "Download & QR Code não estão disponíveis devido à ausência de chave privada definida para este peer", - "Add Peers": "Adicionar Peers", - "Bulk Add": "Adicionar Vários", - "By adding peers by bulk, each peer's name will be auto generated, and Allowed IP will be assign to the next available IP\\.": "Ao gerar vários Peers, o nome de cada peer será gerado automaticamente, e o IP será atribuído ao próximo IP disponível.", - "How many peers you want to add\\?": "Quantos peers você quer adicionar?", - "You can add up to (.*) peers": "Você pode adicionar até $1 peers", - "Use your own Private and Public Key": "Use sua própria Chave Privada e Pública", - "Enter IP Address/CIDR": "Digite Endereço IP/CIDR", - "IP Address/CIDR": "Endereço IP/CIDR", - "or": "ou", - "Pick Available IP": "Selecione um IP Disponível", - "No available IP containing": "Nenhum IP disponível contendo", - "Add": "Adicionar", - "Adding\\.\\.\\.": "Adcionando...", - "Failed to check available update": "Erro ao verificar atualização disponível", - "Nice to meet you!": "Bom te conhecer!", - "Please fill in the following fields to finish setup": "Preencha os seguintes campos para finalizar a configuração", - "Create an account": "Crie uma conta", - "Enter an username you like": "Digite um nome de usuário", - "Enter a password": "Digite uma senha", - "\\(At least 8 characters and make sure is strong enough!\\)": "(Pelo menos 8 caracteres e certifique-se de que seja forte o suficiente!)", - "Confirm password": "Confirme a senha", - "Next": "Próximo", - "Saving\\.\\.\\.": "Salvando...", - "1\\. Please scan the following QR Code to generate TOTP with your choice of authenticator": "1. Escaneie o seguinte QR Code para gerar um código de uso único com um autenticador de sua escolha", - "Or you can click the link below:": "Ou clique no link abaixo:", - "2\\. Enter the TOTP generated by your authenticator to verify": "2. Digite o código de uso único gerado pelo seu autenticador para verificar", - "TOTP verified!": "Código de uso único verificado!", - "I don't need MFA": "Não preciso de autenticação em duas etapas (MFA)", - "Complete": "Completar", - "(v[0-9.]{1,}) is now available for update!": "$1 está disponível para atualização!", - "Current Version:": "Versão Atual:", - "Oh no\\.\\.\\. This link is either expired or invalid\\.": "Ops... Este link é inválido ou expirou.", - "Scan QR Code with the WireGuard App to add peer": "Escaneie o QR Code com o App WireGuard para adicionar o peer", - "or click the button below to download the ": "ou clique no botão abaixo para baixar o ", - " file": " arquivo", - "FROM ": "DE ", - "(.*) is on": "$1 está ligado", - "(.*) is off": "$1 está desligado", - "Allowed IPs is invalid": "IPs Permitidos inválido", - "Peer created successfully": "Peer criado com sucesso", - "Please fill in all required box": "Preencha todas as caixas obrigatórias", - "Please specify amount of peers you want to add": "Especifique a quantidade de peers que você deseja adicionar", - "No more available IP can assign": "Não há mais IPs disponíveis para atribuir", - "The maximum number of peers can add is (.*)": "O número máximo de peers que podem ser adicionados é $1", - "Generating key pairs by bulk failed": "Gerar vários pares de chaves falhou", - "Failed to add peers in bulk": "Erro ao adicionar múltiplos peers", - "This peer already exist": "Este peer já existe", - "This IP is not available: (.*)": "Este IP não está disponível: $1", - "Configuration does not exist": "Configuração não existe", - "Peer does not exist": "Peer não existe", - "Please provide a valid configuration name": "Informe um nome de configuração válido", - "Peer saved": "Peer salvo", - "Allowed IPs already taken by another peer": "IPs Permitidos já estão sendo usados por outro peer", - "Endpoint Allowed IPs format is incorrect": "Formato dos IPs Permitidos do Endpoint está incorreta", - "DNS format is incorrect": "Formato do DNS está incorreto", - "MTU format is not correct": "Formato do MTU está incorreto", - "Persistent Keepalive format is not correct": "Formato do Keepalive Persistente está incorreto", - "Private key does not match with the public key": "Chave privada não corresponde com a chave pública", - "Update peer failed when updating Pre-Shared Key": "Atualização do peer falhou ao atualizar a Chave Pré-Compartilhada", - "Update peer failed when updating Allowed IPs": "Atualização do peer falhou ao atualizar os IPs Permitidos", - "Update peer failed when saving the configuration": "Atualização do peer falhou ao salvar a configuração", - "Peer data usage reset successfully": "Uso de dados do peer redefinido com sucesso", - "Peer download started": "Download do peer iniciado", - "Please specify one or more peers": "Especifique um ou mais peers", - "Share link failed to create. Reason: (.*)": "Erro ao criar link de compartilhamento. Motivo: $1", - "Link expire date updated": "Data de expiração do link atualizada", - "Link expire date failed to update. Reason: (.*)": "Erro ao atualizar a data de expiração do link. Motivo: $1", - "Peer job saved": "Job do peer salvo", - "Please specify job": "Especifique o job", - "Please specify peer and configuration": "Especifique o peer e a configuração", - "Peer job deleted": "Job do peer removido", - "API Keys function is successfully enabled": "Recurso de Chaves API está habilitado", - "API Keys function is successfully disabled": "Recurso de Chaves API está desabilitado", - "API Keys function is failed to enable": "Falha ao habilitar recurso de Chaves API", - "API Keys function is failed to disable": "Falha ao desabilitar recurso de Chaves API", - "WGDashboard API Keys function is disabled": "Recurso de Chaves de API do WGDashboard está desabilitada", - "WireGuard configuration path saved": "Caminho do arquivo de configuração WireGuard salvo", - "API Key deleted": "Chave de API removida", - "API Key created": "Chave de API criada", - "Sign in session ended, please sign in again": "Sessão encerrada. Por favor, entre novamente", - "Please specify an IP Address (v4/v6)": "Especifique um endereço IP (v4/v6)", - "Please provide ipAddress and count": "Especifique endereço IP e quantidade", - "Please provide ipAddress": "Especifique endereço IP", - "Dashboard Language": "Idioma do Painel", - "Dashboard language update failed": "Atualização do idioma do painel falhou", - "Peer Remote Endpoint": "Endpoint Remoto do Peer", - "New Configuration": "Nova Configuração", - "Configuration Name": "Nome de Configuração", - "Configuration name is invalid. Possible reasons:": "Nome de configuração é inválido. Possíveis razões:", - "Configuration name already exist\\.": "Nome de configuração já existe\\.", - "Configuration name can only contain 15 lower/uppercase alphabet, numbers, underscore, equal sign, plus sign, period and hyphen\\.": "Nome de configuração pode conter apenas 15 caracteres alfanuméricos, sublinhado, igual, mais, ponto e hífen.", - "Invalid Port": "Porta Inválida", - "Save Configuration": "Salvar Configuração", - "IP Address/CIDR is invalid": "Endereço IP/CIDR inválido", - "IP Address": "Endereço IP", - "Enter IP Address / Hostname": "Digite Endereço IP / Nome do Host", - "IP Address / Hostname": "Endereço IP / Nome do Host", - "Dashboard IP Address \\& Listen Port": "Endereço IP do Painel e Porta", - "Count": "Quantidade", - "Hop": "Salto", - "Average RTT \\(ms\\)": "RTT médio (ms)", - "Min RTT \\(ms\\)": "RTT mínimo (ms)", - "Max RTT \\(ms\\)": "RTT máximo (ms)", - "Geolocation": "Geolocalização", - "Is Alive": "Está Ativo", - "Average / Min / Max Round Trip Time": "Média / Mínimo / Máximo do Tempo de Ida e Volta (Round Trip)", - "Sent / Received / Lost Package": "Enviado / Recebido / Pacotes Perdidos", - "Manual restart of WGDashboard is needed to apply changes on IP Address and Listen Port": "É necessário reiniciar o WGDashboard para aplicar as mudanças de Endereço IP e Porta", - "Restore Configuration": "Restaurar Configuração", - "Step (.*)": "Passo (.*)", - "Select a backup you want to restore": "Selecione o backup que deseja restaurar", - "Click to change a backup": "Clique para alterar um backup", - "Selected Backup": "Backup Selecionado", - "You don't have any configuration to restore": "Você não tem configurações para restaurar", - "Help": "Ajuda", - "You can visit our: ": "Você pode visitar nosso: ", - "Official Documentation": "Documentação Oficial", - "Discord Server": "Servidor do Discord", - "Backup": "Backup", - "([0-9].*) Backups?": "([0-9].*) Backups?", - "Yes": "Sim", - "No": "Não", - "Backup not selected": "Backup não selecionado", - "Confirm \\& edit restore information": "Confirmar \\& editar informações de restauração", - "(.*) Available IP Address": "$1 endereço IP disponível", - "Database File": "Arquivo de Banco de Dados", - "Contain": "Contém", - "Restricted Peers?": "Peers Restritos?", - "Restore": "Restaurar", - "Restoring": "Restaurando", - "WGDashboard Settings": "Configurações do WGDashboard", - "Peers Settings": "Configurações dos Peers", - "WireGuard Configuration Settings": "Definições de Configuração WireGuard", - "Appearance": "Aparência", - "Theme": "Tema", - "Language": "Idioma", - "Account Settings": "Definições de Conta", - "Peer Default Settings": "Definições Padrão do Peer", - "Toggle When Start Up": "Ativar Quanto Iniciar", - "Other Settings": "Outras Definições", - "Select Peers": "Selecione Peers", - "Backup & Restore": "Backup e Restauração", - "Delete Configuration": "Remover Configuração", - "Create Backup": "Criar Backup", - "No backup yet, click the button above to create backup\\.": "Nenhum backup, clique no botão acima para criar um backup.", - "Are you sure to delete this backup\\?": "Tem certeza de que deseja remover este backup?", - "Are you sure to restore this backup\\?": "Tem certeza de que deseja restaurar este backup?", - "Backup Date": "Data do Backup", - "File": "Arquivo", - "Are you sure to delete this configuration\\?": "Tem certeza de que deseja remover esta configuração?", - "Once you deleted this configuration\\:": "Uma vez que remover esta configuração:", - "All connected peers will get disconnected": "Todos peers conectados serão desconectados", - "Both configuration file \\(\\.conf\\) and database table related to this configuration will get deleted": "Ambos tabela do banco de dados e arquivo de configuração (.conf) desta configuração serão removidos", - "Checking backups...": "Verificando backups...", - "This configuration have ([0-9].*) backups": "Esta configuração tem $1 backups", - "This configuration have no backup": "Esta configuração não tem backups", - "If you're sure, please type in the configuration name below and click Delete": "Se você tem certeza, confirme o nome da configuração abaixo e clique em Remover", - "Select All": "Selecionar Todos", - "Clear Selection": "Limpar Seleção", - "([0-9].*) Peers?": "$1 Peers?", - "Download": "Baixar", - "Downloading": "Baixando", - "Download Finished": "Download Concluído", - "Done": "Pronto", - "Are you sure to delete": "Tem certeza de que deseja remover", - "Are you sure to delete this peer\\?": "Tem certeza de que deseja remover este peer?", - "Configuration deleted": "Configuração removida", - "Configuration saved": "Configuração salva", - "WGDashboard language update failed": "Falha ao atualizar idioma do WGDashboard", - "Configuration restored": "Configuração restaurada", - "Allowed IP already taken by another peer": "Endereço IP já está em uso por outro peer", - "Failed to allow access of peer (.*)": "Falha ao permitir acesso ao peer $1", - "Failed to save configuration through WireGuard": "Falha ao salvar configuração pelo WGDashboard", - "Allow access successfully": "Acesso permitido com sucesso", - "Deleted ([0-9]{1,}) peer\\(s\\)": "$1 peer(s) removido(s)", - "Deleted ([0-9]{1,}) peer\\(s\\) successfully. Failed to delete ([0-9]{1,}) peer\\(s\\)": "$1 peer(s) removido(s) com sucesso. Falha ao remover $2 peer(s)", - "Restricted ([0-9]{1,}) peer\\(s\\)": "$1 peer(s) restringido(s)", - "Restricted ([0-9]{1,}) peer\\(s\\) successfully. Failed to restrict ([0-9]{1,}) peer\\(s\\)": "$1 peer(s) restringido(s) com sucesso. Falha ao restringir $2 peer(s)", - "Display As": "Mostrar Como", - "List": "Lista", - "Grid": "Grid", - "Protocol": "Protocolo", - "Open File": "Abrir Arquivo", - "Advanced Options": "Opções Avançadas", - "Allowed IPs Validation": "Validação de IPs Permitidos", - "Update Name": "Atualizar Nome", - "To update this configuration's name, WGDashboard will execute the following operations:": "Para atualizar este nome de configuração, o WGDashboard vaoi executar as seguintes operações:", - "Duplicate current configuration's database table and \\.conf file with the new name": "Duplicar tabela do banco de dados e arquivo .conf da configuração atual com novo nome", - "Delete current configuration's database table and \\.conf file": "Remover tabela do banco de dados e arquivo .conf da configuração atual", - "Danger Zone": "Zona de Perigo", - "Configuration File": "Arquivo de Configuração", - "Edit Raw Configuration File": "Editar Conteúdo do Arquivo de Configuração", - "Peer Configuration File": "Arquivo de Configuração do Peer", - "Share with Email": "Compartilhar com Email", - "Email Account": "Conta de Email", - "Ready": "Pronto", - "Port": "Porta", - "Encryption": "Criptografia", - "No Encryption": "Sem Criptografia", - "Send From": "Enviar de", - "Send Test Email": "Enviar Email de Teste", - "Email Body Template": "Modelo de Corpo de Email", - "Live Preview": "Prévia ao vivo", - "Include configuration file as an attachment": "Incluir arquivo de configuração como anexo", - "Send": "Enviar", - "Sending\\.\\.\\.": "Enviando...", - "Email sent successfully!": "Email enviado com sucesso!", - "AmneziaWG Peer Setting": "Definições de Peer do AmneziaWG", - "System Status": "Status do Sistema", - "CPU": "CPU", - "Memory": "Memória", - "Swap Memory": "Memória Swap", - "Processes": "Processos", - "CPU Usage": "Uso de CPU", - "Memory Usage": "Uso de Memória", - "Swap Memory Usage": "Uso de Memória Swap", - "Network": "Rede", - "([0-9]{1,}) Interfaces": "$1 Interfaces", - "Storage": "Armazenamento", - "([0-9]{1,}) Partitions": "$1 Repartições", - "(.*) Used": "$1 Usado", - "Untitled Peer": "Peer Sem Nome", - "Who are you sending to\\?": "Para quem você está enviando?", - "What\\'s the subject\\?": "Qual o título?", - "What\\'s the body\\?": "Qual a mensagem?" -} \ No newline at end of file diff --git a/src/static/locale/verify_locale_files.py b/src/static/locale/verify_locale_files.py deleted file mode 100644 index c3279c92..00000000 --- a/src/static/locale/verify_locale_files.py +++ /dev/null @@ -1,62 +0,0 @@ -import json -active_languages = json.loads(open("active_languages.json", "r").read()) -language_template = json.loads(open("language_template.json", "r").read()) - -if __name__ == "__main__": - welcome = "WGDashboard Locale File Verification [by @donaldzou]" - print("="*(len(welcome) + 4)) - print(f"| {welcome} |") - print("="*(len(welcome) + 4)) - print() - print("Active Languages\n") - status = False - - for language in active_languages: - print(f"{language['lang_name']} | {language['lang_id']}") - - lang_ids = list(map(lambda x: x['lang_id'], active_languages)) - print() - - lang_id = "" - - while not status: - lang_id = input("Please enter the language ID to verify: ") - if lang_id not in lang_ids: - print(f'{lang_id} is not a valid language ID') - elif lang_id == 'en': - print(f'{lang_id} is not a editable language') - else: - status = True - - - with open(f"{lang_id}.json", "r") as f: - lang_file = json.load(f) - - # Identify missing and deprecated translations - missing_translation = [ - key for key in language_template - if key not in lang_file or not lang_file[key].strip() - ] - - deprecated_translation = [ - key for key in lang_file - if key not in language_template - ] - - with open(f"{lang_id}.json", "w") as f: - new_lang_file = dict(lang_file) - for key in missing_translation: - new_lang_file[key] = "" - - for key in deprecated_translation: - new_lang_file.pop(key) - - f.write(json.dumps(new_lang_file, ensure_ascii=False, indent='\t')) - - - print() - # Print missing translations - print(f"\t[Missing Translations] {len(missing_translation)} translation{'s' if len(missing_translation) > 1 else ''}") - # Print deprecated translations - print(f"\t[Deprecated Translations] {len(deprecated_translation)} translation{'s' if len(deprecated_translation) > 1 else ''}") - print(f"\t[Note] All missing translations are added into {lang_id}.json, all deprecated translations are removed from {lang_id}.json") \ No newline at end of file diff --git a/src/static/locale/ar-sa.json b/src/static/locales/ar-SA.json similarity index 100% rename from src/static/locale/ar-sa.json rename to src/static/locales/ar-SA.json diff --git a/src/static/locale/be.json b/src/static/locales/be-BY.json similarity index 100% rename from src/static/locale/be.json rename to src/static/locales/be-BY.json diff --git a/src/static/locale/ca.json b/src/static/locales/ca-ES.json similarity index 100% rename from src/static/locale/ca.json rename to src/static/locales/ca-ES.json diff --git a/src/static/locale/cs.json b/src/static/locales/cs-CZ.json similarity index 100% rename from src/static/locale/cs.json rename to src/static/locales/cs-CZ.json diff --git a/src/static/locale/de-de.json b/src/static/locales/de-DE.json similarity index 100% rename from src/static/locale/de-de.json rename to src/static/locales/de-DE.json diff --git a/src/static/locale/es-es.json b/src/static/locales/es-ES.json similarity index 90% rename from src/static/locale/es-es.json rename to src/static/locales/es-ES.json index 112bc606..0e28c607 100644 --- a/src/static/locale/es-es.json +++ b/src/static/locales/es-ES.json @@ -1,312 +1,369 @@ { - "Welcome to": "Bienvenido", - "Username": "Usuario", - "Password": "Contraseña", - "OTP from your authenticator": "OTP de tu autentificador", - "Sign In": "Iniciar sesión", - "Signing In\\.\\.\\.": "Iniciando sesión...", - "Access Remote Server": "Acceder a servidor remoto", - "Server": "Servidor", - "Click": "Click", - "Pinging...": "Ping...", - "to add your server": "para agregar tu servidor", - "Server List": "Lista de Servidores", - "Sorry, your username or password is incorrect.": "Lo siento, tu usuario o contraseña no son correctos.", - "Home": "Home", - "Settings": "Ajustes", - "Tools": "Herramientas", - "Sign Out": "Salir", - "Checking for update...": "Buscando actualizaciones...", - "You're on the latest version": "Estás utilizando la última versión", - "WireGuard Configurations": "Configuraciones de Wireguard", - "You don't have any WireGuard configurations yet. Please check the configuration folder or change it in Settings. By default the folder is /etc/wireguard.": "Todavía no tienes configuraciones de WireGuard. Por favor, comprueba la carpeta de configuraciones o cámbiala en Ajustes. Por defecto, la carpeta es /etc/wireguard.", - "Configuration": "Configuración", - "Configurations": "Configuraciones", - "Peers Default Settings": "Ajustes por defecto de Peers", - "Dashboard Theme": "Tema del dashboard", - "Light": "Claro", - "Dark": "Oscuro", - "This will be changed globally, and will be apply to all peer's QR code and configuration file.": "Esto se va a cambiar de forma global, y se aplicará a todos los QRs y archivos de configuración de todos los Peers.", - "WireGuard Configurations Settings": "Ajustes de Configuración de Wireguard", - "Configurations Directory": "Carpeta de configuraciones", - "Remember to remove / at the end of your path. e.g /etc/wireguard": "Recuerda eliminar '/' al final de tu directorio. Por ejemplo, '/etc/wireguard'", - "WGDashboard Account Settings": "Ajustes de la cuenta de WGDashboard", - "Current Password": "Contraseña actual", - "New Password": "Nueva contraseña", - "Repeat New Password": "Repite la nueva contraseña", - "Update Password": "Actualizar contraseña", - "Multi-Factor Authentication \\(MFA\\)": "Autentificación de doble factor (MFA)", - "Reset": "Reset", - "Setup": "Setup", - "API Keys": "Clave API", - "API Key": "Clave API", - "Key": "Clave", - "Enabled": "Habilitado", - "Disabled": "Deshabilitado", - "No WGDashboard API Key": "Ninguna clave API WGDashboard", - "Expire At": "Expira en", - "Are you sure to delete this API key\\?": "¿Estás seguro de eliminar esta clave API?", - "Create API Key": "Crear una nueva clave API", - "When should this API Key expire\\?": "¿Cuándo debería expirar esta clave API?", - "Never Expire": "Nunca expira", - "Don't think that's a good idea": "No creo que esta sea una buena idea", - "Creating\\.\\.\\.": "Creando...", - "Create": "Crear", - "Status": "Estado", - "On": "Activo", - "Off": "Inactivo", - "Turning On\\.\\.\\.": "Activando...", - "Turning Off\\.\\.\\.": "Desactivando...", - "Address": "Dirección", - "Listen Port": "Puerto de escucha", - "Public Key": "Clave pública", - "Connected Peers": "Peer conectado", - "Total Usage": "Uso Total", - "Total Received": "Total Recibido", - "Total Sent": "Total Enviado", - "Peers Data Usage": "Uso de datos de Peers", - "Real Time Received Data Usage": "Datos recibidos en tiempo real", - "Real Time Sent Data Usage": "Datos enviados en tiempo real", - "Peer": "Peer", - "Peers": "Peers", - "Peer Settings": "Ajustes de Peers", - "Download All": "Descargar todo", - "Search Peers\\.\\.\\.": "Buscar Peers...", - "Display": "Mostrar", - "Sort By": "Ordenar por", - "Refresh Interval": "Intervalo de refresco", - "Name": "Nombre", - "Allowed IPs": "IPs permitidas", - "Restricted": "Restringido", - "(.*) Seconds": "$1 Segundos/i", + " file": " archivo", + "(.*) Available IP Address": "$1 Dirección IP disponible", "(.*) Minutes": "$1 Minutos/i", - "Configuration Settings": "Configuración", - "Peer Jobs": "Jobs del Peer", - "Active Jobs": "Jobs Activos", - "All Active Jobs": "Todos los Jobs Activos", - "Logs": "Logs", - "Private Key": "Clave privada", - "\\(Required for QR Code and Download\\)": "(Requerido para el código QR y Descarga)", - "\\(Required\\)": "(Requerido)", - "Endpoint Allowed IPs": "Direcciones IP del endpoint permitidas", - "DNS": "DNS", - "Optional Settings": "Ajustes opcionales", - "Pre-Shared Key": "Clave pre-compartida", - "MTU": "MTU", - "Persistent Keepalive": "Keepalive persistente", - "Reset Data Usage": "Resetear los datos de uso", - "Total": "Total", - "Sent": "Enviado", - "Received": "Recibido", - "Revert": "Revertir", - "Save Peer": "Guardar el Peer", - "QR Code": "Código QR", - "Schedule Jobs": "Planificar Job", - "Job": "Job", - "Job ID": "ID del Job", - "Unsaved Job": "Job sin guardar", - "This peer does not have any job yet\\.": "Este Peer no tiene jobs todavía.", - "if": "si", - "is": "es", - "then": "entonces", - "larger than": "mayor que", - "Date": "Fecha", - "Restrict Peer": "Limitar el Peer", - "Delete Peer": "Eliminar el Peer", - "Edit": "Modificar", - "Delete": "Eliminar", - "Deleting...": "Eliminando...", - "Cancel": "Cancelar", - "Save": "Guardar", - "No active job at the moment\\.": "No hay jobs activos en este momento.", - "Jobs Logs": "Logs del Job", - "Updated at": "Actualizado el", - "Refresh": "Refrescar", - "Filter": "Filtrar", - "Success": "Éxito", - "Failed": "Fallido", - "Log ID": "ID del log", - "Message": "Mensaje", - "Share Peer": "Compartir Peer", - "Currently the peer is not sharing": "Actualmente el Peer no está compartiendo", - "Sharing\\.\\.\\.": "Compartiendo...", - "Start Sharing": "Empezar intercambio", - "Stop Sharing\\.\\.\\.": "Interrumpir intercambio...", - "Stop Sharing": "Interrumpir intercambio", + "(.*) Seconds": "$1 Segundos/i", + "(.*) Used": "", + "(.*) is off": "$1 está desactivado", + "(.*) is on": "$1 está activo", + "([0-9].*) Backups?": "$1 Backups?", + "([0-9].*) Peers?": "¿$1 Peers?", + "([0-9]{1,}) Interfaces": "", + "([0-9]{1,}) Partitions": "", + "(v[0-9.]{1,}) is now available for update!": "$1 está disponible para actualizar!", + "1\\. Please scan the following QR Code to generate TOTP with your choice of authenticator": "1. Por favor escanea el siguiente código QR para generar un código TOTP con el autentificador que prefieras", + "2\\. Enter the TOTP generated by your authenticator to verify": "2. Inserta el código TOTP generado por tu autentificador para verificar", + "API Key": "Clave API", + "API Key created": "Clave API creada", + "API Key deleted": "Clave API eliminada", + "API Keys": "Clave API", + "API Keys function is failed to disable": "La funcionalidad de clave API no se ha habilitado", + "API Keys function is failed to enable": "La funcionalidad de clave API no se ha habilitado", + "API Keys function is successfully disabled": "La funcionalidad de clave API se ha deshabilitado con éxito", + "API Keys function is successfully enabled": "La funcionalidad de clave API se ha habilitado con éxito", + "Access Remote Server": "Acceder a servidor remoto", "Access Restricted": "Accesso Restringido", - "Restrict Access": "Restringir Acceso", - "Restricting\\.\\.\\.": "Restringiendo...", - "Allow Access": "Habilitar Acceso", - "Allowing Access\\.\\.\\.": "Habilitando el acceso...", - "Download \\& QR Code is not available due to no private key set for this peer": "La descarga y el código QR no están disponibles porque no se ha configurado una clave privada para este peer", + "Account Settings": "Ajustes de la cuenta", + "Active Jobs": "Jobs Activos", + "Add": "añadir", "Add Peers": "Agregar un Peer", + "Adding\\.\\.\\.": "Añadiendo...", + "Address": "Dirección", + "Advanced Options": "", + "All Active Jobs": "Todos los Jobs Activos", + "All connected peers will get disconnected": "Todos los peers conectados se desconectarán", + "Allow Access": "Habilitar Acceso", + "Allow access successfully": "Acceso permitido con éxito", + "Allowed IP already taken by another peer": "IP Permitida ya ha sido seleccionada por otro peer", + "Allowed IPs": "IPs permitidas", + "Allowed IPs Validation": "", + "Allowed IPs already taken by another peer": "IPs disponibles ya han sido seleccionadas por otro peer", + "Allowed IPs is invalid": "Las IPs Permitidas son inválidas", + "Allowing Access\\.\\.\\.": "Habilitando el acceso...", + "AmneziaWG Peer Setting": "", + "Appearance": "apariencia", + "Are you sure to delete": "¿Estás seguro de eliminar?", + "Are you sure to delete this API key\\?": "¿Estás seguro de eliminar esta clave API?", + "Are you sure to delete this backup\\?": "¿Estás seguro de que quieres borrar este backup?", + "Are you sure to delete this configuration\\?": "¿Estás seguro de eliminar esta configuración?", + "Are you sure to delete this peer\\?": "¿Estás seguro de eliminar este peer?", + "Are you sure to restore this backup\\?": "", + "Average / Min / Max Round Trip Time": "Media / Min / Max Redondeo Viaje Tiempo", + "Average RTT \\(ms\\)": "", + "Backup": "Backup", + "Backup & Restore": "Backups y Restaurar", + "Backup Date": "Fecha del backup", + "Backup not selected": "Backup no seleccionado", + "Both configuration file \\(\\.conf\\) and database table related to this configuration will get deleted": "Ambos ficheros de configuración (.conf) y de la tabla de la base de datos relacionados con esta configuración serán eliminados", "Bulk Add": "Agregar múltiple", "By adding peers by bulk, each peer's name will be auto generated, and Allowed IP will be assign to the next available IP\\.": "Agregando Peers de forma múltiple, los nombres de los peers se generarán de forma automática, y la IP permitida se asignará en función de la siguiente IP disponible.", - "How many peers you want to add\\?": "¿Cuántos peers quieres añadir?", - "You can add up to (.*) peers": "Puedes añadir hasta $1 peers", - "Use your own Private and Public Key": "Usa tu propia clave pública y privada", - "Enter IP Address/CIDR": "ntroduce la dirección IP/CIDR", - "IP Address/CIDR": "Dirección IP/CIDR", - "or": "o", - "Pick Available IP": "Selecciona una IP disponible", - "No available IP containing": "Ninguna IP disponible que contenga", - "Add": "añadir", - "Adding\\.\\.\\.": "Añadiendo...", - "Failed to check available update": "Error al buscar actualizaciones disponibles", - "Nice to meet you!": "Encantado de conocerte", - "Please fill in the following fields to finish setup": "Por favor rellena los siguientes campos para finalizar el setup", - "Create an account": "Crea una cuenta", - "Enter an username you like": "Introduce un nombre de usuario", - "Enter a password": "Introduce una contraseña", - "\\(At least 8 characters and make sure is strong enough!\\)": "(Al menos 8 caracteres y asegúrate de que sea suficientemente fuerte)", - "Confirm password": "Confirma la contraseña", - "Next": "Siguiente", - "Saving\\.\\.\\.": "Guardando...", - "1\\. Please scan the following QR Code to generate TOTP with your choice of authenticator": "1. Por favor escanea el siguiente código QR para generar un código TOTP con el autentificador que prefieras", - "Or you can click the link below:": "O puedes hacer click en el siguiente enlace:", - "2\\. Enter the TOTP generated by your authenticator to verify": "2. Inserta el código TOTP generado por tu autentificador para verificar", - "TOTP verified!": "¡TOTP Verificado!", - "I don't need MFA": "No necesito MFA", + "CPU": "", + "CPU Usage": "", + "Cancel": "Cancelar", + "Checking backups...": "Comprobando backups...", + "Checking for update...": "Buscando actualizaciones...", + "Clear Selection": "Deseleccionar", + "Click": "Click", + "Click to change a backup": "click para cambiar el backup", "Complete": "Completado", - "(v[0-9.]{1,}) is now available for update!": "$1 está disponible para actualizar!", - "Current Version:": "Versión actual:", - "Oh no\\.\\.\\. This link is either expired or invalid\\.": "Oh no... Este link ha expirado o es inválido.", - "Scan QR Code with the WireGuard App to add peer": "Escanea el código QR con la App Wireguard para añadir el peer", - "or click the button below to download the ": "o haz click en el botón de abajo para descargar el ", - " file": " archivo", - "FROM ": "DE ", - "(.*) is on": "$1 está activo", - "(.*) is off": "$1 está desactivado", - "Allowed IPs is invalid": "Las IPs Permitidas son inválidas", - "Peer created successfully": "Peer creado con éxito", - "Please fill in all required box": "Por favor, rellena las casillas requeridas", - "Please specify amount of peers you want to add": "Por favor, especifica la cantidad de peers que quieres añadir", - "No more available IP can assign": "No hay más IPs disponibles que asignar", - "The maximum number of peers can add is (.*)": "El número máximo de peers que se pueden añadir es $1", - "Generating key pairs by bulk failed": "Generación de key pairs por Añadir Múltiples falló", - "Failed to add peers in bulk": "Error al añadir múltiples peers", - "This peer already exist": "Este peer ya existe", - "This IP is not available: (.*)": "Esta IP no está disponible: $1", - "Configuration does not exist": "La configuración no existe", - "Peer does not exist": "El peer no existe", - "Please provide a valid configuration name": "Por favor, introduce un nombre de configuración válido", - "Peer saved": "Peer guardado", - "Allowed IPs already taken by another peer": "IPs disponibles ya han sido seleccionadas por otro peer", - "Endpoint Allowed IPs format is incorrect": "El formato de las IPs disponibles no es correcto", - "DNS format is incorrect": "El formato del DNS no es correcto", - "MTU format is not correct": "El formato del MTU no es correcto", - "Persistent Keepalive format is not correct": "El formato de Keepalive persistente no es correcto", - "Private key does not match with the public key": "La clave privada no corresponde con la clave pública", - "Update peer failed when updating Pre-Shared Key": "Actualización del peer falló cuando se actualizó la clave pre-compartida", - "Update peer failed when updating Allowed IPs": "Actualización del peer falló cuando se actualizó las IPs Permitidas", - "Update peer failed when saving the configuration": "Actualización del peer falló cuando se guardaba la configuración", - "Peer data usage reset successfully": "Los datos del uso del peer se restablecieron con éxito", - "Peer download started": "Descarga del peer comenzada", - "Please specify one or more peers": "Por favor, especifica uno o más peers", - "Share link failed to create. Reason: (.*)": "Creación del link para compartir fallida. Motivo: $1", - "Link expire date updated": "Actualizada la fecha de expiración del link", - "Link expire date failed to update. Reason: (.*)": "Actualización de la fecha de expiración fallida. Motivo: $1", - "Peer job saved": "Job del Peer guardado", - "Please specify job": "Por favor, especifica un job", - "Please specify peer and configuration": "Por favor, especifica peer y configuración", - "Peer job deleted": "Job del Peer eliminado", - "API Keys function is successfully enabled": "La funcionalidad de clave API se ha habilitado con éxito", - "API Keys function is successfully disabled": "La funcionalidad de clave API se ha deshabilitado con éxito", - "API Keys function is failed to enable": "La funcionalidad de clave API no se ha habilitado", - "API Keys function is failed to disable": "La funcionalidad de clave API no se ha habilitado", - "WGDashboard API Keys function is disabled": "La funcionalidad de clave API de WGDashboard está deshabilitada", - "WireGuard configuration path saved": "Guardado el destino de la configuración de Wireguard", - "API Key deleted": "Clave API eliminada", - "API Key created": "Clave API creada", - "Sign in session ended, please sign in again": "La sesión actual ha caducado, por favor, accede de nuevo", - "Please specify an IP Address (v4/v6)": "Por favor, especificado dirección IP (v4/v6)", - "Please provide ipAddress and count": "Por favor, especifica dirección IP y cuenta", - "Please provide ipAddress": "Por favor, especifica dirección IP", - "Dashboard Language": "Idioma del Dashboard", - "Dashboard language update failed": "Imposible actualizar el idioma del Dashboard", - "Peer Remote Endpoint": "Endpoint remoto del Peer", - "New Configuration": "Nueva configuración", + "Configuration": "Configuración", + "Configuration File": "", "Configuration Name": "Nombre de la configuración", - "Configuration name is invalid. Possible reasons:": "El nombre de la configuración es inválido. Motivo:", + "Configuration Settings": "Configuración", + "Configuration deleted": "Configuración eliminada", + "Configuration does not exist": "La configuración no existe", "Configuration name already exist\\.": "El nombre de la configuración ya existe.", "Configuration name can only contain 15 lower/uppercase alphabet, numbers, underscore, equal sign, plus sign, period and hyphen\\.": "El nombre de la configuración solo puede contener 15 letras mayúsculas o minúsculas, números, barrabaja, símbolos de igual, suma, puntos y guiones.", - "Invalid Port": "Puerto inválido", - "Save Configuration": "Guardar la configuración", - "IP Address/CIDR is invalid": "La IP/CIDR no es válida", - "IP Address": "Dirección IP", - "Enter IP Address / Hostname": "Introduce una dirección IP / Hostname", - "IP Address / Hostname": "Dirección IP / Hostname", - "Dashboard IP Address \\& Listen Port": "Dirección IP del dashboard y puerto", - "Count": "Cuenta", - "Geolocation": "Geolocalización", - "Is Alive": "Está Activo", - "Average / Min / Max Round Trip Time": "Media / Min / Max Redondeo Viaje Tiempo", - "Sent / Received / Lost Package": "Enviado / Recibido / Paquetes perdidos", - "Manual restart of WGDashboard is needed to apply changes on IP Address and Listen Port": "Un reset manual de WGDashboard es necesario para aplicar los cambios en la dirección IP y el puerto", - "Restore Configuration": "Restablecer configuración", - "Step (.*)": "Paso $1", - "Select a backup you want to restore": "Selecciona el backup que quieres restaurar", - "Click to change a backup": "click para cambiar el backup", - "Selected Backup": "Backup seleccionado", - "You don't have any configuration to restore": "No tienes ninguna configuración que restaurar", - "Help": "Ayuda", - "Backup": "Backup", - "([0-9].*) Backups?": "$1 Backups?", - "Yes": "Sí", - "No": "No", - "Backup not selected": "Backup no seleccionado", + "Configuration name is invalid. Possible reasons:": "El nombre de la configuración es inválido. Motivo:", + "Configuration restored": "Configuración restaurada", + "Configuration saved": "Configuración guardada", + "Configurations": "Configuraciones", + "Configurations Directory": "Carpeta de configuraciones", "Confirm \\& edit restore information": "Confirmar y editar la información de restauración", - "(.*) Available IP Address": "$1 Dirección IP disponible", - "Database File": "Fichero de base de datos", + "Confirm password": "Confirma la contraseña", + "Connected Peers": "Peer conectado", "Contain": "Contiene", - "Restricted Peers?": "¿Peers restringidos?", - "Restore": "Restaurar", - "Restoring": "Restaurando", - "WGDashboard Settings": "Ajustes de WGDashboard", - "Peers Settings": "Ajustes de Peers", - "WireGuard Configuration Settings": "Ajustes de Configuraciones de Wireguard", - "Appearance": "apariencia", - "Theme": "Tema", - "Language": "Idioma", - "Account Settings": "Ajustes de la cuenta", - "Peer Default Settings": "Ajustes por defecto del peer", - "Toggle When Start Up": "Activar en Start Up", - "Other Settings": "Otros ajustes", - "Select Peers": "Seleccionar peers", - "Backup & Restore": "Backups y Restaurar", - "Delete Configuration": "Eliminar Configuración", + "Count": "Cuenta", + "Create": "Crear", + "Create API Key": "Crear una nueva clave API", "Create Backup": "Crear Backup", - "No backup yet, click the button above to create backup\\.": "No hay backups todavía, presiona el botón de arriba para crear un backup.", - "Are you sure to delete this backup\\?": "¿Estás seguro de que quieres borrar este backup?", - "Are you sure to restore this backup?\\": "¿Estás seguro de que quieres restaurar este backup?", - "Backup Date": "Fecha del backup", + "Create an account": "Crea una cuenta", + "Creating\\.\\.\\.": "Creando...", + "Current Password": "Contraseña actual", + "Current Version:": "Versión actual:", + "Currently the peer is not sharing": "Actualmente el Peer no está compartiendo", + "DNS": "DNS", + "DNS format is incorrect": "El formato del DNS no es correcto", + "Danger Zone": "", + "Dark": "Oscuro", + "Dashboard IP Address \\& Listen Port": "Dirección IP del dashboard y puerto", + "Dashboard Language": "Idioma del Dashboard", + "Dashboard Theme": "Tema del dashboard", + "Dashboard language update failed": "Imposible actualizar el idioma del Dashboard", + "Database File": "Fichero de base de datos", + "Date": "Fecha", + "Delete": "Eliminar", + "Delete Configuration": "Eliminar Configuración", + "Delete Peer": "Eliminar el Peer", + "Delete current configuration's database table and \\.conf file": "", + "Deleted ([0-9]{1,}) peer\\(s\\)": "Eliminados $1 peer(s)", + "Deleted ([0-9]{1,}) peer\\(s\\) successfully. Failed to delete ([0-9]{1,}) peer\\(s\\)": "Eliminados $1 peer(s) con éxito. Fallo al eliminar $2 peer(s)", + "Deleting...": "Eliminando...", + "Disabled": "Deshabilitado", + "Discord Server": "", + "Display": "Mostrar", + "Display As": "", + "Don't think that's a good idea": "No creo que esta sea una buena idea", + "Done": "Hecho", + "Download": "", + "Download All": "Descargar todo", + "Download Finished": "Descarga finalizada", + "Download \\& QR Code is not available due to no private key set for this peer": "La descarga y el código QR no están disponibles porque no se ha configurado una clave privada para este peer", + "Downloading": "Descargando", + "Duplicate current configuration's database table and \\.conf file with the new name": "", + "Edit": "Modificar", + "Edit Raw Configuration File": "", + "Email Account": "", + "Email Body Template": "", + "Email sent successfully!": "", + "Enabled": "Habilitado", + "Encryption": "", + "Endpoint Allowed IPs": "Direcciones IP del endpoint permitidas", + "Endpoint Allowed IPs format is incorrect": "El formato de las IPs disponibles no es correcto", + "Enter IP Address / Hostname": "Introduce una dirección IP / Hostname", + "Enter IP Address/CIDR": "ntroduce la dirección IP/CIDR", + "Enter a password": "Introduce una contraseña", + "Enter an username you like": "Introduce un nombre de usuario", + "Expire At": "Expira en", + "FROM ": "DE ", + "Failed": "Fallido", + "Failed to add peers in bulk": "Error al añadir múltiples peers", + "Failed to allow access of peer (.*)": "Fallo de habilitar acceso del peer $1", + "Failed to check available update": "Error al buscar actualizaciones disponibles", + "Failed to save configuration through WireGuard": "Fallo de salvar configuración a través de WireGuard", "File": "Archivo", - "Are you sure to delete this configuration\\?": "¿Estás seguro de eliminar esta configuración?", + "Filter": "Filtrar", + "Generating key pairs by bulk failed": "Generación de key pairs por Añadir Múltiples falló", + "Geolocation": "Geolocalización", + "Grid": "", + "Help": "Ayuda", + "Home": "Home", + "Hop": "", + "How many peers you want to add\\?": "¿Cuántos peers quieres añadir?", + "I don't need MFA": "No necesito MFA", + "IP Address": "Dirección IP", + "IP Address / Hostname": "Dirección IP / Hostname", + "IP Address/CIDR": "Dirección IP/CIDR", + "IP Address/CIDR is invalid": "La IP/CIDR no es válida", + "If you're sure, please type in the configuration name below and click Delete": "Si estás seguro, introduce el nombre de la configuración y presiona eliminar", + "Include configuration file as an attachment": "", + "Invalid Port": "Puerto inválido", + "Is Alive": "Está Activo", + "Job": "Job", + "Job ID": "ID del Job", + "Jobs Logs": "Logs del Job", + "Key": "Clave", + "Language": "Idioma", + "Light": "Claro", + "Link expire date failed to update. Reason: (.*)": "Actualización de la fecha de expiración fallida. Motivo: $1", + "Link expire date updated": "Actualizada la fecha de expiración del link", + "List": "", + "Listen Port": "Puerto de escucha", + "Live Preview": "", + "Log ID": "ID del log", + "Logs": "Logs", + "MTU": "MTU", + "MTU format is not correct": "El formato del MTU no es correcto", + "Manual restart of WGDashboard is needed to apply changes on IP Address and Listen Port": "Un reset manual de WGDashboard es necesario para aplicar los cambios en la dirección IP y el puerto", + "Max RTT \\(ms\\)": "", + "Memory": "", + "Memory Usage": "", + "Message": "Mensaje", + "Min RTT \\(ms\\)": "", + "Multi-Factor Authentication \\(MFA\\)": "Autentificación de doble factor (MFA)", + "Name": "Nombre", + "Network": "", + "Never Expire": "Nunca expira", + "New Configuration": "Nueva configuración", + "New Password": "Nueva contraseña", + "Next": "Siguiente", + "Nice to meet you!": "Encantado de conocerte", + "No": "No", + "No Encryption": "", + "No WGDashboard API Key": "Ninguna clave API WGDashboard", + "No active job at the moment\\.": "No hay jobs activos en este momento.", + "No available IP containing": "Ninguna IP disponible que contenga", + "No backup yet, click the button above to create backup\\.": "No hay backups todavía, presiona el botón de arriba para crear un backup.", + "No more available IP can assign": "No hay más IPs disponibles que asignar", + "OTP from your authenticator": "OTP de tu autentificador", + "Off": "Inactivo", + "Official Documentation": "", + "Oh no\\.\\.\\. This link is either expired or invalid\\.": "Oh no... Este link ha expirado o es inválido.", + "On": "Activo", "Once you deleted this configuration\\:": "Una vez eliminada esta configuración:", - "All connected peers will get disconnected": "Todos los peers conectados se desconectarán", - "Both configuration file \\(\\.conf\\) and database table related to this configuration will get deleted": "Ambos ficheros de configuración (.conf) y de la tabla de la base de datos relacionados con esta configuración serán eliminados", - "Checking backups...": "Comprobando backups...", + "Open File": "", + "Optional Settings": "Ajustes opcionales", + "Or you can click the link below:": "O puedes hacer click en el siguiente enlace:", + "Other Settings": "Otros ajustes", + "Password": "Contraseña", + "Peer": "Peer", + "Peer Configuration File": "", + "Peer Default Settings": "Ajustes por defecto del peer", + "Peer Jobs": "Jobs del Peer", + "Peer Remote Endpoint": "Endpoint remoto del Peer", + "Peer Settings": "Ajustes de Peers", + "Peer created successfully": "Peer creado con éxito", + "Peer data usage reset successfully": "Los datos del uso del peer se restablecieron con éxito", + "Peer does not exist": "El peer no existe", + "Peer download started": "Descarga del peer comenzada", + "Peer job deleted": "Job del Peer eliminado", + "Peer job saved": "Job del Peer guardado", + "Peer saved": "Peer guardado", + "Peers": "Peers", + "Peers Data Usage": "Uso de datos de Peers", + "Peers Default Settings": "Ajustes por defecto de Peers", + "Peers Settings": "Ajustes de Peers", + "Persistent Keepalive": "Keepalive persistente", + "Persistent Keepalive format is not correct": "El formato de Keepalive persistente no es correcto", + "Pick Available IP": "Selecciona una IP disponible", + "Pinging...": "Ping...", + "Please fill in all required box": "Por favor, rellena las casillas requeridas", + "Please fill in the following fields to finish setup": "Por favor rellena los siguientes campos para finalizar el setup", + "Please provide a valid configuration name": "Por favor, introduce un nombre de configuración válido", + "Please provide ipAddress": "Por favor, especifica dirección IP", + "Please provide ipAddress and count": "Por favor, especifica dirección IP y cuenta", + "Please specify amount of peers you want to add": "Por favor, especifica la cantidad de peers que quieres añadir", + "Please specify an IP Address (v4/v6)": "Por favor, especificado dirección IP (v4/v6)", + "Please specify job": "Por favor, especifica un job", + "Please specify one or more peers": "Por favor, especifica uno o más peers", + "Please specify peer and configuration": "Por favor, especifica peer y configuración", + "Port": "", + "Pre-Shared Key": "Clave pre-compartida", + "Private Key": "Clave privada", + "Private key does not match with the public key": "La clave privada no corresponde con la clave pública", + "Processes": "", + "Protocol": "", + "Public Key": "Clave pública", + "QR Code": "Código QR", + "Ready": "", + "Real Time Received Data Usage": "Datos recibidos en tiempo real", + "Real Time Sent Data Usage": "Datos enviados en tiempo real", + "Received": "Recibido", + "Refresh": "Refrescar", + "Refresh Interval": "Intervalo de refresco", + "Remember to remove / at the end of your path. e.g /etc/wireguard": "Recuerda eliminar '/' al final de tu directorio. Por ejemplo, '/etc/wireguard'", + "Repeat New Password": "Repite la nueva contraseña", + "Reset": "Reset", + "Reset Data Usage": "Resetear los datos de uso", + "Restore": "Restaurar", + "Restore Configuration": "Restablecer configuración", + "Restoring": "Restaurando", + "Restrict Access": "Restringir Acceso", + "Restrict Peer": "Limitar el Peer", + "Restricted": "Restringido", + "Restricted ([0-9]{1,}) peer\\(s\\)": "Restringidos $1 peer(s)", + "Restricted ([0-9]{1,}) peer\\(s\\) successfully. Failed to restrict ([0-9]{1,}) peer\\(s\\)": "Restringidos $1 peer(s) con éxito. Fallo al restringir $2 peer(s)", + "Restricted Peers?": "¿Peers restringidos?", + "Restricting\\.\\.\\.": "Restringiendo...", + "Revert": "Revertir", + "Save": "Guardar", + "Save Configuration": "Guardar la configuración", + "Save Peer": "Guardar el Peer", + "Saving\\.\\.\\.": "Guardando...", + "Scan QR Code with the WireGuard App to add peer": "Escanea el código QR con la App Wireguard para añadir el peer", + "Schedule Jobs": "Planificar Job", + "Search": "", + "Search Peers\\.\\.\\.": "Buscar Peers...", + "Select All": "Seleccionar todo", + "Select Peers": "Seleccionar peers", + "Select a backup you want to restore": "Selecciona el backup que quieres restaurar", + "Selected Backup": "Backup seleccionado", + "Send": "", + "Send From": "", + "Send Test Email": "", + "Sending\\.\\.\\.": "", + "Sent": "Enviado", + "Sent / Received / Lost Package": "Enviado / Recibido / Paquetes perdidos", + "Server": "Servidor", + "Server List": "Lista de Servidores", + "Settings": "Ajustes", + "Setup": "Setup", + "Share Peer": "Compartir Peer", + "Share link failed to create. Reason: (.*)": "Creación del link para compartir fallida. Motivo: $1", + "Share with Email": "", + "Sharing\\.\\.\\.": "Compartiendo...", + "Sign In": "Iniciar sesión", + "Sign Out": "Salir", + "Sign in session ended, please sign in again": "La sesión actual ha caducado, por favor, accede de nuevo", + "Signing In\\.\\.\\.": "Iniciando sesión...", + "Sorry, your username or password is incorrect.": "Lo siento, tu usuario o contraseña no son correctos.", + "Sort By": "Ordenar por", + "Start Sharing": "Empezar intercambio", + "Status": "Estado", + "Step (.*)": "Paso $1", + "Stop Sharing": "Interrumpir intercambio", + "Stop Sharing\\.\\.\\.": "Interrumpir intercambio...", + "Storage": "", + "Success": "Éxito", + "Swap Memory": "", + "Swap Memory Usage": "", + "System Status": "", + "TOTP verified!": "¡TOTP Verificado!", + "Table": "", + "The maximum number of peers can add is (.*)": "El número máximo de peers que se pueden añadir es $1", + "Theme": "Tema", + "This IP is not available: (.*)": "Esta IP no está disponible: $1", "This configuration have ([0-9].*) backups": "Esta configuración tiene $1 backups", "This configuration have no backup": "Esta configuración no tiene backups", - "If you're sure, please type in the configuration name below and click Delete": "Si estás seguro, introduce el nombre de la configuración y presiona eliminar", - "Select All": "Seleccionar todo", - "Clear Selection": "Deseleccionar", - "([0-9].*) Peers?": "¿$1 Peers?", - "Downloading": "Descargando", - "Download Finished": "Descarga finalizada", - "Done": "Hecho", - "Are you sure to delete": "¿Estás seguro de eliminar?", - "Are you sure to delete this peer\\?": "¿Estás seguro de eliminar este peer?", - "Configuration deleted": "Configuración eliminada", - "Configuration saved": "Configuración guardada", + "This peer already exist": "Este peer ya existe", + "This peer does not have any job yet\\.": "Este Peer no tiene jobs todavía.", + "This will be changed globally, and will be apply to all peer's QR code and configuration file.": "Esto se va a cambiar de forma global, y se aplicará a todos los QRs y archivos de configuración de todos los Peers.", + "To update this configuration's name, WGDashboard will execute the following operations:": "", + "Toggle When Start Up": "Activar en Start Up", + "Tools": "Herramientas", + "Total": "Total", + "Total Received": "Total Recibido", + "Total Sent": "Total Enviado", + "Total Usage": "Uso Total", + "Turning Off\\.\\.\\.": "Desactivando...", + "Turning On\\.\\.\\.": "Activando...", + "Unsaved Job": "Job sin guardar", + "Untitled Peer": "", + "Update Name": "", + "Update Password": "Actualizar contraseña", + "Update peer failed when saving the configuration": "Actualización del peer falló cuando se guardaba la configuración", + "Update peer failed when updating Allowed IPs": "Actualización del peer falló cuando se actualizó las IPs Permitidas", + "Update peer failed when updating Pre-Shared Key": "Actualización del peer falló cuando se actualizó la clave pre-compartida", + "Updated at": "Actualizado el", + "Use your own Private and Public Key": "Usa tu propia clave pública y privada", + "Username": "Usuario", + "WGDashboard API Keys function is disabled": "La funcionalidad de clave API de WGDashboard está deshabilitada", + "WGDashboard Account Settings": "Ajustes de la cuenta de WGDashboard", + "WGDashboard Settings": "Ajustes de WGDashboard", "WGDashboard language update failed": "La actualización de idioma de WGDashboard falló", - "Configuration restored": "Configuración restaurada", - "Allowed IP already taken by another peer": "IP Permitida ya ha sido seleccionada por otro peer", - "Failed to allow access of peer (.*)": "Fallo de habilitar acceso del peer $1", - "Failed to save configuration through WireGuard": "Fallo de salvar configuración a través de WireGuard", - "Allow access successfully": "Acceso permitido con éxito", - "Deleted ([0-9]{1,}) peer\\(s\\)": "$1 peer(s) eliminado(s)", - "Deleted ([0-9]{1,}) peer\\(s\\) successfully. Failed to delete ([0-9]{1,}) peer\\(s\\)": "$1 peer(s) eliminado(s) con éxito. Fallo al eliminar $2 peer(s)", - "Restricted ([0-9]{1,}) peer\\(s\\)": "$1 peer(s) restringido(s)", - "Restricted ([0-9]{1,}) peer\\(s\\) successfully. Failed to restrict ([0-9]{1,}) peer\\(s\\)": "$1 peer(s) restringido(s) con éxito. Fallo al restringir $2 peer(s)" + "Welcome to": "Bienvenido", + "What\\'s the body\\?": "", + "What\\'s the subject\\?": "", + "When should this API Key expire\\?": "¿Cuándo debería expirar esta clave API?", + "Who are you sending to\\?": "", + "WireGuard Configuration Settings": "Ajustes de Configuraciones de Wireguard", + "WireGuard Configurations": "Configuraciones de Wireguard", + "WireGuard Configurations Settings": "Ajustes de Configuración de Wireguard", + "WireGuard configuration path saved": "Guardado el destino de la configuración de Wireguard", + "Yes": "Sí", + "You can add up to (.*) peers": "Puedes añadir hasta $1 peers", + "You can visit our: ": "", + "You don't have any WireGuard configurations yet. Please check the configuration folder or change it in Settings. By default the folder is /etc/wireguard.": "Todavía no tienes configuraciones de WireGuard. Por favor, comprueba la carpeta de configuraciones o cámbiala en Ajustes. Por defecto, la carpeta es /etc/wireguard.", + "You don't have any configuration to restore": "No tienes ninguna configuración que restaurar", + "You're on the latest version": "Estás utilizando la última versión", + "\\(At least 8 characters and make sure is strong enough!\\)": "(Al menos 8 caracteres y asegúrate de que sea suficientemente fuerte)", + "\\(Required for QR Code and Download\\)": "(Requerido para el código QR y Descarga)", + "\\(Required\\)": "(Requerido)", + "if": "si", + "is": "es", + "larger than": "mayor que", + "or": "o", + "or click the button below to download the ": "o haz click en el botón de abajo para descargar el ", + "then": "entonces", + "to add your server": "para agregar tu servidor" } \ No newline at end of file diff --git a/src/static/locale/fa.json b/src/static/locales/fa-IR.json similarity index 100% rename from src/static/locale/fa.json rename to src/static/locales/fa-IR.json diff --git a/src/static/locale/fr-ca.json b/src/static/locales/fr-CA.json similarity index 100% rename from src/static/locale/fr-ca.json rename to src/static/locales/fr-CA.json diff --git a/src/static/locale/fr-fr.json b/src/static/locales/fr-FR.json similarity index 100% rename from src/static/locale/fr-fr.json rename to src/static/locales/fr-FR.json diff --git a/src/static/locale/it-it.json b/src/static/locales/it-IT.json similarity index 100% rename from src/static/locale/it-it.json rename to src/static/locales/it-IT.json diff --git a/src/static/locale/ja-jp.json b/src/static/locales/ja-JP.json similarity index 100% rename from src/static/locale/ja-jp.json rename to src/static/locales/ja-JP.json diff --git a/src/static/locale/ko.json b/src/static/locales/ko-KR.json similarity index 100% rename from src/static/locale/ko.json rename to src/static/locales/ko-KR.json diff --git a/src/static/locales/locale_manager.py b/src/static/locales/locale_manager.py new file mode 100644 index 00000000..b1db9899 --- /dev/null +++ b/src/static/locales/locale_manager.py @@ -0,0 +1,301 @@ +#!/usr/bin/env python3 +import json +import sys +from pathlib import Path +from typing import Dict, List, Tuple +from dataclasses import dataclass + + +@dataclass +class Language: + """Represents a language configuration.""" + lang_id: str + lang_name: str + + @classmethod + def from_dict(cls, data: Dict) -> 'Language': + """Create Language instance from dictionary.""" + return cls( + lang_id=data.get('lang_id', ''), + lang_name=data.get('lang_name', '') + ) + + +@dataclass +class TranslationStats: + """Statistics about translation verification.""" + missing_count: int + deprecated_count: int + total_keys: int + + @property + def completion_percentage(self) -> float: + """Calculate completion percentage.""" + if self.total_keys == 0: + return 0.0 + + completed = self.total_keys - self.missing_count + + return (completed / self.total_keys) * 100 + + +class LocaleManager: + """Manages locale files and translation verification.""" + + SUPPORTED_LOCALES_FILE = "supported_locales.json" + LOCALE_TEMPLATE_FILE = "locale_template.json" + + def __init__(self): + self.supported_locales: List[Language] = [] + self.locale_template: Dict[str, str] = {} + self._load_configuration() + + def _load_configuration(self) -> None: + """Load active languages and template configuration.""" + try: + + self.supported_locales = self._load_supported_locales() + self.locale_template = self._load_locale_template() + + except FileNotFoundError as e: + print(f"[✗] Configuration file not found: {e}") + sys.exit(1) + + except json.JSONDecodeError as e: + print(f"[✗] Invalid JSON in configuration file: {e}") + sys.exit(1) + + def _load_supported_locales(self) -> List[Language]: + """Load active languages from JSON file.""" + config_path = Path(self.SUPPORTED_LOCALES_FILE) + + if not config_path.exists(): + raise FileNotFoundError( + f"Active languages file not found: {config_path}" + ) + + with open(config_path, 'r', encoding='utf-8') as file: + data = json.load(file) + + return [Language.from_dict(lang_data) for lang_data in data] + + def _load_locale_template(self) -> Dict[str, str]: + """Load language template from JSON file.""" + template_path = Path(self.LOCALE_TEMPLATE_FILE) + + if not template_path.exists(): + raise FileNotFoundError( + f"Language template file not found: {template_path}" + ) + + with open(template_path, 'r', encoding='utf-8') as file: + return json.load(file) + + def _load_language_file(self, lang_id: str) -> Dict[str, str]: + """Load specific language file.""" + lang_path = Path(f"{lang_id}.json") + + if not lang_path.exists(): + raise FileNotFoundError(f"Language file not found: {lang_path}") + + with open(lang_path, 'r', encoding='utf-8') as file: + return json.load(file) + + def _save_language_file(self, lang_id: str, lang_data: Dict[str, str]) -> None: + """Save language file with proper formatting.""" + lang_path = Path(f"{lang_id}.json") + + with open(lang_path, 'w', encoding='utf-8') as file: + json.dump( + lang_data, + file, + ensure_ascii=False, + indent='\t', + sort_keys=True + ) + + def get_language_ids(self) -> List[str]: + """Get list of all available language IDs.""" + return [lang.lang_id for lang in self.supported_locales] + + def validate_language_id(self, lang_id: str) -> Tuple[bool, str]: + """ + Validate language ID. + + Returns: + Tuple of (is_valid, error_message) + """ + available_ids = self.get_language_ids() + + if lang_id not in available_ids: + return False, f"'{lang_id}' is not a valid language ID" + + return True, "" + + def analyze_translations(self, lang_id: str) -> Tuple[List[str], List[str], TranslationStats]: + """ + Analyze translation file for missing and deprecated keys. + + Returns: + Tuple of (missing_keys, deprecated_keys, stats) + """ + try: + lang_file = self._load_language_file(lang_id) + + except FileNotFoundError: + print( + f"[!] Language file {lang_id}.json not found. Creating new file..." + ) + lang_file = {} + + # Find missing translations + missing_translations = [ + key for key in self.locale_template + if key not in lang_file or not lang_file[key].strip() + ] + + # Find deprecated translations + deprecated_translations = [ + key for key in lang_file + if key not in self.locale_template + ] + + # Calculate statistics + stats = TranslationStats( + missing_count=len(missing_translations), + deprecated_count=len(deprecated_translations), + total_keys=len(self.locale_template) + ) + + return missing_translations, deprecated_translations, stats + + def fix_translation_file(self, lang_id: str) -> TranslationStats: + """ + Fix translation file by adding missing keys and removing deprecated ones. + + Returns: + TranslationStats with the changes made + """ + try: + lang_file = self._load_language_file(lang_id) + + except FileNotFoundError: + lang_file = {} + + missing_translations, deprecated_translations, stats = self.analyze_translations( + lang_id + ) + + # Create new language file + new_lang_file = dict(lang_file) + + # Add missing translations with empty values + for key in missing_translations: + new_lang_file[key] = "" + + # Remove deprecated translations + for key in deprecated_translations: + new_lang_file.pop(key, None) + + # Save updated file + self._save_language_file(lang_id, new_lang_file) + + return stats + + def display_header(self) -> None: + """Display application header.""" + title = "WGDashboard Locale File Manager [by @donaldzou]" + border = "=" * (len(title) + 4) + + print(border) + print(f"| {title} |") + print(border) + print() + + def display_available_languages(self) -> None: + """Display available languages in a formatted table.""" + print("[i] Available languages") + print("-" * 50) + + for lang in self.supported_locales: + print(f"{lang.lang_name:<25} | {lang.lang_id}") + + print() + + def display_translation_results(self, lang_id: str, stats: TranslationStats) -> None: + """Display translation verification results.""" + print(f"[#] Translation analysis for '{lang_id}'") + print("-" * 50) + + print(f" [-] Total keys: {stats.total_keys}") + print(f" [✗] Missing translations: {stats.missing_count}") + print(f" [*] Deprecated translations: {stats.deprecated_count}") + print(f" [✓] Completion: {stats.completion_percentage:.1f}%") + + if stats.missing_count > 0 or stats.deprecated_count > 0: + print(f"\n [i] File {lang_id}.json has been updated:") + print(f" • Missing translations added (empty values)") + print(f" • Deprecated translations removed") + else: + print(f"\n Perfect! No issues found in {lang_id}.json") + + print() + + def get_user_language_choice(self) -> str: + """Get language choice from user with validation.""" + while True: + try: + lang_id = input("[ENTER] Language ID to verify: ").strip() + + if not lang_id: + print(" [!] Please enter a valid language ID") + continue + + is_valid, error_msg = self.validate_language_id(lang_id) + + if not is_valid: + print(f" [✗] {error_msg}") + continue + + return lang_id + + except KeyboardInterrupt: + print("\n\n[EXIT] Operation cancelled by user") + sys.exit(0) + + except EOFError: + print("\n\n[EXIT] Goodbye!") + sys.exit(0) + + def run(self) -> None: + """Main application loop.""" + try: + self.display_header() + self.display_available_languages() + + while True: + lang_id = self.get_user_language_choice() + + print(f"\n[>] Verifying language file: {lang_id}.json") + print("=" * 50) + + stats = self.fix_translation_file(lang_id) + self.display_translation_results(lang_id, stats) + + except KeyboardInterrupt: + print("\n\n[EXIT] Operation cancelled by user") + sys.exit(0) + + except Exception as e: + print(f"\n[✗] Unexpected error: {e}") + sys.exit(1) + + +def main() -> None: + """Entry point of the application.""" + locale_manager = LocaleManager() + locale_manager.run() + + +if __name__ == "__main__": + main() diff --git a/src/static/locale/language_template.json b/src/static/locales/locale_template.json similarity index 100% rename from src/static/locale/language_template.json rename to src/static/locales/locale_template.json diff --git a/src/static/locale/nl-nl.json b/src/static/locales/nl-NL.json similarity index 100% rename from src/static/locale/nl-nl.json rename to src/static/locales/nl-NL.json diff --git a/src/static/locale/pl.json b/src/static/locales/pl-PL.json similarity index 100% rename from src/static/locale/pl.json rename to src/static/locales/pl-PL.json diff --git a/src/static/locale/ru.json b/src/static/locales/ru-RU.json similarity index 100% rename from src/static/locale/ru.json rename to src/static/locales/ru-RU.json diff --git a/src/static/locales/supported_locales.json b/src/static/locales/supported_locales.json new file mode 100644 index 00000000..b4c2bbf6 --- /dev/null +++ b/src/static/locales/supported_locales.json @@ -0,0 +1,134 @@ +[ + { + "flag": "🇺🇸", + "lang_id": "en-US", + "lang_name": "English (United States)", + "lang_name_localized": "English (United States)" + }, + { + "flag": "🇸🇦", + "lang_id": "ar-SA", + "lang_name": "Arabic (Saudi Arabia)", + "lang_name_localized": "العربية (السعودية)" + }, + { + "flag": "🇧🇾", + "lang_id": "be-BY", + "lang_name": "Belarusian (Belarus)", + "lang_name_localized": "Беларуская (Беларусь)" + }, + { + "flag": "🏴󠁥󠁳󠁣󠁴󠁿", + "lang_id": "ca-ES", + "lang_name": "Catalan (Spain)", + "lang_name_localized": "Català (Espanya)" + }, + { + "flag": "🇨🇿", + "lang_id": "cs-CZ", + "lang_name": "Czech (Czech Republic)", + "lang_name_localized": "Česky (Česká republika)" + }, + { + "flag": "🇩🇪", + "lang_id": "de-DE", + "lang_name": "German (Germany)", + "lang_name_localized": "Deutsch (Deutschland)" + }, + { + "flag": "🇪🇸", + "lang_id": "es-ES", + "lang_name": "Spanish (Spain)", + "lang_name_localized": "Español (España)" + }, + { + "flag": "🇮🇷", + "lang_id": "fa-IR", + "lang_name": "Persian (Iran)", + "lang_name_localized": "فارسی (ایران)" + }, + { + "flag": "🇨🇦", + "lang_id": "fr-CA", + "lang_name": "French (Canada)", + "lang_name_localized": "Français (Canada)" + }, + { + "flag": "🇫🇷", + "lang_id": "fr-FR", + "lang_name": "French (France)", + "lang_name_localized": "Français (France)" + }, + { + "flag": "🇮🇹", + "lang_id": "it-IT", + "lang_name": "Italian (Italy)", + "lang_name_localized": "Italiano (Italia)" + }, + { + "flag": "🇯🇵", + "lang_id": "ja-JP", + "lang_name": "Japanese (Japan)", + "lang_name_localized": "日本語 (日本)" + }, + { + "flag": "🇰🇷", + "lang_id": "ko-KR", + "lang_name": "Korean (South Korea)", + "lang_name_localized": "한국어 (대한민국)" + }, + { + "flag": "🇳🇱", + "lang_id": "nl-NL", + "lang_name": "Dutch (Netherlands)", + "lang_name_localized": "Nederlands (Nederland)" + }, + { + "flag": "🇵🇱", + "lang_id": "pl-PL", + "lang_name": "Polish (Poland)", + "lang_name_localized": "Polski (Polska)" + }, + { + "flag": "🇷🇺", + "lang_id": "ru-RU", + "lang_name": "Russian (Russia)", + "lang_name_localized": "Русский (Россия)" + }, + { + "flag": "🇸🇪", + "lang_id": "sv-SE", + "lang_name": "Swedish (Sweden)", + "lang_name_localized": "Svenska (Sverige)" + }, + { + "flag": "🇹🇭", + "lang_id": "th-TH", + "lang_name": "Thai (Thailand)", + "lang_name_localized": "ภาษาไทย (ประเทศไทย)" + }, + { + "flag": "🇹🇷", + "lang_id": "tr-TR", + "lang_name": "Turkish (Turkey)", + "lang_name_localized": "Türkçe (Türkiye)" + }, + { + "flag": "🇺🇦", + "lang_id": "uk-UA", + "lang_name": "Ukrainian (Ukraine)", + "lang_name_localized": "Українська (Україна)" + }, + { + "flag": "🇨🇳", + "lang_id": "zh-CN", + "lang_name": "Chinese (Simplified, China)", + "lang_name_localized": "中文(简体,中国)" + }, + { + "flag": "🇭🇰", + "lang_id": "zh-HK", + "lang_name": "Chinese (Traditional, Hong Kong)", + "lang_name_localized": "中文(繁體,香港)" + } +] \ No newline at end of file diff --git a/src/static/locale/sv-se.json b/src/static/locales/sv-SE.json similarity index 100% rename from src/static/locale/sv-se.json rename to src/static/locales/sv-SE.json diff --git a/src/static/locale/th.json b/src/static/locales/th-TH.json similarity index 100% rename from src/static/locale/th.json rename to src/static/locales/th-TH.json diff --git a/src/static/locale/tr-tr.json b/src/static/locales/tr-TR.json similarity index 100% rename from src/static/locale/tr-tr.json rename to src/static/locales/tr-TR.json diff --git a/src/static/locale/uk.json b/src/static/locales/uk-UA.json similarity index 100% rename from src/static/locale/uk.json rename to src/static/locales/uk-UA.json diff --git a/src/static/locale/zh-cn.json b/src/static/locales/zh-CN.json similarity index 100% rename from src/static/locale/zh-cn.json rename to src/static/locales/zh-CN.json diff --git a/src/static/locale/zh-hk.json b/src/static/locales/zh-HK.json similarity index 100% rename from src/static/locale/zh-hk.json rename to src/static/locales/zh-HK.json