translations

This commit is contained in:
Matt Hill
2026-02-16 00:34:41 -07:00
parent bb68c3b91c
commit 5ba68a3124
5 changed files with 161 additions and 80 deletions

View File

@@ -654,24 +654,35 @@ export default {
714: 'Installation abgeschlossen!', 714: 'Installation abgeschlossen!',
715: 'StartOS wurde erfolgreich installiert.', 715: 'StartOS wurde erfolgreich installiert.',
716: 'Weiter zur Einrichtung', 716: 'Weiter zur Einrichtung',
717: '', 717: 'Ausgehendes Gateway festlegen',
718: '', 718: 'Aktuell',
719: '', 719: 'Systemstandard',
720: '', 720: 'Ausgehendes Gateway',
721: '', 721: 'Gateway für ausgehenden Datenverkehr auswählen',
722: '', 722: 'Der Typ des Gateways',
723: '', 723: 'Nur ausgehend',
724: '', 724: 'Als Standard für ausgehenden Verkehr festlegen',
725: '', 725: 'Gesamten ausgehenden Datenverkehr über dieses Gateway leiten',
726: '', 726: 'WireGuard-Konfigurationsdatei',
727: '', 727: 'Eingehend/Ausgehend',
728: '', 728: 'StartTunnel (Eingehend/Ausgehend)',
729: '', 729: 'Ethernet',
730: '', 730: 'Domain hinzufügen',
731: '', 731: 'Öffentliche Domain',
732: '', 732: 'Private Domain',
733: '', 733: 'Ausblenden',
734: '', 734: 'Standard ausgehend',
735: '', 735: 'Zertifikat',
736: '', 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 } satisfies i18n

View File

@@ -654,24 +654,35 @@ export default {
714: '¡Instalación completada!', 714: '¡Instalación completada!',
715: 'StartOS se ha instalado correctamente.', 715: 'StartOS se ha instalado correctamente.',
716: 'Continuar con la configuración', 716: 'Continuar con la configuración',
717: '', 717: 'Establecer puerta de enlace saliente',
718: '', 718: 'Actual',
719: '', 719: 'Predeterminado del sistema',
720: '', 720: 'Puerta de enlace saliente',
721: '', 721: 'Selecciona la puerta de enlace para el tráfico saliente',
722: '', 722: 'El tipo de puerta de enlace',
723: '', 723: 'Solo saliente',
724: '', 724: 'Establecer como saliente predeterminado',
725: '', 725: 'Enrutar todo el tráfico saliente a través de esta puerta de enlace',
726: '', 726: 'Archivo de configuración WireGuard',
727: '', 727: 'Entrante/Saliente',
728: '', 728: 'StartTunnel (Entrante/Saliente)',
729: '', 729: 'Ethernet',
730: '', 730: 'Agregar dominio',
731: '', 731: 'Dominio público',
732: '', 732: 'Dominio privado',
733: '', 733: 'Ocultar',
734: '', 734: 'saliente predeterminado',
735: '', 735: 'Certificado',
736: '', 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 } satisfies i18n

View File

@@ -654,24 +654,35 @@ export default {
714: 'Installation terminée !', 714: 'Installation terminée !',
715: 'StartOS a été installé avec succès.', 715: 'StartOS a été installé avec succès.',
716: 'Continuer vers la configuration', 716: 'Continuer vers la configuration',
717: '', 717: 'Définir la passerelle sortante',
718: '', 718: 'Actuel',
719: '', 719: 'Par défaut du système',
720: '', 720: 'Passerelle sortante',
721: '', 721: 'Sélectionnez la passerelle pour le trafic sortant',
722: '', 722: 'Le type de passerelle',
723: '', 723: 'Sortant uniquement',
724: '', 724: 'Définir comme sortant par défaut',
725: '', 725: 'Acheminer tout le trafic sortant via cette passerelle',
726: '', 726: 'Fichier de configuration WireGuard',
727: '', 727: 'Entrant/Sortant',
728: '', 728: 'StartTunnel (Entrant/Sortant)',
729: '', 729: 'Ethernet',
730: '', 730: 'Ajouter un domaine',
731: '', 731: 'Domaine public',
732: '', 732: 'Domaine privé',
733: '', 733: 'Masquer',
734: '', 734: 'sortant par défaut',
735: '', 735: 'Certificat',
736: '', 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 } satisfies i18n

View File

@@ -654,24 +654,35 @@ export default {
714: 'Instalacja zakończona!', 714: 'Instalacja zakończona!',
715: 'StartOS został pomyślnie zainstalowany.', 715: 'StartOS został pomyślnie zainstalowany.',
716: 'Przejdź do konfiguracji', 716: 'Przejdź do konfiguracji',
717: '', 717: 'Ustaw bramę wychodzącą',
718: '', 718: 'Bieżący',
719: '', 719: 'Domyślne systemu',
720: '', 720: 'Brama wychodząca',
721: '', 721: 'Wybierz bramę dla ruchu wychodzącego',
722: '', 722: 'Typ bramy',
723: '', 723: 'Tylko wychodzący',
724: '', 724: 'Ustaw jako domyślne wychodzące',
725: '', 725: 'Kieruj cały ruch wychodzący przez tę bramę',
726: '', 726: 'Plik konfiguracyjny WireGuard',
727: '', 727: 'Przychodzący/Wychodzący',
728: '', 728: 'StartTunnel (Przychodzący/Wychodzący)',
729: '', 729: 'Ethernet',
730: '', 730: 'Dodaj domenę',
731: '', 731: 'Domena publiczna',
732: '', 732: 'Domena prywatna',
733: '', 733: 'Ukryj',
734: '', 734: 'domyślne wychodzące',
735: '', 735: 'Certyfikat',
736: '', 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 } satisfies i18n

View File

@@ -89,6 +89,43 @@ if (errors.length > 0) {
console.error(` ${rel}:${line} "${key}"`) console.error(` ${rel}:${line} "${key}"`)
} }
console.error() 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) process.exit(1)
} else { } else {
console.log('All i18n keys are valid.') console.log('All i18n keys are valid.')