Wenn es schnell gehen soll: Prüfen Sie Ihre ARB-Dateien direkt im Browser, kostenlos, ohne Anmeldung und ohne Upload.
Kurz zur Erinnerung: So sind ARB-Dateien aufgebaut
Mit flutter gen-l10n hat jede Sprache ihre eigene Datei (app_en.arb, app_de.arb…). Die Template-Datei, festgelegt durch template-arb-file in l10n.yaml, ist die Referenz: Sie enthält jeden Schlüssel und seine @key-Metadaten (Beschreibung, Platzhalter).
{
"cartCount": "{count, plural, =0{Empty cart} =1{1 item} other{{count} items}}",
"@cartCount": {
"placeholders": { "count": { "type": "int" } }
}
}
1. Flutter die unübersetzten Nachrichten auflisten lassen
Fügen Sie die Option untranslated-messages-file in l10n.yaml hinzu:
arb-dir: lib/l10n
template-arb-file: app_en.arb
untranslated-messages-file: untranslated.json
Bei jeder Generierung schreibt Flutter die Template-Schlüssel, die in jeder Sprache fehlen, in diese Datei. Diese Prüfung ist am einfachsten einzurichten; achten Sie darauf, dass die Datei leer ist (oder nur {} enthält), bevor Sie veröffentlichen.
2. Schlüssel mit einem kleinen Dart-Skript vergleichen
Für eine CI-Prüfung, die klar fehlschlägt, genügt ein Skript:
import 'dart:convert';
import 'dart:io';
void main() {
final dir = Directory('lib/l10n');
final template = _keys(File('lib/l10n/app_en.arb'));
var failed = false;
for (final file in dir.listSync().whereType<File>()) {
if (!file.path.endsWith('.arb')) continue;
final missing = template.difference(_keys(file));
if (missing.isNotEmpty) {
failed = true;
print('${file.path}: ${missing.join(', ')}');
}
}
if (failed) exit(1);
}
Set<String> _keys(File f) => (jsonDecode(f.readAsStringSync()) as Map<String, dynamic>)
.keys
.where((k) => !k.startsWith('@'))
.toSet();
Schlüssel, die mit @ beginnen, sind Metadaten und werden daher vom Vergleich ausgenommen.
3. Platzhalter prüfen
Auch ein überall vorhandener Schlüssel kann kaputtgehen: Verwendet die deutsche Übersetzung {anzahl}, während das Template {count} deklariert, fügt gen-l10n anzahl in jeder Locale als zusätzlichen Parameter hinzu, und bestehende Aufrufe kompilieren nicht mehr. Umgekehrt geht eine Übersetzung, die einen Platzhalter einfach weglässt, ohne jede Warnung durch (Details in der Anleitung zu ICU-Pluralformen und Platzhaltern). Vergleichen Sie für jeden Schlüssel die Namen in geschweiften Klammern mit denen in @key.placeholders. Vorsicht bei ICU-Nachrichten (plural, select): Schlüsselwörter wie other sind keine Platzhalter.
4. Auch auf leere Werte achten
Manche Übersetzungs-Pipelines legen den Schlüssel mit leerem Wert an, bis er übersetzt ist. Er taucht dann nicht als „fehlend“ auf; ergänzen Sie also eine Prüfung, die leere Strings in allen Sprachen außer dem Template meldet.
Checkliste vor dem Release
- Die Datei mit unübersetzten Nachrichten ist leer.
- Jede Sprache hat dieselben Schlüssel wie das Template.
- Die Platzhalter stimmen Schlüssel für Schlüssel überein.
- Keine leeren Werte außerhalb des Templates.
- Lange Nachrichten wurden in den wortreichsten Sprachen auf dem Bildschirm geprüft (zum Beispiel Deutsch).