Fehlende Schlüssel in den ARB-Dateien einer Flutter-App finden

Aktualisiert am · LocalePilot

Ein auf Englisch hinzugefügter und auf Deutsch vergessener Schlüssel, ein nur in einer Sprache umbenannter Platzhalter: Diese Fehler kompilieren problemlos und landen bei Ihren Nutzern. So finden Sie sie vor dem Release.

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).

Häufige Fragen

Meldet Flutter fehlende Übersetzungen?

Ja, wenn Sie untranslated-messages-file in l10n.yaml eintragen: flutter gen-l10n listet dort die Template-Schlüssel auf, die in jeder Sprache fehlen. Ohne diese Option erhalten Sie nur eine zusammenfassende Warnung.

Muss ich die @key-Metadaten in jede Sprache kopieren?

Nein. Metadaten (Beschreibung, Platzhalter) werden aus der Template-Datei gelesen; die anderen Dateien brauchen nur die Übersetzungen.

Wie vermeide ich falsch benannte Platzhalter?

Vergleichen Sie für jeden Schlüssel die Namen in geschweiften Klammern in der Übersetzung mit denen im Template, und lassen Sie die CI bei einer Abweichung fehlschlagen.