From d564471825f229e235c944d178bce0e086e0ba5b Mon Sep 17 00:00:00 2001 From: Matt Hill Date: Wed, 20 Aug 2025 11:45:17 -0600 Subject: [PATCH] more translations --- .../shared/src/i18n/dictionaries/de.ts | 51 +++ .../shared/src/i18n/dictionaries/en.ts | 51 +++ .../shared/src/i18n/dictionaries/es.ts | 51 +++ .../shared/src/i18n/dictionaries/fr.ts | 51 +++ .../shared/src/i18n/dictionaries/pl.ts | 51 +++ web/projects/shared/src/i18n/i18n.pipe.ts | 8 +- .../app/components/refresh-alert.component.ts | 30 +- .../interfaces/interface.component.ts | 2 - .../interfaces/interface.service.ts | 333 ++++++++++-------- .../interfaces/private-domains.component.ts | 7 +- .../public-domains/dns.component.ts | 13 +- .../interfaces/public-domains/pd.service.ts | 36 +- .../routes/authorities/authority.service.ts | 4 +- .../routes/gateways/gateways.component.ts | 132 +++---- .../system/routes/gateways/item.component.ts | 3 +- .../routes/system/routes/ssh/ssh.component.ts | 34 +- 16 files changed, 576 insertions(+), 281 deletions(-) diff --git a/web/projects/shared/src/i18n/dictionaries/de.ts b/web/projects/shared/src/i18n/dictionaries/de.ts index 176b41133..a898289ee 100644 --- a/web/projects/shared/src/i18n/dictionaries/de.ts +++ b/web/projects/shared/src/i18n/dictionaries/de.ts @@ -524,4 +524,55 @@ export default { 557: 'Keine privaten Domains', 558: 'Neue private Domain', 559: 'DNS-Server', + 560: 'Geben Sie einen vollständig qualifizierten Domainnamen ein. Da die Domain für private Zwecke verwendet wird, kann es jede gewünschte Domain sein, auch eine, die Sie nicht kontrollieren.', + 561: 'Geben Sie einen vollständig qualifizierten Domainnamen ein. Wenn Sie beispielsweise domain.com kontrollieren, könnten Sie domain.com oder subdomain.domain.com oder another.subdomain.domain.com eingeben.', + 562: 'DNS-Einträge', + 563: 'Erstellen Sie einen der unten aufgeführten DNS-Einträge.', + 564: 'Kein DNS-Eintrag erkannt für', + 565: 'Ungültiger DNS-Eintrag', + 566: 'löst auf in', + 567: 'DNS-Eintrag erkannt!', + 568: 'Wählen Sie ein Gateway für diese Domain aus.', + 569: 'Wählen Sie eine Zertifizierungsstelle aus, um SSL/TLS-Zertifikate für diese Domain auszustellen.', + 570: 'Andere', + 571: 'Ein Name zur einfachen Identifizierung des Gateways', + 572: 'Wählen Sie diese Option, wenn das Gateway für den privaten Zugriff nur für autorisierte Clients konfiguriert ist. StartTunnel ist ein privates Gateway.', + 573: 'Wählen Sie diese Option, wenn das Gateway für uneingeschränkten öffentlichen Zugriff konfiguriert ist.', + 574: 'Datei', + 575: 'Wireguard-Konfigurationsdatei', + 576: 'Kopieren/Einfügen', + 577: 'Dateiinhalt', + 578: 'Öffentlicher Schlüssel', + 579: 'muss ein gültiger SSH-Öffentlicher Schlüssel sein', + 580: 'Aktualisierung erforderlich', + 581: 'Ihre Benutzeroberfläche ist zwischengespeichert und veraltet. Versuchen Sie, die PWA mit der Schaltfläche unten neu zu laden. Wenn Sie diese Nachricht weiterhin sehen, deinstallieren und installieren Sie die PWA erneut.', + 582: 'Ihre Benutzeroberfläche ist zwischengespeichert und veraltet. Führen Sie einen Hard-Refresh der Seite durch, um die neueste Benutzeroberfläche zu erhalten.', + 583: 'Erfordert Vertrauen in die Root-CA Ihres Servers', + 584: 'Verbindungen können manchmal langsam oder unzuverlässig sein', + 585: 'Öffentlich, wenn Sie die Adresse öffentlich teilen, andernfalls privat', + 586: 'Erfordert ein Tor-fähiges Gerät oder einen Browser', + 587: 'Nur nützlich für Clients, die HTTPS erzwingen', + 588: 'Ideal für anonyme, zensurresistente Bereitstellung und Fernzugriff', + 589: 'Ideal für lokalen Zugriff', + 590: 'Erfordert die Verbindung mit demselben lokalen Netzwerk (LAN) wie Ihr Server, entweder physisch oder über VPN', + 591: 'Erfordert die Einstellung einer statischen IP-Adresse für', + 592: 'Ideal für VPN-Zugriff über', + 593: 'in Ihrem Gateway', + 594: 'der Wireguard-Server Ihres Routers', + 595: 'Erfordert Portweiterleitung im Gateway', + 596: 'Erfordert einen DNS-Eintrag für', + 597: 'der sich auflöst zu', + 598: 'Nicht empfohlen für VPN-Zugriff. VPNs unterstützen keine „.local“-Domains ohne erweiterte Konfiguration', + 599: 'Kann für Clearnet-Zugriff verwendet werden', + 600: 'In den meisten Fällen nicht empfohlen. Clearnet-Domains werden bevorzugt', + 601: 'Lokal', + 602: 'Kann für lokalen Zugriff verwendet werden', + 603: 'Ideal für öffentlichen Zugriff über das Internet', + 604: 'Kann für persönlichen Zugriff über das öffentliche Internet verwendet werden. VPN ist privater und sicherer', + 605: 'wenn die Verwendung von IP-Adressen und Ports unerwünscht ist', + 606: 'Host', + 607: 'Wert', + 608: 'Zweck', + 609: 'Subdomains von', + 610: 'Dynamisches DNS', } satisfies i18n diff --git a/web/projects/shared/src/i18n/dictionaries/en.ts b/web/projects/shared/src/i18n/dictionaries/en.ts index f716e7e82..0a40276d8 100644 --- a/web/projects/shared/src/i18n/dictionaries/en.ts +++ b/web/projects/shared/src/i18n/dictionaries/en.ts @@ -523,4 +523,55 @@ export const ENGLISH = { 'No private domains': 557, 'New private domain': 558, 'DNS Servers': 559, + 'Enter a fully qualified domain name. Since the domain is for private use, it can be any domain you want, even one you do not control.': 560, + 'Enter a fully qualified domain name. For example, if you control domain.com, you could enter domain.com or subdomain.domain.com or another.subdomain.domain.com.': 561, + 'DNS Records': 562, + 'Create one of the DNS records below.': 563, + 'No DNS record detected for': 564, // this is a partial sentence. A domain name will be added after "for" to complete the sentence. + 'Invalid DNS record': 565, + 'resolves to': 566, // as in "domain.com 'resolves to' [IP address]" + 'DNS record detected!': 567, + 'Select a gateway to use for this domain.': 568, + 'Select a Certificate Authority to issue SSL/TLS certificates for this domain': 569, + 'Other': 570, // as in, a list option to indicate none of the options listed + 'A name to easily identify the gateway': 571, + 'select this option if the gateway is configured for private access to authorized clients only. StartTunnel is a private gateway.': 572, + 'select this option if the gateway is configured for unfettered public access.': 573, + 'File': 574, // as in, a computer file + 'Wireguard Config File': 575, + 'Copy/Paste': 576, + 'File Contents': 577, + 'Public Key': 578, // as in, a cryptographic public key + 'must be a valid SSH public key': 579, + 'Refresh Needed': 580, + 'Your user interface is cached and out of date. Attempt to reload the PWA using the button below. If you continue to see this message, uninstall and reinstall the PWA.': 581, + 'Your user interface is cached and out of date. Hard refresh the page to get the latest UI.': 582, + "Requires trusting your server's Root CA": 583, + 'Connections can be slow or unreliable at times': 584, + 'Public if you share the address publicly, otherwise private': 585, + 'Requires using a Tor-enabled device or browser': 586, + 'Only useful for clients that enforce HTTPS': 587, + 'Ideal for anonymous, censorship-resistant hosting and remote access': 588, + 'Ideal for local access': 589, + 'Requires being connected to the same Local Area Network (LAN) as your server, either physically or via VPN': 590, + 'Requires setting a static IP address for': 591, // this is a partial sentence. An IP address will be added after "for" to complete the sentence. + 'Ideal for VPN access via': 592, // this is a partial sentence. A connection medium will be added after "via" to complete the sentence. + 'in your gateway': 593, // this is a partial sentence. It is preceded by an instruction: e.g. "do something" in your gateway. Gateway refers to a router or VPN server. + "your router's Wireguard server": 594, // this is a partial sentence. It is preceded by "ideal for access via" + 'Requires port forwarding in gateway': 595, + 'Requires a DNS record for': 596, // this is a partial sentence. A domain name will be added after "for" to complete the sentence. + 'that resolves to': 597, // this is a partial sentence. It is preceded by "requires a DNS record for [domain] " + 'Not recommended for VPN access. VPNs do not support ".local" domains without advanced configuration': 598, + 'Can be used for clearnet access': 599, + 'Not recommended in most cases. Clearnet domains are preferred': 600, + 'Local': 601, // as in, not remote + 'Can be used for local access': 602, + 'Ideal for public access via the Internet': 603, + 'Can be used for personal access via the public Internet. VPN is more private and secure': 604, + 'when using IP addresses and ports is undesirable': 605, // this is a partial sentence. It is preceded by "Good for connections " + 'Host': 606, // as in, a network host + 'Value': 607, // as in, the value in a column of a table + 'Purpose': 608, // as in, the reason for a thing to exist + 'subdomains of': 609, // this is a partial sentence. A domain name will be added after "of" to complete the sentence. + 'Dynamic DNS': 610, } as const diff --git a/web/projects/shared/src/i18n/dictionaries/es.ts b/web/projects/shared/src/i18n/dictionaries/es.ts index 812f8d350..0d74d9aad 100644 --- a/web/projects/shared/src/i18n/dictionaries/es.ts +++ b/web/projects/shared/src/i18n/dictionaries/es.ts @@ -524,4 +524,55 @@ export default { 557: 'Sin dominios privados', 558: 'Nuevo dominio privado', 559: 'Servidores DNS', + 560: 'Introduce un nombre de dominio completo. Dado que el dominio es para uso privado, puede ser cualquier dominio que desees, incluso uno que no controles.', + 561: 'Introduce un nombre de dominio completo. Por ejemplo, si controlas domain.com, podrías introducir domain.com o subdomain.domain.com o another.subdomain.domain.com.', + 562: 'Registros DNS', + 563: 'Crea uno de los registros DNS a continuación.', + 564: 'No se detectó ningún registro DNS para', + 565: 'Registro DNS inválido', + 566: 'se resuelve en', + 567: '¡Registro DNS detectado!', + 568: 'Selecciona una puerta de enlace para usar con este dominio.', + 569: 'Selecciona una Autoridad Certificadora para emitir certificados SSL/TLS para este dominio.', + 570: 'Otro', + 571: 'Un nombre para identificar fácilmente la puerta de enlace', + 572: 'Selecciona esta opción si la puerta de enlace está configurada para acceso privado solo a clientes autorizados. StartTunnel es una puerta de enlace privada.', + 573: 'Selecciona esta opción si la puerta de enlace está configurada para acceso público sin restricciones.', + 574: 'Archivo', + 575: 'Archivo de configuración de Wireguard', + 576: 'Copiar/Pegar', + 577: 'Contenido del archivo', + 578: 'Clave pública', + 579: 'debe ser una clave pública SSH válida', + 580: 'Actualización necesaria', + 581: 'Tu interfaz de usuario está en caché y desactualizada. Intenta recargar la PWA usando el botón de abajo. Si sigues viendo este mensaje, desinstala y vuelve a instalar la PWA.', + 582: 'Tu interfaz de usuario está en caché y desactualizada. Haz un hard refresh de la página para obtener la última interfaz.', + 583: 'Requiere confiar en la CA raíz de tu servidor', + 584: 'Las conexiones pueden ser lentas o poco confiables a veces', + 585: 'Público si compartes la dirección públicamente, de lo contrario privado', + 586: 'Requiere un dispositivo o navegador habilitado para Tor', + 587: 'Solo útil para clientes que imponen HTTPS', + 588: 'Ideal para alojamiento y acceso remoto anónimo y resistente a la censura', + 589: 'Ideal para acceso local', + 590: 'Requiere estar conectado a la misma red de área local (LAN) que tu servidor, ya sea físicamente o mediante VPN', + 591: 'Requiere configurar una dirección IP estática para', + 592: 'Ideal para acceso VPN a través de', + 593: 'en tu gateway', + 594: 'el servidor Wireguard de tu router', + 595: 'Requiere reenvío de puertos en el gateway', + 596: 'Requiere un registro DNS para', + 597: 'que se resuelva en', + 598: 'No recomendado para acceso VPN. Las VPN no admiten dominios “.local” sin configuración avanzada', + 599: 'Se puede usar para acceso a clearnet', + 600: 'No recomendado en la mayoría de los casos. Se prefieren los dominios de clearnet', + 601: 'Local', + 602: 'Se puede usar para acceso local', + 603: 'Ideal para acceso público a través de Internet', + 604: 'Se puede usar para acceso personal a través de Internet público. VPN es más privado y seguro', + 605: 'cuando el uso de direcciones IP y puertos no es deseable', + 606: 'Host', + 607: 'Valor', + 608: 'Propósito', + 609: 'Subdominios de', + 610: 'DNS dinámico', } satisfies i18n diff --git a/web/projects/shared/src/i18n/dictionaries/fr.ts b/web/projects/shared/src/i18n/dictionaries/fr.ts index 8cf164835..5886b99cf 100644 --- a/web/projects/shared/src/i18n/dictionaries/fr.ts +++ b/web/projects/shared/src/i18n/dictionaries/fr.ts @@ -524,4 +524,55 @@ export default { 557: 'Aucun domaine privé', 558: 'Nouveau domaine privé', 559: 'Serveurs DNS', + 560: 'Entrez un nom de domaine complet. Comme le domaine est destiné à un usage privé, il peut s’agir de n’importe quel domaine, même d’un domaine que vous ne contrôlez pas.', + 561: 'Entrez un nom de domaine complet. Par exemple, si vous contrôlez domain.com, vous pourriez entrer domain.com, subdomain.domain.com ou another.subdomain.domain.com.', + 562: 'Enregistrements DNS', + 563: 'Créez l’un des enregistrements DNS ci-dessous.', + 564: 'Aucun enregistrement DNS détecté pour', + 565: 'Enregistrement DNS invalide', + 566: 'se résout en', + 567: 'Enregistrement DNS détecté !', + 568: 'Sélectionnez une passerelle à utiliser pour ce domaine.', + 569: 'Sélectionnez une Autorité de Certification pour émettre des certificats SSL/TLS pour ce domaine.', + 570: 'Autre', + 571: 'Un nom pour identifier facilement la passerelle', + 572: 'Sélectionnez cette option si la passerelle est configurée pour un accès privé uniquement aux clients autorisés. StartTunnel est une passerelle privée.', + 573: 'Sélectionnez cette option si la passerelle est configurée pour un accès public illimité.', + 574: 'Fichier', + 575: 'Fichier de configuration Wireguard', + 576: 'Copier/Coller', + 577: 'Contenu du fichier', + 578: 'Clé publique', + 579: 'doit être une clé publique SSH valide', + 580: 'Actualisation nécessaire', + 581: 'Votre interface utilisateur est mise en cache et obsolète. Essayez de recharger le PWA à l’aide du bouton ci-dessous. Si vous continuez à voir ce message, désinstallez puis réinstallez le PWA.', + 582: 'Votre interface utilisateur est mise en cache et obsolète. Faites un rafraîchissement forcé de la page pour obtenir la dernière interface.', + 583: 'Nécessite de faire confiance à l’autorité de certification racine de votre serveur', + 584: 'Les connexions peuvent parfois être lentes ou peu fiables', + 585: 'Public si vous partagez l’adresse publiquement, sinon privé', + 586: 'Nécessite un appareil ou un navigateur compatible Tor', + 587: 'Utile uniquement pour les clients qui imposent HTTPS', + 588: 'Idéal pour l’hébergement et l’accès à distance anonymes et résistants à la censure', + 589: 'Idéal pour un accès local', + 590: 'Nécessite d’être connecté au même réseau local (LAN) que votre serveur, soit physiquement, soit via VPN', + 591: 'Nécessite de définir une adresse IP statique pour', + 592: 'Idéal pour un accès VPN via', + 593: 'dans votre passerelle', + 594: 'le serveur Wireguard de votre routeur', + 595: 'Nécessite un transfert de port dans la passerelle', + 596: 'Nécessite un enregistrement DNS pour', + 597: 'qui se résout en', + 598: 'Non recommandé pour l’accès VPN. Les VPN ne prennent pas en charge les domaines « .local » sans configuration avancée', + 599: 'Peut être utilisé pour un accès clearnet', + 600: 'Non recommandé dans la plupart des cas. Les domaines clearnet sont préférés', + 601: 'Local', + 602: 'Peut être utilisé pour un accès local', + 603: 'Idéal pour un accès public via Internet', + 604: 'Peut être utilisé pour un accès personnel via Internet public. Le VPN est plus privé et sécurisé', + 605: 'lorsque l’utilisation des adresses IP et des ports est indésirable', + 606: 'Hôte', + 607: 'Valeur', + 608: 'But', + 609: 'Sous-domaines de', + 610: 'DNS dynamique', } satisfies i18n diff --git a/web/projects/shared/src/i18n/dictionaries/pl.ts b/web/projects/shared/src/i18n/dictionaries/pl.ts index 609a7d92e..fe1d4f536 100644 --- a/web/projects/shared/src/i18n/dictionaries/pl.ts +++ b/web/projects/shared/src/i18n/dictionaries/pl.ts @@ -524,4 +524,55 @@ export default { 557: 'Brak domen prywatnych', 558: 'Nowa domena prywatna', 559: 'Serwery DNS', + 560: 'Wprowadź w pełni kwalifikowaną nazwę domeny. Ponieważ domena jest przeznaczona do użytku prywatnego, może to być dowolna domena, nawet taka, której nie kontrolujesz.', + 561: 'Wprowadź w pełni kwalifikowaną nazwę domeny. Na przykład, jeśli kontrolujesz domain.com, możesz wprowadzić domain.com, subdomain.domain.com lub another.subdomain.domain.com.', + 562: 'Rekordy DNS', + 563: 'Utwórz jeden z poniższych rekordów DNS.', + 564: 'Nie wykryto rekordu DNS dla', + 565: 'Nieprawidłowy rekord DNS', + 566: 'rozwiązuje się na', + 567: 'Wykryto rekord DNS!', + 568: 'Wybierz bramę do użycia dla tej domeny.', + 569: 'Wybierz Urząd Certyfikacji, aby wystawić certyfikaty SSL/TLS dla tej domeny.', + 570: 'Inne', + 571: 'Nazwa ułatwiająca identyfikację bramy', + 572: 'Wybierz tę opcję, jeśli brama jest skonfigurowana do prywatnego dostępu tylko dla autoryzowanych klientów. StartTunnel to prywatna brama.', + 573: 'Wybierz tę opcję, jeśli brama jest skonfigurowana do nieograniczonego publicznego dostępu.', + 574: 'Plik', + 575: 'Plik konfiguracyjny Wireguard', + 576: 'Kopiuj/Wklej', + 577: 'Zawartość pliku', + 578: 'Klucz publiczny', + 579: 'musi być prawidłowym kluczem publicznym SSH', + 580: 'Wymagane odświeżenie', + 581: 'Twój interfejs użytkownika jest w pamięci podręcznej i jest nieaktualny. Spróbuj ponownie załadować PWA za pomocą przycisku poniżej. Jeśli nadal widzisz ten komunikat, odinstaluj i ponownie zainstaluj PWA.', + 582: 'Twój interfejs użytkownika jest w pamięci podręcznej i jest nieaktualny. Wykonaj twarde odświeżenie strony, aby uzyskać najnowszy interfejs.', + 583: 'Wymaga zaufania do głównego CA twojego serwera', + 584: 'Połączenia mogą być czasami wolne lub niestabilne', + 585: 'Publiczne, jeśli udostępniasz adres publicznie, w przeciwnym razie prywatne', + 586: 'Wymaga urządzenia lub przeglądarki obsługującej Tor', + 587: 'Przydatne tylko dla klientów wymuszających HTTPS', + 588: 'Idealne do anonimowego, odpornego na cenzurę hostingu i zdalnego dostępu', + 589: 'Idealne do dostępu lokalnego', + 590: 'Wymaga połączenia z tą samą siecią lokalną (LAN) co serwer, fizycznie lub przez VPN', + 591: 'Wymaga ustawienia statycznego adresu IP dla', + 592: 'Idealne do dostępu VPN przez', + 593: 'w twojej bramie', + 594: 'serwer Wireguard twojego routera', + 595: 'Wymaga przekierowania portów w bramie', + 596: 'Wymaga rekordu DNS dla', + 597: 'który rozwiązuje się na', + 598: 'Niezalecane do dostępu VPN. VPN-y nie obsługują domen „.local” bez zaawansowanej konfiguracji', + 599: 'Może być używane do dostępu do clearnet', + 600: 'Niezalecane w większości przypadków. Preferowane są domeny clearnet', + 601: 'Lokalne', + 602: 'Może być używane do dostępu lokalnego', + 603: 'Idealne do publicznego dostępu przez Internet', + 604: 'Może być używane do osobistego dostępu przez publiczny Internet. VPN jest bardziej prywatny i bezpieczny', + 605: 'gdy używanie adresów IP i portów jest niepożądane', + 606: 'Host', + 607: 'Wartość', + 608: 'Cel', + 609: 'Subdomeny', + 610: 'Dynamiczny DNS', } satisfies i18n diff --git a/web/projects/shared/src/i18n/i18n.pipe.ts b/web/projects/shared/src/i18n/i18n.pipe.ts index db08c625f..d6e85c6ad 100644 --- a/web/projects/shared/src/i18n/i18n.pipe.ts +++ b/web/projects/shared/src/i18n/i18n.pipe.ts @@ -10,9 +10,9 @@ import { I18N, i18nKey } from './i18n.providers' export class i18nPipe implements PipeTransform { private readonly i18n = inject(I18N) - transform(englishKey: i18nKey | null | undefined): string | undefined { - return englishKey - ? this.i18n()?.[ENGLISH[englishKey as i18nKey]] || englishKey - : undefined + transform(englishKey: i18nKey | null | undefined): string { + englishKey = englishKey || ('' as i18nKey) + + return this.i18n()?.[ENGLISH[englishKey]] || englishKey } } diff --git a/web/projects/ui/src/app/components/refresh-alert.component.ts b/web/projects/ui/src/app/components/refresh-alert.component.ts index 8c9307500..19e824a1a 100644 --- a/web/projects/ui/src/app/components/refresh-alert.component.ts +++ b/web/projects/ui/src/app/components/refresh-alert.component.ts @@ -2,7 +2,7 @@ import { ChangeDetectionStrategy, Component, inject } from '@angular/core' import { toSignal } from '@angular/core/rxjs-interop' import { SwUpdate } from '@angular/service-worker' import { WA_WINDOW } from '@ng-web-apis/common' -import { LoadingService } from '@start9labs/shared' +import { i18nPipe, LoadingService } from '@start9labs/shared' import { Version } from '@start9labs/start-sdk' import { TuiResponsiveDialog } from '@taiga-ui/addon-mobile' import { TuiAutoFocus } from '@taiga-ui/cdk' @@ -12,21 +12,23 @@ import { distinctUntilChanged, map, merge, Subject } from 'rxjs' import { ConfigService } from 'src/app/services/config.service' import { DataModel } from 'src/app/services/patch-db/data-model' -// @TODO translations - @Component({ selector: 'refresh-alert', template: ` @if (isPwa) {

- Your user interface is cached and out of date. Attempt to reload the - PWA using the button below. If you continue to see this message, - uninstall and reinstall the PWA. + {{ + 'Your user interface is cached and out of date. Attempt to reload the PWA using the button below. If you continue to see this message, uninstall and reinstall the PWA.' + | i18n + }}

} @else { - Your user interface is cached and out of date. Hard refresh the page to - get the latest UI. + {{ + 'Your user interface is cached and out of date. Hard refresh the page to get the latest UI.' + | i18n + }}