Gereksinimler ve Ön Hazırlık
Çoklu dil desteği (i18n - internationalization) projenize başlamadan önce geliştirme ortamınızın güncel olduğundan emin olmalısınız. Flutter 3.x veya üzeri bir sürüm kullanmanız, modern yerelleştirme araçlarıyla tam uyumluluk sağlar.
- Flutter SDK 3.24 veya daha yeni bir sürüm.
- Dart 3.5+ sürümü.
- IDE olarak VS Code veya Android Studio (Flutter eklentileri yüklü).
- Pubspec.yaml dosyasında bağımlılık yönetimi bilgisi.
Projenizi oluşturduktan sonra, yerelleştirme için gerekli olan temel paketleri pubspec.yaml dosyanıza eklemeniz gerekmektedir. Bu paketler, dil dosyalarınızı okumak ve uygulama içinde dinamik olarak değiştirmek için kullanılır.
dependencies:
flutter:
sdk: flutter
flutter_localizations:
sdk: flutter
easy_localization: ^3.0.7
Adım Adım Çoklu Dil Yapılandırması
Yerelleştirme sürecinin ilk adımı, dil dosyalarınızın tutulacağı klasör yapısını oluşturmaktır. Genellikle assets/translations/ dizini altında JSON formatında dosyalar tutulur. Bu dosyalar, uygulamanızdaki metinlerin anahtar-değer (key-value) çiftlerini içerir.
Öncelikle kök dizinde assets/translations klasörünü oluşturun ve içine tr-TR.json ve en-US.json dosyalarını ekleyin. Bu dosyalar, uygulamanızın farklı dillerdeki karşılıklarını tutar.
// assets/translations/en-US.json
{
"title": "Welcome to Flutter",
"msg": "This is a multi-language app."
}
// assets/translations/tr-TR.json
{
"title": "Flutter'a Hoş Geldiniz",
"msg": "Bu çok dilli bir uygulamadır."
}
Dosyaları oluşturduktan sonra pubspec.yaml dosyanızda bu varlıkları tanımlamayı unutmayın. Aksi takdirde Flutter, derleme sırasında bu dosyalara erişemez.
flutter:
assets:
- assets/translations/
Uygulama Seviyesinde Yerelleştirme Entegrasyonu
Tüm uygulama genelinde dil desteğini aktif etmek için main.dart dosyanızda EasyLocalization sarmalayıcısını kullanmanız gerekir. Bu yapı, uygulamanın açılışında seçilen dilin yüklenmesini sağlar ve dil değişikliği yapıldığında tüm widget ağacını günceller.
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await EasyLocalization.ensureInitialized();
runApp(
EasyLocalization(
supportedLocales: [Locale('en', 'US'), Locale('tr', 'TR')],
path: 'assets/translations',
fallbackLocale: Locale('en', 'US'),
child: MyApp(),
),
);
}
Dinamik Metin Yönetimi ve Widget Kullanımı
Uygulama içerisinde metinleri doğrudan yazmak yerine, anahtarları kullanarak çağırmalısınız. Bu, ileride yapılacak bir metin değişikliğinin tüm uygulamada anında güncellenmesini sağlar. tr() metodu, easy_localization paketinin sunduğu en pratik yöntemdir.
Text('title'.tr())
Eğer metin içinde değişkenler kullanmanız gerekiyorsa (örneğin: "Merhaba, [İsim]"), namedArgs özelliğini kullanabilirsiniz. Bu, çeviri dosyalarınızın esnekliğini artırır ve kullanıcı deneyimini iyileştirir.
// JSON içinde
"greet": "Merhaba, {}"
// Kod içinde
Text('greet'.tr(args: ['Ahmet']))
Yerelleştirme Yöntemleri Karşılaştırması
Aşağıdaki tablo, Flutter projelerinde sıkça kullanılan yerelleştirme stratejilerini karşılaştırmaktadır.
| Yöntem | Avantaj | Dezavantaj |
|---|---|---|
| easy_localization | Hızlı entegrasyon, kolay yönetim | Bağımlılık gerektirir |
| flutter_localizations | Resmi Google desteği | Daha fazla kod yazımı gerektirir |
| ARB Dosyaları | Standart format, IDE desteği | Öğrenme eğrisi daha diktir |
Kritik Uyarılar ve Güvenlik
Dikkat: Yerelleştirme dosyalarınızda asla hassas kullanıcı verilerini, API anahtarlarını veya şifreleri saklamayın. Bu dosyalar uygulama paketinin bir parçasıdır ve tersine mühendislik ile kolayca okunabilir. Ayrıca, çeviri dosyalarınızın karakter kodlamasının UTF-8 olduğundan emin olun; aksi takdirde Türkçe karakterlerde bozulmalar yaşanabilir.
Sıkça Sorulan Sorular
Dil değişikliği yapıldığında uygulama neden hemen güncellenmiyor?
Dil değişikliğini context.setLocale(Locale('tr', 'TR')) komutu ile tetiklediğinizden emin olun. Bu komut, widget ağacını yeniden oluşturur ve metinleri günceller.
RTL (Sağdan Sola) dilleri nasıl yönetilir?
Flutter, Directionality widget'ı ile RTL desteği sunar. easy_localization kullanırken yerel ayar verisine göre otomatik yönlendirme yapılabilir.
Çeviri dosyalarım çok büyürse ne yapmalıyım?
Çeviri dosyalarınızı modüler hale getirin. Örneğin, auth.json, profile.json gibi ekran bazlı dosyalar oluşturup bunları birleştirebilirsiniz.
Sistem dilini otomatik algılamak mümkün mü?
Evet, EasyLocalization yapılandırmasında useOnlyLangCode: true ayarını kullanarak cihazın mevcut sistem dilini varsayılan olarak atayabilirsiniz.
Kod içinde çeviri yaparken neden hata alıyorum?
Genellikle anahtarın JSON dosyasında bulunmamasından kaynaklanır. fallbackLocale ayarını doğru yapılandırdığınızdan emin olun.
Yerelleştirme Sürecinde Performans Optimizasyonu ve Bellek Yönetimi
Uygulamanız büyüdükçe, yüzlerce veya binlerce anahtarı içeren çeviri dosyaları bellekte ciddi bir yük oluşturabilir. Özellikle düşük donanımlı cihazlarda, tüm yerelleştirme verisini uygulama başlangıcında belleğe yüklemek yerine, stratejik bir yaklaşım benimsemek performansı doğrudan artırır.
Lazy Loading (Tembel Yükleme) yöntemi, yalnızca o an ihtiyaç duyulan dil dosyasının belleğe alınmasını sağlar. Bunun için çeviri dosyalarınızı modüler parçalara ayırabilir ve sadece aktif olan dilin JSON dosyasını okuyabilirsiniz.
// Örnek: Dinamik dil dosyası yükleyici
Future loadLanguageFile(String languageCode) async {
String jsonString = await rootBundle.loadString('assets/i18n/$languageCode.json');
return json.decode(jsonString);
}
Ayrıca, Intl paketini kullanırken metinleri statik olarak tanımlamak yerine, const yapıcılarını kullanarak widget ağacınızın gereksiz yere yeniden oluşturulmasını (rebuild) engelleyebilirsiniz. Büyük ölçekli projelerde, çeviri anahtarlarını bir Map içinde tutmak yerine, tip güvenliğini sağlamak için özel bir LocalizationDelegate sınıfı oluşturarak erişimi hızlandırabilirsiniz.
Yerelleştirme İçin Otomatik Test Stratejileri
Çoklu dil desteği sunan bir uygulamada, çeviri eksiklikleri veya hatalı anahtar eşleşmeleri kullanıcı deneyimini ciddi şekilde zedeler. Bu nedenle, yerelleştirme sürecini birim testlerine (unit tests) dahil etmek zorunludur. Özellikle flutter_test paketini kullanarak, her dil dosyasının gerekli tüm anahtarları içerdiğini doğrulayan testler yazmalısınız.
Aşağıdaki örnek, tüm dil dosyalarınızın anahtar yapısının birbiriyle uyumlu olup olmadığını kontrol eden temel bir test senaryosudur:
void main() {
test('Tüm dillerdeki anahtar sayısı eşit olmalı', () async {
final en = await loadLanguageFile('en');
final tr = await loadLanguageFile('tr');
expect(en.keys.length, equals(tr.keys.length),
reason: "İngilizce ve Türkçe dosyalarındaki anahtar sayıları uyuşmuyor!");
expect(en.keys.containsAll(tr.keys), isTrue,
reason: "Eksik çeviri anahtarları tespit edildi.");
});
}
Bu testleri CI/CD hattınıza (GitHub Actions veya Bitrise gibi) entegre ederek, her "push" işleminde çeviri dosyalarınızın tutarlılığını otomatik olarak denetleyebilirsiniz. Bu, özellikle kalabalık ekiplerde çalışan geliştiriciler için "unutulan çeviri" sorununu kökten çözer.
İleri İpucu: Çeviri Dosyalarında İsimlendirme Standartları
- Hiyerarşik Yapı: Anahtarlarınızı
{ "auth": { "login": "Giriş Yap" } }şeklinde gruplandırın. - İsimlendirme:
snake_caseveyacamelCasekonusunda bir standart belirleyin ve projenin tamamında buna sadık kalın. - Yorum Satırları: JSON dosyalarında yorum satırı desteklenmediği için, çevirmenlere not bırakmak adına ayrı bir
metadata.jsondosyası kullanabilirsiniz.
Sonuç
Flutter & mobil ile ileri düzey çoklu dil desteği yönetimi, uygulamanızın profesyonellik seviyesini belirleyen temel bir yapıdır. Bu rehberde öğrendiğiniz adımları takip ederek, uygulamanızı dünyanın her yerindeki kullanıcılara hitap edecek şekilde ölçekleyebilirsiniz. Başarılı bir yerelleştirme süreci, sadece teknik bir kurulum değil, aynı zamanda kullanıcıyı anlama çabasıdır.
Bir sonraki adım olarak, çeviri süreçlerinizi otomatize etmek için "Crowdin" veya "Lokalise" gibi platformları projenize entegre etmeyi düşünebilirsiniz. Bu platformlar, çevirmenlerle çalışmanızı kolaylaştırır ve JSON dosyalarınızı otomatik olarak senkronize eder. Kod güvenliği konusunda her zaman en güncel paket sürümlerini takip etmeyi ve bağımlılıklarınızı düzenli olarak denetlemeyi unutmayın.


Yorumlar (0)
Yorum Yaz