Bir Flutter uygulamasının ARB dosyalarında eksik anahtarları bulmak

Güncelleme: · LocalePilot

İngilizcede eklenip Almancada unutulan bir anahtar, tek bir dilde yeniden adlandırılmış bir placeholder: bu hatalar derlemeyi durdurmaz ve doğrudan kullanıcılarınızın karşısına çıkar. Bunları sürümden önce nasıl yakalayacağınızı anlatıyoruz.

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.

Sık sorulan sorular

Flutter eksik çevirileri bildirir mi?

Evet, l10n.yaml dosyasına untranslated-messages-file eklerseniz: flutter gen-l10n her dilde eksik olan şablon anahtarlarını bu dosyaya yazar. Bu seçenek olmadan yalnızca özet bir uyarı görürsünüz.

@key meta verilerini her dile kopyalamam gerekir mi?

Hayır. Meta veriler (açıklama, placeholder'lar) şablon dosyasından okunur; diğer dosyalarda yalnızca çeviriler gerekir.

Yanlış adlandırılmış placeholder'lardan nasıl kaçınırım?

Her anahtar için çevirideki süslü parantez içindeki adları şablonda tanımlananlarla karşılaştırın ve fark varsa CI adımının başarısız olmasını sağlayın.