From 25e349a9797e6eabafbc3e38f2a11664a2b86309 Mon Sep 17 00:00:00 2001 From: 2ro <17595647+2ro@users.noreply.github.com> Date: Thu, 9 Jul 2026 20:43:33 -0400 Subject: [PATCH] tor: translate per-user-tor strings, zh-Hant/HK auto-detect Translate the 16 new per-user-Tor keys and the changed transport-neutral goblin.privacy.intro across all 9 non-English locales (de/es/fr/ja/ko/ru/tr/ zh-CN/zh-TW), replacing the slice-3 English placeholders. Confirm goblin.receive.copy was already translated everywhere. Normalize zh-Hant, zh-HK, and zh-Hant-* system locales to zh-TW (and zh-Hans(-*) to zh-CN) in setup_i18n, so Traditional-script systems that don't report the exact zh-TW tag still land on Traditional instead of falling through to the default locale. Note the zh-TW -> zh news-locale fold in news_locale_code as an intentional, low-priority tradeoff (Traditional readers see the same zh news feed as Simplified); no new pipeline added. --- locales/de.yml | 34 +++++++++++++++++----------------- locales/es.yml | 34 +++++++++++++++++----------------- locales/fr.yml | 34 +++++++++++++++++----------------- locales/ja.yml | 34 +++++++++++++++++----------------- locales/ko.yml | 34 +++++++++++++++++----------------- locales/ru.yml | 34 +++++++++++++++++----------------- locales/tr.yml | 34 +++++++++++++++++----------------- locales/zh-CN.yml | 34 +++++++++++++++++----------------- locales/zh-TW.yml | 34 +++++++++++++++++----------------- src/gui/views/goblin/data.rs | 5 +++++ src/lib.rs | 17 +++++++++++++++++ 11 files changed, 175 insertions(+), 153 deletions(-) diff --git a/locales/de.yml b/locales/de.yml index dc7b26db..bf16923a 100644 --- a/locales/de.yml +++ b/locales/de.yml @@ -363,8 +363,8 @@ goblin: connected_tor: "Über Tor verbunden" tor_ready: "Tor bereit · Relays…" connecting_tor: "Verbinde mit Tor…" - connected_direct: "Connected (direct)" - connecting_direct: "Connecting (direct)…" + connected_direct: "Verbunden (direkt)" + connecting_direct: "Verbinde (direkt)…" cant_reach_node: "Node nicht erreichbar" node_synced: "Node synchronisiert" syncing: "Synchronisiere…" @@ -485,8 +485,8 @@ goblin: privacy: "Privatsphäre" tor_routing: "Tor-Routing" messages_lookups: "Nachrichten & Abfragen" - tor_on: "On" - tor_off: "Off" + tor_on: "Ein" + tor_off: "Aus" auto_accept: "Automatisch annehmen" pairing: "Preiswährung" accept_anyone: "Jeder" @@ -644,7 +644,7 @@ goblin: delete_final: "Endgültig löschen" privacy: title: "Netzwerk-Privatsphäre" - intro: "Goblin sendet seinen privaten Datenverkehr über Tor und verbirgt so deine IP vor dem Relay — die Verschlüsselung verbirgt den Rest, sodass ein Relay eine Zahlung nicht zu dir zurückverfolgen kann." + intro: "Goblin sendet nur wenige Dinge über das Netzwerk. Hier siehst du, was dein Gerät verlässt und wie es dabei privat bleibt." payments: "Zahlungen" payments_blurb: "Jede nostr-Nachricht, die einen slatepack trägt." usernames: "Benutzernamen" @@ -655,14 +655,14 @@ goblin: direct_connection: "Direkte Verbindung" grin_node: "Grin-Node" grin_node_blurb: "Block-Synchronisierung und Übertragung deiner Transaktion ins Netzwerk. Dies sind öffentliche Chain-Daten, für alle gleich, und nicht mit deiner Identität verknüpft." - how_privacy: "How your privacy works" - how_privacy_blurb: "Payments and messages are sealed with authenticated encryption and delivered as private messages, so a relay can't read them or link a payment back to you." - always_direct: "Always direct" - tor_off: "Tor off" - tor_on: "Tor on" - tor_switch: "Route through Tor" - tor_switch_sub: "Send your private traffic through the Tor network to hide your IP from relays." - vpn_note: "With Tor off, relays can see your IP address. We recommend using at least a VPN." + how_privacy: "So funktioniert deine Privatsphäre" + how_privacy_blurb: "Zahlungen und Nachrichten werden mit authentifizierter Verschlüsselung versiegelt und als private Nachrichten zugestellt, sodass ein Relay sie weder lesen noch eine Zahlung zu dir zurückverfolgen kann." + always_direct: "Immer direkt" + tor_off: "Tor aus" + tor_on: "Tor an" + tor_switch: "Über Tor leiten" + tor_switch_sub: "Sende deinen privaten Datenverkehr durch das Tor-Netzwerk, um deine IP vor Relays zu verbergen." + vpn_note: "Wenn Tor aus ist, können Relays deine IP-Adresse sehen. Wir empfehlen, zumindest ein VPN zu verwenden." pairing: title: "Kopplung" intro: "Womit dein Guthaben und deine Beträge verglichen werden." @@ -809,8 +809,8 @@ goblin: working: "Arbeite…" onboarding: privacy: - kicker: "NETWORK PRIVACY" - continue: "Continue" + kicker: "NETZWERK-PRIVATSPHÄRE" + continue: "Weiter" intro: private_money_head: "Privates Geld" private_money_body: "Goblin ist ein Wallet für grin — digitales Bargeld ohne Beträge oder Adressen auf seiner Chain." @@ -872,8 +872,8 @@ goblin: key_being_made: "Schlüssel wird erstellt…" connected_tor: "über Tor verbunden" connecting_tor: "verbinde über Tor…" - connected_direct: "connected (direct)" - connecting_direct: "connecting (direct)…" + connected_direct: "verbunden (direkt)" + connecting_direct: "verbinde (direkt)…" fresh_key_blurb: "Ein Zahlungsschlüssel, der nicht Teil deines Seeds ist — jederzeit rotierbar, ohne deine Mittel zu berühren." restoring: "Deine Identitäten werden wiederhergestellt…" clean_slate_blurb: "Lust auf einen Neuanfang? Tausche jederzeit einen brandneuen Schlüssel ein — das neue Du ist nicht mit dem alten verknüpft. Gleiches Wallet, frisches Gesicht." diff --git a/locales/es.yml b/locales/es.yml index a120a6a1..ba3ba589 100644 --- a/locales/es.yml +++ b/locales/es.yml @@ -363,8 +363,8 @@ goblin: connected_tor: "Conectado por Tor" tor_ready: "Tor listo · relés…" connecting_tor: "Conectando a Tor…" - connected_direct: "Connected (direct)" - connecting_direct: "Connecting (direct)…" + connected_direct: "Conectado (directo)" + connecting_direct: "Conectando (directo)…" cant_reach_node: "No se puede conectar con el nodo" node_synced: "Nodo sincronizado" syncing: "Sincronizando…" @@ -485,8 +485,8 @@ goblin: privacy: "Privacidad" tor_routing: "Enrutamiento por Tor" messages_lookups: "Mensajes y consultas" - tor_on: "On" - tor_off: "Off" + tor_on: "Activado" + tor_off: "Desactivado" auto_accept: "Aceptación automática" pairing: "Moneda de referencia" accept_anyone: "Cualquiera" @@ -644,7 +644,7 @@ goblin: delete_final: "Eliminar permanentemente" privacy: title: "Privacidad de red" - intro: "Goblin envía su tráfico privado a través de Tor, lo que oculta tu IP del relé — el cifrado oculta el resto, de modo que un relé no puede vincular un pago contigo." + intro: "Goblin envía solo unas pocas cosas a través de la red. Esto es lo que sale de tu dispositivo, y cómo se mantiene privado." payments: "Pagos" payments_blurb: "Cada mensaje de nostr que transporta un slatepack." usernames: "nombres de usuario" @@ -655,14 +655,14 @@ goblin: direct_connection: "Conexión directa" grin_node: "Nodo de Grin" grin_node_blurb: "Sincronización de bloques y transmisión de tu transacción a la red. Estos son datos públicos de la cadena, iguales para todos, y no están vinculados a tu identidad." - how_privacy: "How your privacy works" - how_privacy_blurb: "Payments and messages are sealed with authenticated encryption and delivered as private messages, so a relay can't read them or link a payment back to you." - always_direct: "Always direct" - tor_off: "Tor off" - tor_on: "Tor on" - tor_switch: "Route through Tor" - tor_switch_sub: "Send your private traffic through the Tor network to hide your IP from relays." - vpn_note: "With Tor off, relays can see your IP address. We recommend using at least a VPN." + how_privacy: "Cómo funciona tu privacidad" + how_privacy_blurb: "Los pagos y mensajes se sellan con cifrado autenticado y se entregan como mensajes privados, de modo que un relé no puede leerlos ni vincular un pago contigo." + always_direct: "Siempre directo" + tor_off: "Tor desactivado" + tor_on: "Tor activado" + tor_switch: "Enrutar a través de Tor" + tor_switch_sub: "Envía tu tráfico privado a través de la red Tor para ocultar tu IP de los relés." + vpn_note: "Con Tor desactivado, los relés pueden ver tu dirección IP. Te recomendamos usar al menos una VPN." pairing: title: "Referencia de precio" intro: "Aquello contra lo que se muestran tu saldo y tus montos." @@ -809,8 +809,8 @@ goblin: working: "Procesando…" onboarding: privacy: - kicker: "NETWORK PRIVACY" - continue: "Continue" + kicker: "PRIVACIDAD DE RED" + continue: "Continuar" intro: private_money_head: "Dinero privado" private_money_body: "Goblin es una billetera para grin — dinero digital sin montos ni direcciones en su cadena." @@ -872,8 +872,8 @@ goblin: key_being_made: "creando clave…" connected_tor: "conectado por Tor" connecting_tor: "conectando por Tor…" - connected_direct: "connected (direct)" - connecting_direct: "connecting (direct)…" + connected_direct: "conectado (directo)" + connecting_direct: "conectando (directo)…" fresh_key_blurb: "Una clave de pago que no forma parte de tu frase de recuperación — rótala cuando quieras para mantener la privacidad, sin tocar tus fondos." restoring: "Restaurando tus identidades…" clean_slate_blurb: "¿Quieres empezar de cero? Cambia a una clave totalmente nueva cuando quieras — el nuevo tú no está vinculado al anterior. Misma billetera, cara nueva." diff --git a/locales/fr.yml b/locales/fr.yml index 52826f62..e8daeb9a 100644 --- a/locales/fr.yml +++ b/locales/fr.yml @@ -363,8 +363,8 @@ goblin: connected_tor: "Connecté via Tor" tor_ready: "Tor prêt · relais…" connecting_tor: "Connexion à Tor…" - connected_direct: "Connected (direct)" - connecting_direct: "Connecting (direct)…" + connected_direct: "Connecté (direct)" + connecting_direct: "Connexion (directe)…" cant_reach_node: "Nœud injoignable" node_synced: "Nœud synchronisé" syncing: "Synchronisation…" @@ -485,8 +485,8 @@ goblin: privacy: "Confidentialité" tor_routing: "Routage par Tor" messages_lookups: "Messages et recherches" - tor_on: "On" - tor_off: "Off" + tor_on: "Activé" + tor_off: "Désactivé" auto_accept: "Acceptation auto" pairing: "Devise des prix" accept_anyone: "Tout le monde" @@ -644,7 +644,7 @@ goblin: delete_final: "Supprimer définitivement" privacy: title: "Confidentialité réseau" - intro: "Goblin envoie son trafic privé via Tor, qui masque votre IP au relais — le chiffrement masque le reste, afin qu'un relais ne puisse pas relier un paiement à vous." + intro: "Goblin n'envoie que peu de choses sur le réseau. Voici ce qui quitte votre appareil, et comment cela reste privé." payments: "Paiements" payments_blurb: "Chaque message nostr transportant un slatepack." usernames: "Noms d'utilisateur" @@ -655,14 +655,14 @@ goblin: direct_connection: "Connexion directe" grin_node: "Nœud grin" grin_node_blurb: "Synchronisation des blocs et diffusion de votre transaction sur le réseau. Ce sont des données de chaîne publiques, identiques pour tous, et non liées à votre identité." - how_privacy: "How your privacy works" - how_privacy_blurb: "Payments and messages are sealed with authenticated encryption and delivered as private messages, so a relay can't read them or link a payment back to you." - always_direct: "Always direct" - tor_off: "Tor off" - tor_on: "Tor on" - tor_switch: "Route through Tor" - tor_switch_sub: "Send your private traffic through the Tor network to hide your IP from relays." - vpn_note: "With Tor off, relays can see your IP address. We recommend using at least a VPN." + how_privacy: "Comment fonctionne votre confidentialité" + how_privacy_blurb: "Les paiements et les messages sont scellés par un chiffrement authentifié et envoyés comme messages privés, de sorte qu'un relais ne peut ni les lire ni relier un paiement à vous." + always_direct: "Toujours direct" + tor_off: "Tor désactivé" + tor_on: "Tor activé" + tor_switch: "Acheminer via Tor" + tor_switch_sub: "Envoyez votre trafic privé via le réseau Tor pour masquer votre IP aux relais." + vpn_note: "Lorsque Tor est désactivé, les relais peuvent voir votre adresse IP. Nous vous recommandons d'utiliser au moins un VPN." pairing: title: "Appairage" intro: "Ce à quoi votre solde et vos montants sont comparés." @@ -809,8 +809,8 @@ goblin: working: "En cours…" onboarding: privacy: - kicker: "NETWORK PRIVACY" - continue: "Continue" + kicker: "CONFIDENTIALITÉ RÉSEAU" + continue: "Continuer" intro: private_money_head: "Argent privé" private_money_body: "Goblin est un portefeuille pour grin — de l'argent numérique sans montants ni adresses sur sa chaîne." @@ -872,8 +872,8 @@ goblin: key_being_made: "clé en cours de création…" connected_tor: "connecté via Tor" connecting_tor: "connexion via Tor…" - connected_direct: "connected (direct)" - connecting_direct: "connecting (direct)…" + connected_direct: "connecté (direct)" + connecting_direct: "connexion (directe)…" fresh_key_blurb: "Une clé de paiement qui ne fait pas partie de votre seed — renouvelable à tout moment, sans toucher à vos fonds." restoring: "Restauration de vos identités…" clean_slate_blurb: "Envie de repartir à zéro ? Remplacez par une toute nouvelle clé à tout moment — le nouveau vous n'est pas lié à l'ancien. Même portefeuille, nouveau visage." diff --git a/locales/ja.yml b/locales/ja.yml index 5aaeaee8..776564ad 100644 --- a/locales/ja.yml +++ b/locales/ja.yml @@ -363,8 +363,8 @@ goblin: connected_tor: "Tor経由で接続済み" tor_ready: "Tor準備完了 · リレー…" connecting_tor: "Torに接続中…" - connected_direct: "Connected (direct)" - connecting_direct: "Connecting (direct)…" + connected_direct: "接続済み(直接)" + connecting_direct: "接続中(直接)…" cant_reach_node: "ノードに接続できません" node_synced: "ノード同期済み" syncing: "同期中…" @@ -485,8 +485,8 @@ goblin: privacy: "プライバシー" tor_routing: "Torルーティング" messages_lookups: "メッセージと検索" - tor_on: "On" - tor_off: "Off" + tor_on: "オン" + tor_off: "オフ" auto_accept: "自動承認" pairing: "価格通貨" accept_anyone: "誰でも" @@ -644,7 +644,7 @@ goblin: delete_final: "完全に削除" privacy: title: "ネットワークプライバシー" - intro: "Goblinはプライベートな通信をTor経由で送信し、リレーからIPアドレスを隠します — 暗号化がそれ以外の情報を隠すため、リレーが支払いをあなたに結び付けることはできません。" + intro: "Goblinがネットワーク経由で送信するのはごくわずかな情報だけです。あなたの端末から出ていく情報と、それがどのように非公開に保たれるかをご覧ください。" payments: "支払い" payments_blurb: "slatepackを運ぶすべてのnostrメッセージです。" usernames: "ユーザー名" @@ -655,14 +655,14 @@ goblin: direct_connection: "直接接続" grin_node: "Grinノード" grin_node_blurb: "ブロックの同期と、取引をネットワークにブロードキャストする処理です。これは誰にとっても同じ公開されたチェーンデータであり、あなたのアイデンティティとは結び付いていません。" - how_privacy: "How your privacy works" - how_privacy_blurb: "Payments and messages are sealed with authenticated encryption and delivered as private messages, so a relay can't read them or link a payment back to you." - always_direct: "Always direct" - tor_off: "Tor off" - tor_on: "Tor on" - tor_switch: "Route through Tor" - tor_switch_sub: "Send your private traffic through the Tor network to hide your IP from relays." - vpn_note: "With Tor off, relays can see your IP address. We recommend using at least a VPN." + how_privacy: "プライバシーの仕組み" + how_privacy_blurb: "支払いとメッセージは認証付き暗号化で封印され、プライベートメッセージとして届けられます。そのためリレーはそれらを読み取ることも、支払いをあなたに結び付けることもできません。" + always_direct: "常に直接接続" + tor_off: "Torオフ" + tor_on: "Torオン" + tor_switch: "Tor経由でルーティング" + tor_switch_sub: "プライベートな通信をTorネットワーク経由で送信し、リレーからIPアドレスを隠します。" + vpn_note: "Torがオフの場合、リレーはあなたのIPアドレスを見ることができます。少なくともVPNの利用をお勧めします。" pairing: title: "価格通貨" intro: "残高や金額を表示する際の基準となる通貨です。" @@ -809,8 +809,8 @@ goblin: working: "処理中…" onboarding: privacy: - kicker: "NETWORK PRIVACY" - continue: "Continue" + kicker: "ネットワークプライバシー" + continue: "続ける" intro: private_money_head: "プライベートなお金" private_money_body: "Goblinはgrin用のウォレットです — チェーン上に金額もアドレスも残らないデジタルキャッシュです。" @@ -873,8 +873,8 @@ goblin: key_being_made: "キーを作成中…" connected_tor: "Tor経由で接続済み" connecting_tor: "Tor経由で接続中…" - connected_direct: "connected (direct)" - connecting_direct: "connecting (direct)…" + connected_direct: "接続済み(直接)" + connecting_direct: "接続中(直接)…" fresh_key_blurb: "リカバリーフレーズの一部ではない支払い用のキーです — 資金に影響を与えることなく、いつでもローテーションしてプライバシーを保てます。" restoring: "アイデンティティを復元しています…" clean_slate_blurb: "まっさらな状態にしたいですか? いつでもまったく新しいキーに切り替えられます — 新しいあなたは古いあなたと結び付きません。同じウォレットで、新しい顔になります。" diff --git a/locales/ko.yml b/locales/ko.yml index e6054f92..140ecd04 100644 --- a/locales/ko.yml +++ b/locales/ko.yml @@ -363,8 +363,8 @@ goblin: connected_tor: "Tor로 연결됨" tor_ready: "Tor 준비 완료 · 릴레이…" connecting_tor: "Tor에 연결하는 중…" - connected_direct: "Connected (direct)" - connecting_direct: "Connecting (direct)…" + connected_direct: "연결됨 (직접)" + connecting_direct: "연결 중 (직접)…" cant_reach_node: "노드에 연결할 수 없음" node_synced: "노드 동기화됨" syncing: "동기화하는 중…" @@ -485,8 +485,8 @@ goblin: privacy: "프라이버시" tor_routing: "Tor 라우팅" messages_lookups: "메시지 및 조회" - tor_on: "On" - tor_off: "Off" + tor_on: "켜짐" + tor_off: "꺼짐" auto_accept: "자동 수락" pairing: "기준 통화" accept_anyone: "누구나" @@ -644,7 +644,7 @@ goblin: delete_final: "영구 삭제" privacy: title: "네트워크 프라이버시" - intro: "Goblin은 개인 트래픽을 Tor를 통해 전송해 릴레이로부터 내 IP를 숨깁니다 — 암호화가 나머지를 숨겨서 릴레이가 결제를 나와 연결 지을 수 없습니다." + intro: "Goblin은 네트워크를 통해 아주 적은 정보만 전송합니다. 여기서 내 기기에서 무엇이 나가는지, 그리고 그것이 어떻게 비공개로 유지되는지 확인하세요." payments: "결제" payments_blurb: "slatepack을 담은 모든 nostr 메시지입니다." usernames: "사용자 이름" @@ -655,14 +655,14 @@ goblin: direct_connection: "직접 연결" grin_node: "Grin 노드" grin_node_blurb: "블록 동기화와 거래를 네트워크에 전파하는 과정입니다. 이는 모두에게 동일한 공개 체인 데이터이며 신원과 연결되지 않습니다." - how_privacy: "How your privacy works" - how_privacy_blurb: "Payments and messages are sealed with authenticated encryption and delivered as private messages, so a relay can't read them or link a payment back to you." - always_direct: "Always direct" - tor_off: "Tor off" - tor_on: "Tor on" - tor_switch: "Route through Tor" - tor_switch_sub: "Send your private traffic through the Tor network to hide your IP from relays." - vpn_note: "With Tor off, relays can see your IP address. We recommend using at least a VPN." + how_privacy: "프라이버시가 작동하는 방식" + how_privacy_blurb: "결제와 메시지는 인증된 암호화로 봉인되어 비공개 메시지로 전달되므로, 릴레이가 이를 읽거나 결제를 나와 연결 지을 수 없습니다." + always_direct: "항상 직접 연결" + tor_off: "Tor 꺼짐" + tor_on: "Tor 켜짐" + tor_switch: "Tor로 라우팅" + tor_switch_sub: "개인 트래픽을 Tor 네트워크를 통해 전송해 릴레이로부터 IP를 숨깁니다." + vpn_note: "Tor가 꺼져 있으면 릴레이가 내 IP 주소를 볼 수 있습니다. 최소한 VPN 사용을 권장합니다." pairing: title: "기준 통화" intro: "내 잔액과 금액이 어떤 통화로 표시되는지입니다." @@ -809,8 +809,8 @@ goblin: working: "처리하는 중…" onboarding: privacy: - kicker: "NETWORK PRIVACY" - continue: "Continue" + kicker: "네트워크 프라이버시" + continue: "계속" intro: private_money_head: "프라이빗한 돈" private_money_body: "Goblin은 grin을 위한 지갑입니다 — 체인에 금액도 주소도 남지 않는 디지털 현금입니다." @@ -872,8 +872,8 @@ goblin: key_being_made: "키를 만드는 중…" connected_tor: "Tor로 연결됨" connecting_tor: "Tor로 연결하는 중…" - connected_direct: "connected (direct)" - connecting_direct: "connecting (direct)…" + connected_direct: "연결됨 (직접)" + connecting_direct: "연결 중 (직접)…" fresh_key_blurb: "복구 문구에 속하지 않는 결제 키입니다 — 자금은 그대로 둔 채 언제든 교체해 프라이버시를 지키세요." restoring: "신원을 복원하는 중…" clean_slate_blurb: "새 출발을 원하시나요? 언제든 완전히 새로운 키로 바꾸세요 — 새로운 나는 이전과 연결되지 않습니다. 같은 지갑, 새로운 얼굴입니다." diff --git a/locales/ru.yml b/locales/ru.yml index 66764f12..019b1555 100644 --- a/locales/ru.yml +++ b/locales/ru.yml @@ -363,8 +363,8 @@ goblin: connected_tor: "Подключено через Tor" tor_ready: "Tor готов · реле…" connecting_tor: "Подключение к Tor…" - connected_direct: "Connected (direct)" - connecting_direct: "Connecting (direct)…" + connected_direct: "Подключено (напрямую)" + connecting_direct: "Подключение (напрямую)…" cant_reach_node: "Нет связи с узлом" node_synced: "Узел синхронизирован" syncing: "Синхронизация…" @@ -485,8 +485,8 @@ goblin: privacy: "Приватность" tor_routing: "Маршрутизация через Tor" messages_lookups: "Сообщения и поиск" - tor_on: "On" - tor_off: "Off" + tor_on: "Вкл" + tor_off: "Выкл" auto_accept: "Автоприём" pairing: "Валюта цены" accept_anyone: "Любой" @@ -644,7 +644,7 @@ goblin: delete_final: "Удалить навсегда" privacy: title: "Сетевая приватность" - intro: "Goblin отправляет приватный трафик через Tor, который скрывает ваш IP от реле — шифрование скрывает остальное, чтобы реле не могло связать платёж с вами." + intro: "Goblin отправляет по сети лишь немногое. Вот что покидает ваше устройство и как это остаётся приватным." payments: "Платежи" payments_blurb: "Каждое nostr-сообщение, несущее slatepack." usernames: "Имена пользователей" @@ -655,14 +655,14 @@ goblin: direct_connection: "Прямое соединение" grin_node: "Узел Grin" grin_node_blurb: "Синхронизация блоков и трансляция транзакции в сеть. Это публичные данные цепочки, одинаковые для всех, и они не связаны с вашей личностью." - how_privacy: "How your privacy works" - how_privacy_blurb: "Payments and messages are sealed with authenticated encryption and delivered as private messages, so a relay can't read them or link a payment back to you." - always_direct: "Always direct" - tor_off: "Tor off" - tor_on: "Tor on" - tor_switch: "Route through Tor" - tor_switch_sub: "Send your private traffic through the Tor network to hide your IP from relays." - vpn_note: "With Tor off, relays can see your IP address. We recommend using at least a VPN." + how_privacy: "Как работает ваша приватность" + how_privacy_blurb: "Платежи и сообщения запечатываются аутентифицированным шифрованием и доставляются как приватные сообщения, поэтому реле не может их прочитать или связать платёж с вами." + always_direct: "Всегда напрямую" + tor_off: "Tor выключен" + tor_on: "Tor включён" + tor_switch: "Маршрутизировать через Tor" + tor_switch_sub: "Отправляйте приватный трафик через сеть Tor, чтобы скрыть свой IP от реле." + vpn_note: "Если Tor выключен, реле могут видеть ваш IP-адрес. Рекомендуем использовать хотя бы VPN." pairing: title: "Привязка" intro: "К чему привязаны отображаемые баланс и суммы." @@ -809,8 +809,8 @@ goblin: working: "Обработка…" onboarding: privacy: - kicker: "NETWORK PRIVACY" - continue: "Continue" + kicker: "СЕТЕВАЯ ПРИВАТНОСТЬ" + continue: "Продолжить" intro: private_money_head: "Приватные деньги" private_money_body: "Goblin — кошелёк для grin: цифровая наличность без сумм и адресов в её цепочке." @@ -872,8 +872,8 @@ goblin: key_being_made: "ключ создаётся…" connected_tor: "подключено через Tor" connecting_tor: "подключение через Tor…" - connected_direct: "connected (direct)" - connecting_direct: "connecting (direct)…" + connected_direct: "подключено (напрямую)" + connecting_direct: "подключение (напрямую)…" fresh_key_blurb: "Платёжный ключ, не связанный с seed-фразой — меняйте его в любой момент, не трогая средства." restoring: "Восстановление ваших личностей…" clean_slate_blurb: "Хотите начать с чистого листа? Подставьте совершенно новый ключ в любой момент — новый вы не связан со старым. Тот же кошелёк, новое лицо." diff --git a/locales/tr.yml b/locales/tr.yml index 86bdde76..12760a6b 100644 --- a/locales/tr.yml +++ b/locales/tr.yml @@ -363,8 +363,8 @@ goblin: connected_tor: "Tor üzerinden bağlı" tor_ready: "Tor hazır · relaylar…" connecting_tor: "Tor'a bağlanılıyor…" - connected_direct: "Connected (direct)" - connecting_direct: "Connecting (direct)…" + connected_direct: "Bağlandı (doğrudan)" + connecting_direct: "Bağlanıyor (doğrudan)…" cant_reach_node: "Düğüme ulaşılamıyor" node_synced: "Düğüm eşitlendi" syncing: "Eşitleniyor…" @@ -485,8 +485,8 @@ goblin: privacy: "Gizlilik" tor_routing: "Tor yönlendirme" messages_lookups: "Mesajlar ve aramalar" - tor_on: "On" - tor_off: "Off" + tor_on: "Açık" + tor_off: "Kapalı" auto_accept: "Otomatik kabul" pairing: "Fiyat para birimi" accept_anyone: "Herkes" @@ -644,7 +644,7 @@ goblin: delete_final: "Kalıcı olarak sil" privacy: title: "Ağ gizliliği" - intro: "Goblin özel trafiğini Tor üzerinden gönderir ve senin IP adresini relaydan gizler — şifreleme de gerisini gizler, böylece bir relay bir ödemeyi sana bağlayamaz." + intro: "Goblin ağ üzerinden yalnızca birkaç şey gönderir. İşte cihazından neyin çıktığı ve bunun nasıl gizli kaldığı." payments: "Ödemeler" payments_blurb: "Slatepack taşıyan her nostr mesajı." usernames: "usernamelar" @@ -655,14 +655,14 @@ goblin: direct_connection: "Doğrudan bağlantı" grin_node: "Grin düğümü" grin_node_blurb: "Blok eşitleme ve işlemini ağa yayma. Bu, herkes için aynı olan genel zincir verisidir ve kimliğinle ilişkilendirilmez." - how_privacy: "How your privacy works" - how_privacy_blurb: "Payments and messages are sealed with authenticated encryption and delivered as private messages, so a relay can't read them or link a payment back to you." - always_direct: "Always direct" - tor_off: "Tor off" - tor_on: "Tor on" - tor_switch: "Route through Tor" - tor_switch_sub: "Send your private traffic through the Tor network to hide your IP from relays." - vpn_note: "With Tor off, relays can see your IP address. We recommend using at least a VPN." + how_privacy: "Gizliliğin nasıl çalıştığı" + how_privacy_blurb: "Ödemeler ve mesajlar kimlik doğrulamalı şifrelemeyle mühürlenip özel mesajlar olarak iletilir; böylece bir relay bunları okuyamaz veya bir ödemeyi sana bağlayamaz." + always_direct: "Her zaman doğrudan" + tor_off: "Tor kapalı" + tor_on: "Tor açık" + tor_switch: "Tor üzerinden yönlendir" + tor_switch_sub: "Relaylardan IP adresini gizlemek için özel trafiğini Tor ağı üzerinden gönder." + vpn_note: "Tor kapalıyken relaylar IP adresini görebilir. En azından bir VPN kullanmanı öneririz." pairing: title: "Eşleştirme" intro: "Bakiyenin ve tutarların neye göre gösterildiği." @@ -809,8 +809,8 @@ goblin: working: "Çalışıyor…" onboarding: privacy: - kicker: "NETWORK PRIVACY" - continue: "Continue" + kicker: "AĞ GİZLİLİĞİ" + continue: "Devam" intro: private_money_head: "Özel para" private_money_body: "Goblin, grin için bir cüzdan — zincirinde tutar ya da adres bulunmayan dijital nakit." @@ -872,8 +872,8 @@ goblin: key_being_made: "anahtar oluşturuluyor…" connected_tor: "Tor üzerinden bağlı" connecting_tor: "Tor üzerinden bağlanılıyor…" - connected_direct: "connected (direct)" - connecting_direct: "connecting (direct)…" + connected_direct: "bağlandı (doğrudan)" + connecting_direct: "bağlanıyor (doğrudan)…" fresh_key_blurb: "Seed'inin parçası olmayan bir ödeme anahtarı — paranı hiç ellemeden istediğin an döndür." restoring: "Kimliklerin geri yükleniyor…" clean_slate_blurb: "Temiz bir sayfa mı istiyorsun? İstediğin zaman yepyeni bir anahtar tak — yeni sen eskisine bağlı değil. Aynı cüzdan, yeni yüz." diff --git a/locales/zh-CN.yml b/locales/zh-CN.yml index 80b217e0..394d7f75 100644 --- a/locales/zh-CN.yml +++ b/locales/zh-CN.yml @@ -363,8 +363,8 @@ goblin: connected_tor: "已通过 Tor 连接" tor_ready: "Tor 就绪 · 连接中继…" connecting_tor: "正在连接 Tor…" - connected_direct: "Connected (direct)" - connecting_direct: "Connecting (direct)…" + connected_direct: "已连接(直连)" + connecting_direct: "正在连接(直连)…" cant_reach_node: "无法连接节点" node_synced: "节点已同步" syncing: "同步中…" @@ -485,8 +485,8 @@ goblin: privacy: "隐私" tor_routing: "Tor 路由" messages_lookups: "消息和查询" - tor_on: "On" - tor_off: "Off" + tor_on: "开启" + tor_off: "关闭" auto_accept: "自动接受" pairing: "价格货币" accept_anyone: "任何人" @@ -644,7 +644,7 @@ goblin: delete_final: "永久删除" privacy: title: "网络隐私" - intro: "Goblin 通过 Tor 发送其私密流量,向中继隐藏你的 IP — 加密隐藏其余部分,使中继无法将付款关联到你。" + intro: "Goblin 只在网络上发送极少量信息。以下是离开你设备的内容,以及它如何保持私密。" payments: "付款" payments_blurb: "每条携带 slatepack 的 nostr 消息。" usernames: "用户名" @@ -655,14 +655,14 @@ goblin: direct_connection: "直接连接" grin_node: "Grin 节点" grin_node_blurb: "区块同步及向网络广播你的交易。这是公开的链上数据,对所有人都一样,且不与你的身份关联。" - how_privacy: "How your privacy works" - how_privacy_blurb: "Payments and messages are sealed with authenticated encryption and delivered as private messages, so a relay can't read them or link a payment back to you." - always_direct: "Always direct" - tor_off: "Tor off" - tor_on: "Tor on" - tor_switch: "Route through Tor" - tor_switch_sub: "Send your private traffic through the Tor network to hide your IP from relays." - vpn_note: "With Tor off, relays can see your IP address. We recommend using at least a VPN." + how_privacy: "你的隐私如何运作" + how_privacy_blurb: "付款和消息都用认证加密进行封装,并以私密消息的形式送达,因此中继既无法读取内容,也无法将付款关联到你。" + always_direct: "始终直连" + tor_off: "Tor 已关闭" + tor_on: "Tor 已开启" + tor_switch: "通过 Tor 路由" + tor_switch_sub: "将你的私密流量通过 Tor 网络发送,向中继隐藏你的 IP。" + vpn_note: "关闭 Tor 后,中继可以看到你的 IP 地址。我们建议你至少使用 VPN。" pairing: title: "配对" intro: "你的余额和金额以何种货币显示。" @@ -809,8 +809,8 @@ goblin: working: "处理中…" onboarding: privacy: - kicker: "NETWORK PRIVACY" - continue: "Continue" + kicker: "网络隐私" + continue: "继续" intro: private_money_head: "私密货币" private_money_body: "Goblin 是一个 grin 钱包 — 链上无金额、无地址的数字现金。" @@ -872,8 +872,8 @@ goblin: key_being_made: "正在生成密钥…" connected_tor: "已通过 Tor 连接" connecting_tor: "正在通过 Tor 连接…" - connected_direct: "connected (direct)" - connecting_direct: "connecting (direct)…" + connected_direct: "已连接(直连)" + connecting_direct: "正在连接(直连)…" fresh_key_blurb: "一个不属于助记词的支付密钥——可随时轮换以保护隐私,且不影响你的资金。" restoring: "正在恢复你的身份…" clean_slate_blurb: "想要全新开始?随时换上一个全新密钥 — 新的你与旧的毫无关联。同一个钱包,焕然一新。" diff --git a/locales/zh-TW.yml b/locales/zh-TW.yml index 8887ba1d..32949cd7 100644 --- a/locales/zh-TW.yml +++ b/locales/zh-TW.yml @@ -363,8 +363,8 @@ goblin: connected_tor: "已透過 Tor 連線" tor_ready: "Tor 就緒 · 連線中繼…" connecting_tor: "正在連線 Tor…" - connected_direct: "Connected (direct)" - connecting_direct: "Connecting (direct)…" + connected_direct: "已連線(直連)" + connecting_direct: "正在連線(直連)…" cant_reach_node: "無法連線節點" node_synced: "節點已同步" syncing: "同步中…" @@ -485,8 +485,8 @@ goblin: privacy: "隱私" tor_routing: "Tor 路由" messages_lookups: "訊息和查詢" - tor_on: "On" - tor_off: "Off" + tor_on: "開啟" + tor_off: "關閉" auto_accept: "自動接受" pairing: "價格貨幣" accept_anyone: "任何人" @@ -644,7 +644,7 @@ goblin: delete_final: "永久刪除" privacy: title: "網路隱私" - intro: "Goblin 透過 Tor 傳送其私密流量,向中繼隱藏你的 IP — 加密隱藏其餘部分,使中繼無法將付款關聯到你。" + intro: "Goblin 只在網路上傳送極少量資訊。以下是離開你裝置的內容,以及它如何保持私密。" payments: "付款" payments_blurb: "每條攜帶 slatepack 的 nostr 訊息。" usernames: "使用者名稱" @@ -655,14 +655,14 @@ goblin: direct_connection: "直接連線" grin_node: "Grin 節點" grin_node_blurb: "區塊同步及向網路廣播你的交易。這是公開的鏈上資料,對所有人都一樣,且不與你的身份關聯。" - how_privacy: "How your privacy works" - how_privacy_blurb: "Payments and messages are sealed with authenticated encryption and delivered as private messages, so a relay can't read them or link a payment back to you." - always_direct: "Always direct" - tor_off: "Tor off" - tor_on: "Tor on" - tor_switch: "Route through Tor" - tor_switch_sub: "Send your private traffic through the Tor network to hide your IP from relays." - vpn_note: "With Tor off, relays can see your IP address. We recommend using at least a VPN." + how_privacy: "你的隱私如何運作" + how_privacy_blurb: "付款和訊息都用認證加密進行封裝,並以私密訊息的形式送達,因此中繼既無法讀取內容,也無法將付款關聯到你。" + always_direct: "始終直連" + tor_off: "Tor 已關閉" + tor_on: "Tor 已開啟" + tor_switch: "透過 Tor 路由" + tor_switch_sub: "將你的私密流量透過 Tor 網路傳送,向中繼隱藏你的 IP。" + vpn_note: "關閉 Tor 後,中繼可以看到你的 IP 位址。我們建議你至少使用 VPN。" pairing: title: "配對" intro: "你的餘額和金額以何種貨幣顯示。" @@ -809,8 +809,8 @@ goblin: working: "處理中…" onboarding: privacy: - kicker: "NETWORK PRIVACY" - continue: "Continue" + kicker: "網路隱私" + continue: "繼續" intro: private_money_head: "私密貨幣" private_money_body: "Goblin 是一個 grin 錢包 — 鏈上無金額、無地址的數字現金。" @@ -872,8 +872,8 @@ goblin: key_being_made: "正在生成金鑰…" connected_tor: "已透過 Tor 連線" connecting_tor: "正在透過 Tor 連線…" - connected_direct: "connected (direct)" - connecting_direct: "connecting (direct)…" + connected_direct: "已連線(直連)" + connecting_direct: "正在連線(直連)…" fresh_key_blurb: "一個不屬於助記詞的支付金鑰——可隨時輪換以保護隱私,且不影響你的資金。" restoring: "正在恢復你的身份…" clean_slate_blurb: "想要全新開始?隨時換上一個全新金鑰 — 新的你與舊的毫無關聯。同一個錢包,煥然一新。" diff --git a/src/gui/views/goblin/data.rs b/src/gui/views/goblin/data.rs index 15b0bc79..8efb75b7 100644 --- a/src/gui/views/goblin/data.rs +++ b/src/gui/views/goblin/data.rs @@ -451,6 +451,11 @@ fn news_pool(wallet: &Wallet) -> Vec { /// Traditional readers currently match the same `zh` news as Simplified), /// and every other locale already is a two-letter primary. Region and /// separator (`-`/`_`) are dropped. +/// +/// The `zh-TW` -> `zh` fold is intentional, not a bug: Traditional-script +/// readers get the same `zh` news feed as Simplified readers (there is no +/// separate Traditional article pipeline). This is an accepted, low-priority +/// gap — building a distinct Traditional news feed is out of scope here. fn news_locale_code() -> String { let loc = rust_i18n::locale().to_string().to_lowercase(); loc.split(['-', '_']).next().unwrap_or("en").to_string() diff --git a/src/lib.rs b/src/lib.rs index e1b090eb..ed8101d2 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -371,6 +371,23 @@ fn setup_i18n() { // sys_locale may hand back either `zh-CN` or `zh_CN`; normalize the // separator so a region-specific locale can match its file name. let normalized = locale.replace('_', "-"); + // The OS may also report Chinese by script/region subtag instead of the + // exact file names we ship (`zh-CN`, `zh-TW`): `zh-Hans`/`zh-Hans-CN` for + // Simplified, and `zh-Hant`/`zh-Hant-TW`/`zh-Hant-HK`/`zh-HK` for + // Traditional (Hong Kong has no locale file of its own but uses + // Traditional characters, same as Taiwan). Fold those onto our two + // Chinese locale files before the exact/primary-subtag match below, so + // e.g. a Hong Kong or generic `zh-Hant` system lands on Traditional + // instead of falling through to the default locale. + let lower = normalized.to_lowercase(); + let normalized = if lower == "zh-hant" || lower == "zh-hk" || lower.starts_with("zh-hant-") + { + String::from("zh-TW") + } else if lower == "zh-hans" || lower.starts_with("zh-hans-") { + String::from("zh-CN") + } else { + normalized + }; let available = rust_i18n::available_locales!(); // Prefer an exact region match (e.g. `zh-CN`, the only CJK locale and one // the bare-subtag fallback could never reach), then the language subtag