diff --git a/web/projects/shared/src/i18n/dictionaries/de.ts b/web/projects/shared/src/i18n/dictionaries/de.ts index ed7e01bd2..fee286790 100644 --- a/web/projects/shared/src/i18n/dictionaries/de.ts +++ b/web/projects/shared/src/i18n/dictionaries/de.ts @@ -654,24 +654,35 @@ export default { 714: 'Installation abgeschlossen!', 715: 'StartOS wurde erfolgreich installiert.', 716: 'Weiter zur Einrichtung', - 717: '', - 718: '', - 719: '', - 720: '', - 721: '', - 722: '', - 723: '', - 724: '', - 725: '', - 726: '', - 727: '', - 728: '', - 729: '', - 730: '', - 731: '', - 732: '', - 733: '', - 734: '', - 735: '', - 736: '', + 717: 'Ausgehendes Gateway festlegen', + 718: 'Aktuell', + 719: 'Systemstandard', + 720: 'Ausgehendes Gateway', + 721: 'Gateway für ausgehenden Datenverkehr auswählen', + 722: 'Der Typ des Gateways', + 723: 'Nur ausgehend', + 724: 'Als Standard für ausgehenden Verkehr festlegen', + 725: 'Gesamten ausgehenden Datenverkehr über dieses Gateway leiten', + 726: 'WireGuard-Konfigurationsdatei', + 727: 'Eingehend/Ausgehend', + 728: 'StartTunnel (Eingehend/Ausgehend)', + 729: 'Ethernet', + 730: 'Domain hinzufügen', + 731: 'Öffentliche Domain', + 732: 'Private Domain', + 733: 'Ausblenden', + 734: 'Standard ausgehend', + 735: 'Zertifikat', + 736: 'Selbstsigniert', + 737: 'Portweiterleitung', + 738: 'Domain-Einrichtung', + 739: 'DNS', + 740: 'Anweisungen', + 741: 'In Ihrem Domain-Registrar für', + 742: 'diesen DNS-Eintrag erstellen', + 743: 'In Ihrem Gateway', + 744: 'diese Portweiterleitungsregel erstellen', + 745: 'Externer Port', + 746: 'Interne IP', + 747: 'Interner Port', } satisfies i18n diff --git a/web/projects/shared/src/i18n/dictionaries/es.ts b/web/projects/shared/src/i18n/dictionaries/es.ts index 2c9036894..ba4c446ae 100644 --- a/web/projects/shared/src/i18n/dictionaries/es.ts +++ b/web/projects/shared/src/i18n/dictionaries/es.ts @@ -654,24 +654,35 @@ export default { 714: '¡Instalación completada!', 715: 'StartOS se ha instalado correctamente.', 716: 'Continuar con la configuración', - 717: '', - 718: '', - 719: '', - 720: '', - 721: '', - 722: '', - 723: '', - 724: '', - 725: '', - 726: '', - 727: '', - 728: '', - 729: '', - 730: '', - 731: '', - 732: '', - 733: '', - 734: '', - 735: '', - 736: '', + 717: 'Establecer puerta de enlace saliente', + 718: 'Actual', + 719: 'Predeterminado del sistema', + 720: 'Puerta de enlace saliente', + 721: 'Selecciona la puerta de enlace para el tráfico saliente', + 722: 'El tipo de puerta de enlace', + 723: 'Solo saliente', + 724: 'Establecer como saliente predeterminado', + 725: 'Enrutar todo el tráfico saliente a través de esta puerta de enlace', + 726: 'Archivo de configuración WireGuard', + 727: 'Entrante/Saliente', + 728: 'StartTunnel (Entrante/Saliente)', + 729: 'Ethernet', + 730: 'Agregar dominio', + 731: 'Dominio público', + 732: 'Dominio privado', + 733: 'Ocultar', + 734: 'saliente predeterminado', + 735: 'Certificado', + 736: 'Autofirmado', + 737: 'Reenvío de puertos', + 738: 'Configuración de dominio', + 739: 'DNS', + 740: 'Instrucciones', + 741: 'En su registrador de dominios para', + 742: 'cree este registro DNS', + 743: 'En su puerta de enlace', + 744: 'cree esta regla de reenvío de puertos', + 745: 'Puerto externo', + 746: 'IP interna', + 747: 'Puerto interno', } satisfies i18n diff --git a/web/projects/shared/src/i18n/dictionaries/fr.ts b/web/projects/shared/src/i18n/dictionaries/fr.ts index 3e9e6cf8b..d62742233 100644 --- a/web/projects/shared/src/i18n/dictionaries/fr.ts +++ b/web/projects/shared/src/i18n/dictionaries/fr.ts @@ -654,24 +654,35 @@ export default { 714: 'Installation terminée !', 715: 'StartOS a été installé avec succès.', 716: 'Continuer vers la configuration', - 717: '', - 718: '', - 719: '', - 720: '', - 721: '', - 722: '', - 723: '', - 724: '', - 725: '', - 726: '', - 727: '', - 728: '', - 729: '', - 730: '', - 731: '', - 732: '', - 733: '', - 734: '', - 735: '', - 736: '', + 717: 'Définir la passerelle sortante', + 718: 'Actuel', + 719: 'Par défaut du système', + 720: 'Passerelle sortante', + 721: 'Sélectionnez la passerelle pour le trafic sortant', + 722: 'Le type de passerelle', + 723: 'Sortant uniquement', + 724: 'Définir comme sortant par défaut', + 725: 'Acheminer tout le trafic sortant via cette passerelle', + 726: 'Fichier de configuration WireGuard', + 727: 'Entrant/Sortant', + 728: 'StartTunnel (Entrant/Sortant)', + 729: 'Ethernet', + 730: 'Ajouter un domaine', + 731: 'Domaine public', + 732: 'Domaine privé', + 733: 'Masquer', + 734: 'sortant par défaut', + 735: 'Certificat', + 736: 'Auto-signé', + 737: 'Redirection de ports', + 738: 'Configuration du domaine', + 739: 'DNS', + 740: 'Instructions', + 741: 'Dans votre registraire de domaine pour', + 742: 'créez cet enregistrement DNS', + 743: 'Dans votre passerelle', + 744: 'créez cette règle de redirection de port', + 745: 'Port externe', + 746: 'IP interne', + 747: 'Port interne', } satisfies i18n diff --git a/web/projects/shared/src/i18n/dictionaries/pl.ts b/web/projects/shared/src/i18n/dictionaries/pl.ts index 43107b420..3679d9c40 100644 --- a/web/projects/shared/src/i18n/dictionaries/pl.ts +++ b/web/projects/shared/src/i18n/dictionaries/pl.ts @@ -654,24 +654,35 @@ export default { 714: 'Instalacja zakończona!', 715: 'StartOS został pomyślnie zainstalowany.', 716: 'Przejdź do konfiguracji', - 717: '', - 718: '', - 719: '', - 720: '', - 721: '', - 722: '', - 723: '', - 724: '', - 725: '', - 726: '', - 727: '', - 728: '', - 729: '', - 730: '', - 731: '', - 732: '', - 733: '', - 734: '', - 735: '', - 736: '', + 717: 'Ustaw bramę wychodzącą', + 718: 'Bieżący', + 719: 'Domyślne systemu', + 720: 'Brama wychodząca', + 721: 'Wybierz bramę dla ruchu wychodzącego', + 722: 'Typ bramy', + 723: 'Tylko wychodzący', + 724: 'Ustaw jako domyślne wychodzące', + 725: 'Kieruj cały ruch wychodzący przez tę bramę', + 726: 'Plik konfiguracyjny WireGuard', + 727: 'Przychodzący/Wychodzący', + 728: 'StartTunnel (Przychodzący/Wychodzący)', + 729: 'Ethernet', + 730: 'Dodaj domenę', + 731: 'Domena publiczna', + 732: 'Domena prywatna', + 733: 'Ukryj', + 734: 'domyślne wychodzące', + 735: 'Certyfikat', + 736: 'Samopodpisany', + 737: 'Przekierowanie portów', + 738: 'Konfiguracja domeny', + 739: 'DNS', + 740: 'Instrukcje', + 741: 'W rejestratorze domeny dla', + 742: 'utwórz ten rekord DNS', + 743: 'W bramie', + 744: 'utwórz tę regułę przekierowania portów', + 745: 'Port zewnętrzny', + 746: 'Wewnętrzny IP', + 747: 'Port wewnętrzny', } satisfies i18n diff --git a/web/scripts/check-i18n.mjs b/web/scripts/check-i18n.mjs index 6868d18d4..4c12d031c 100644 --- a/web/scripts/check-i18n.mjs +++ b/web/scripts/check-i18n.mjs @@ -89,6 +89,43 @@ if (errors.length > 0) { console.error(` ${rel}:${line} "${key}"`) } console.error() +} + +// Check that all numeric keys in en.ts exist in every non-English dictionary +const enNumericKeys = new Set() +for (const match of enSource.matchAll(/^\s+'[^']+?':\s*(\d+)/gm)) { + enNumericKeys.add(Number(match[1])) +} + +const dictDir = join(root, 'projects/shared/src/i18n/dictionaries') +const otherLangs = ['de', 'es', 'fr', 'pl'] +const dictErrors = [] + +for (const lang of otherLangs) { + const dictPath = join(dictDir, `${lang}.ts`) + const dictSource = readFileSync(dictPath, 'utf-8') + const dictKeys = new Set() + + for (const match of dictSource.matchAll(/^\s*(\d+):/gm)) { + dictKeys.add(Number(match[1])) + } + + const missing = [...enNumericKeys].filter(k => !dictKeys.has(k)).sort((a, b) => a - b) + + if (missing.length > 0) { + dictErrors.push({ lang, missing }) + } +} + +if (dictErrors.length > 0) { + console.error(`\nMissing i18n dictionary keys:\n`) + for (const { lang, missing } of dictErrors) { + console.error(` ${lang}.ts is missing keys: ${missing.join(', ')}`) + } + console.error() +} + +if (errors.length > 0 || dictErrors.length > 0) { process.exit(1) } else { console.log('All i18n keys are valid.')