Aceleniz varsa ARB dosyalarınızı doğrudan tarayıcınızda kontrol edin. Araç ücretsizdir, kayıt istemez ve hiçbir şey yüklemez.
Kısa hatırlatma: ARB dosyalarının yapısı
flutter gen-l10n ile her dilin kendi dosyası vardır (app_en.arb, app_fr.arb…). l10n.yaml içindeki template-arb-file ile belirlenen şablon dosyası referanstır: tüm anahtarları ve bunların @key meta verilerini (açıklama, placeholder'lar) içerir.
{
"cartCount": "{count, plural, =0{Empty cart} =1{1 item} other{{count} items}}",
"@cartCount": {
"placeholders": { "count": { "type": "int" } }
}
}
1. Çevrilmemiş mesajları Flutter listelesin
l10n.yaml dosyasına untranslated-messages-file seçeneğini ekleyin:
arb-dir: lib/l10n
template-arb-file: app_en.arb
untranslated-messages-file: untranslated.json
Her üretimde Flutter, her dilde eksik olan şablon anahtarlarını bu dosyaya yazar. Kurulması en kolay kontrol budur; yayınlamadan önce dosyanın boş olduğundan (ya da yalnızca {} içerdiğinden) emin olun.
2. Anahtarları küçük bir Dart script'iyle karşılaştırın
Sorun olduğunda CI'ı açıkça durduran bir kontrol için kısa bir script yeterli:
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();
@ ile başlayan anahtarlar meta veridir, bu yüzden karşılaştırmanın dışında tutulur.
3. Placeholder'ları kontrol edin
Her yerde bulunan bir anahtar yine de bozulabilir: Fransızca çeviri {nombre} kullanırken şablon {count} tanımlıyorsa, gen-l10n nombre'yi tüm locale'lere fazladan bir parametre olarak ekler ve mevcut çağrılar derlenmez olur. Öte yandan bir placeholder'ı atlayan çeviri hiçbir uyarı vermeden geçer (ayrıntılar ICU çoğulları ve placeholder'lar rehberinde). Her anahtar için süslü parantez içindeki adları @key.placeholders içinde tanımlananlarla karşılaştırın. ICU mesajlarına (plural, select) dikkat edin: other gibi anahtar sözcükler placeholder değildir.
4. Boş değerlere de dikkat edin
Bazı çeviri süreçleri, anahtarı çevrilene kadar boş bir değerle oluşturur. Bu durum "eksik" olarak görünmez; bu yüzden şablon dışındaki tüm dillerde boş metinleri işaretleyen bir kontrol ekleyin.
Sürüm öncesi kontrol listesi
- Çevrilmemiş mesajlar dosyası boş.
- Her dilde şablondakiyle aynı anahtarlar var.
- Placeholder'lar anahtar anahtar eşleşiyor.
- Şablon dışında boş değer yok.
- Uzun mesajlar en uzun metin üreten dillerde (örneğin Almanca) ekranda kontrol edildi.