Gereksinimler ve Ön Hazırlık
Çoklu dil yönetimi için Flutter'ın resmi flutter_localizations kütüphanesini ve modern bir yaklaşım olan easy_localization paketini kullanacağız. Bu paket, JSON tabanlı çeviri dosyaları ile çalışmayı kolaylaştırır ve uygulama içerisinde dil geçişlerini yönetmek için gerekli altyapıyı sağlar.
Başlamadan önce pubspec.yaml dosyanıza gerekli bağımlılıkları eklemeniz gerekmektedir. 2026 yılı itibarıyla güncel sürümleri kullandığınızdan emin olun.
dependencies:
flutter:
sdk: flutter
flutter_localizations:
sdk: flutter
easy_localization: ^3.0.0
Yukarıdaki kod bloğu, projenize yerelleştirme yeteneklerini kazandıracak olan temel kütüphaneleri ekler. Kurulumdan sonra flutter pub get komutunu çalıştırarak bağımlılıkları projenize dahil edin.
Proje Yapılandırması ve Çeviri Dosyalarının Oluşturulması
Çeviri dosyalarınızı projenizin kök dizininde bulunan assets/translations klasörü altında tutmak, dosya yönetimini ve bakımını kolaylaştırır. Her dil için bir JSON dosyası oluşturarak metinlerinizi anahtar-değer çiftleri şeklinde tanımlayın.
Örnek olarak en-US.json ve tr-TR.json dosyalarınızı şu şekilde yapılandırın:
// assets/translations/tr-TR.json
{
"merhaba": "Merhaba Dünya",
"hosgeldin": "Uygulamamıza hoş geldiniz, {}"
}
// assets/translations/en-US.json
{
"merhaba": "Hello World",
"hosgeldin": "Welcome to our app, {}"
}
Bu yapı, uygulamanızdaki tüm metinleri merkezi bir noktadan yönetmenizi sağlar. Süslü parantezler {}, çalışma zamanında (runtime) dinamik veri eklemek için kullanılacak yer tutuculardır.
Uygulama Başlangıcında Yerelleştirme Ayarları
Uygulamanızın giriş noktası olan main.dart dosyasında, EasyLocalization widget'ını kullanarak dil desteğini başlatmalısınız. Bu işlem, uygulamanızın cihazın dil ayarlarını tanımasını ve çeviri dosyalarını yüklemesini sağlar.
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(),
),
);
}
Burada supportedLocales, uygulamanızın desteklediği dilleri tanımlar. fallbackLocale ise kullanıcının cihaz dili desteklenmediğinde varsayılan olarak hangi dilin görüntüleneceğini belirler.
Dinamik Metin Kullanımı ve Dil Değiştirme
Metinleri ekranda göstermek için tr() uzantısını kullanırız. Bu metot, verdiğiniz anahtarı JSON dosyasında arar ve ilgili dildeki karşılığını getirir. Dil değiştirme işlemi ise oldukça basittir.
// Metin kullanımı
Text('merhaba'.tr())
// Parametreli metin kullanımı
Text('hosgeldin'.tr(args: ['Kullanıcı']))
// Dil değiştirme
context.setLocale(Locale('tr', 'TR'));
tr() metodu, easy_localization paketinin sunduğu en güçlü araçtır. Parametre göndermek istediğinizde args listesini kullanarak metin içerisindeki {} alanlarını doldurabilirsiniz.
Çoklu Dil Yönetim Yöntemlerinin Karşılaştırılması
| Yöntem | Avantaj | Dezavantaj |
|---|---|---|
| Hardcoded (Sabit) | Hızlı başlangıç | Bakımı imkansız, ölçeklenemez |
| Easy Localization | Modüler, JSON desteği, kolay geçiş | Ek kütüphane bağımlılığı |
| ARB Dosyaları | Resmi Flutter desteği, IDE entegrasyonu | Kurulumu daha karmaşık |
Yukarıdaki tablo, farklı yaklaşımların temel farklarını özetlemektedir. Profesyonel projelerde genellikle easy_localization veya resmi flutter_localizations (ARB dosyaları ile) tercih edilir.
Kritik Güvenlik Uyarısı: Çeviri dosyalarınızı (JSON) dışarıdan bir API ile alıyorsanız, bu dosyaların doğruluğunu mutlaka kontrol edin. Güvenilmeyen kaynaklardan gelen çeviri dosyaları, uygulamanızda XSS veya beklenmedik UI hatalarına yol açabilecek zararlı kodlar içerebilir. Her zaman yerel dosya tabanlı bir yedekleme mekanizması bulundurun.
Sıkça Sorulan Sorular
Uygulama içerisinde dil değiştirdiğimde ekran neden güncellenmiyor?
Dil değişikliği sonrası ekranın güncellenmesi için EasyLocalization widget'ının doğru yapılandırıldığından ve MaterialApp içerisinde localizationsDelegates ile supportedLocales değerlerinin tanımlandığından emin olun.
RTL (Sağdan Sola) dilleri nasıl yönetirim?
Flutter, Directionality widget'ı ile RTL desteği sunar. easy_localization, cihaz diline göre bunu otomatik yönetebilir; ancak özel durumlarda TextDirection.rtl kullanarak manuel müdahale edebilirsiniz.
Çeviri dosyalarım çok büyürse ne yapmalıyım?
Dosyalarınızı modüllere ayırın (örneğin: auth.json, profile.json). easy_localization birden fazla dosyayı birleştirerek okuma yeteneğine sahiptir.
Kullanıcı dil tercihini nasıl kalıcı hale getiririm?
easy_localization paketi, kullanıcının seçtiği dili otomatik olarak SharedPreferences kullanarak cihazda saklar. Siz ekstra bir kod yazmadan tercih korunur.
Dinamik içeriklerde çoğul (plural) desteği var mı?
Evet, JSON dosyalarınızda "elma": {"one": "1 elma", "other": "{} elma"} yapısını kullanarak plural('elma', 5) şeklinde çoğul desteğini kolayca kullanabilirsiniz.
Sorumluluk Reddi: Bu makalede paylaşılan kod örnekleri eğitim amaçlıdır. Üretim ortamına almadan önce tüm yerelleştirme metinlerinizi profesyonel çevirmenler tarafından onaylatın ve uygulamanızın farklı ekran boyutlarında metin taşmalarına karşı test edildiğinden emin olun.
Performans Optimizasyonu ve Bellek Yönetimi
Büyük ölçekli uygulamalarda, tüm yerelleştirme dosyalarını bellekte tutmak performans sorunlarına yol açabilir. Özellikle yüzlerce farklı anahtar (key) içeren projelerde, JSON dosyalarının çalışma zamanında (runtime) yüklenmesi ve ayrıştırılması (parsing) işlemciyi yorabilir. Bu durumu optimize etmek için aşağıdaki stratejileri izleyebilirsiniz:
- Lazy Loading (Tembel Yükleme): Tüm çeviri dosyalarını uygulama açılışında yüklemek yerine, sadece o an aktif olan dilin dosyasını yükleyin.
- Önbellekleme (Caching): Ayrıştırılmış JSON verilerini bir
Mapyapısında saklayarak, aynı anahtar için tekrar tekrar dosya okuma işlemi yapmaktan kaçının. - Dosyaları Parçalara Ayırma: Çeviri dosyalarınızı modüllere (örneğin:
auth_en.json,profile_en.json) bölerek, sadece ihtiyaç duyulan modülün yüklenmesini sağlayın.
Aşağıdaki örnek, sadece ihtiyaç duyulan modülün dinamik olarak yüklendiği bir yapı sunar:
Future loadModuleTranslation(String langCode, String moduleName) async {
try {
String jsonString = await rootBundle.loadString('assets/i18n/$moduleName/$langCode.json');
return json.decode(jsonString);
} catch (e) {
debugPrint("Modül yükleme hatası: $e");
return {};
}
}
Yerelleştirme Süreçlerinde Hata Ayıklama (Debugging)
Geliştirme aşamasında en sık karşılaşılan sorun, eksik çeviri anahtarlarıdır. Uygulamanızın üretim ortamında "key_not_found" gibi kullanıcıyı rahatsız eden metinler göstermemesi için bir "fallback" (yedekleme) mekanizması kurmalısınız.
Eksik Anahtarları İzleme
Geliştirme modunda, bulunamayan anahtarları konsola loglayarak veya görsel bir uyarı ile belirterek hataları hızlıca fark edebilirsiniz. İşte basit bir kontrol mekanizması:
String translate(String key) {
final value = _localizedValues[key];
if (value == null) {
debugPrint("UYARI: '$key' anahtarı için çeviri bulunamadı!");
return "[$key]"; // Geliştiriciye anahtarın eksik olduğunu gösterir
}
return value;
}
Test Stratejileri
Yerelleştirme testlerini otomatize etmek, uygulamanın farklı dillerde düzgün çalıştığından emin olmanızı sağlar. Özellikle metin uzunluklarının farklı dillerde (örneğin Almanca'nın İngilizce'den daha uzun olması) UI düzenini bozup bozmadığını test etmelisiniz.
| Test Türü | Odak Noktası |
|---|---|
| Birim Testi | Çeviri anahtarının doğru değeri döndürüp döndürmediği. |
| Widget Testi | Metin taşmalarının (overflow) kontrolü. |
| Entegrasyon Testi | Dil değiştirme sonrası UI'ın güncellenme durumu. |
Widget testlerinizde farklı dilleri simüle etmek için Localizations widget'ını sarmalayıcı olarak kullanın:
testWidgets('Dil değişimi sonrası metin güncellenmeli', (WidgetTester tester) async {
await tester.pumpWidget(
MaterialApp(
locale: const Locale('tr', 'TR'),
supportedLocales: const [Locale('tr', 'TR'), Locale('en', 'US')],
home: MyLocalizedWidget(),
),
);
expect(find.text('Merhaba'), findsOneWidget);
});
Sonuç
Flutter ile çoklu dil desteği yönetimi, uygulamanızın küresel ölçekte başarılı olması için atmanız gereken en önemli adımlardan biridir. Bu rehberde, JSON tabanlı bir altyapı kurarak metinlerinizi nasıl yönetebileceğinizi, dinamik verileri nasıl yerleştireceğinizi ve kullanıcı deneyimini nasıl iyileştireceğinizi öğrendiniz. Bir sonraki adım olarak, çeviri dosyalarınızı bir bulut yönetim paneline (örneğin Lokalise veya Crowdin) taşıyarak çeviri sürecini otomatize etmeyi deneyebilirsiniz.


Yorumlar (0)
Yorum Yaz