1-) FLUTTER - Çoklu dil desteği ekleme localizations kullanımı tr en de ru
1-) AppLocalizationExtension.dart
dev_dependencies:
flutter_test:
sdk: flutter
flutter_localizations:
sdk: flutter
assets:
- assets/images/
- assets/languages/
2-) AppLocalizations.dart
import 'dart:async';
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
/// [AppLocalizations]: Özel Delegate (Temsilci) Sınıfımız
class AppLocalizations {
/// Constructor (Kurucu)
AppLocalizations(this.locale);
/// Uygulamanın dili için
final Locale locale;
/// Dil dosyalarındaki metinler için
late Map<String, String> _localizedStrings;
/// MaterialApp'ın [localizationsDelegates] parametresinden
/// [AppLocalizations] sınıfımızın delegate'ine erişim için
static const LocalizationsDelegate<AppLocalizations> delegate = _AppLocalizationsDelegate();
/// BuildContext ile Lokalizasyona erişim için
static AppLocalizations? of(BuildContext context) {
return Localizations.of<AppLocalizations>(context, AppLocalizations);
}
/// Cihazın Locale'ine göre dil dosyalarımızın bulunduğu ("assets/languages")
/// klasörü içinden "dilKodu_ülkeKodu.json" uzantılı dosyayı okunacak
/// İçindekiler Map (key-value) yapısına parse edilecek ve
/// [_localizedStrings] isimli değişkene atıyoruz
Future<bool> load() async {
var jsonString = await rootBundle.loadString('assets/languages/${locale.languageCode}_${locale.countryCode}.json');
debugPrint('Dil dosyaları "assets/languages" dosya yolundan OKUNDU.');
Map<String, dynamic> jsonMap = json.decode(jsonString);
_localizedStrings = jsonMap.map((key, value) {
return MapEntry(key, value.toString());
});
return true;
}
/// Dil dosyalarındaki metinlere erişmek için kullanacağımız metot
/// Map yapısındaki _localizedStrings içinden bu key'e karşılık gelen value'yu bize döndürülecek.
String translate(String key) => _localizedStrings[key]!;
}
/// [AppLocalizations] isimli özel delegate sınıfımızı temsil edecek
/// [_AppLocalizationsDelegate] sınıfımız oluşturalım;
/// Bunu yapabilmek için önce bu sınıfımızı
/// [LocalizationsDelegate<AppLocalizations>]'ten extends etmemiz gerekiyor.
class _AppLocalizationsDelegate extends LocalizationsDelegate<AppLocalizations> {
/// Constructor (Kurucu)
const _AppLocalizationsDelegate();
@override
/// [isSupported]: Uygulama için desteklenen diller cihaz dilini destekliyor mu?
bool isSupported(Locale locale) {
/// ['en', 'tr']: Destek vereceğimiz dillere ait [languageCode]
/// değerlerini List içinde belirttik.
/// [.contains(locale.languageCode)]: Eğer cihazın dil kodu [languageCode]
/// ile desteklenen dillerin dil kodları eşleşirse [true],
/// eşleşmiyorsa [false] değeri dönecek
return ['en', 'tr'].contains(locale.languageCode);
}
@override
/// [load]: Dil dosyalarının yüklendiği yer
Future<AppLocalizations> load(Locale locale) async {
/// [AppLocalizations] sınıfından bir nesne oluşturduk.
/// Bu nesne üzerinden load metodunu çağırdık.
/// Böylece JSON uzantılı dil dosyalarımızın yüklenmesini sağladık.
var localizations = AppLocalizations(locale);
debugPrint('Dil dosyaları "assets/languages" dosya yolundan YÜKLENDİ.');
await localizations.load();
return localizations;
}
@override
bool shouldReload(_AppLocalizationsDelegate old) {
/// [load] metodunun yeniden yüklenmesini istemediğimiz için false yaptık
return false;
}
}
/// Uygulamanın dil dosyalarına AppLocalizations üzerinden erişmek için
/// AppLocalizations.of(context).translate('keyDegeri')
extension AppLocalizationExtension on BuildContext {
/// Uygulamanın dil dosyalarındaki metinlere BuildContext üzerinden erişmek için
String translate(String key) => AppLocalizations.of(this)!.translate(key);
// Kullanımı: context.translate('keyDegeri'),
}
3-) pubspec.yaml
import 'package:flutter/material.dart';
import 'AppLocalizations.dart';
extension AppLocalizationExtension on BuildContext {
String translate(String key) => AppLocalizations.of(this)!.translate(key);
}
4-) Main.dart
import 'package:flutter_localizations/flutter_localizations.dart';
import 'AppLocalizations.dart';
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
static const String _title = 'Flutter Code Sample';
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
localizationsDelegates:[ // Aktif edilecek parametre
/// Uygulama için kendi oluşturduğumuz delegate
AppLocalizations.delegate,
/// Material widget kütüphanesi için delegate
GlobalMaterialLocalizations.delegate,
/// Widgetlar için Locale değerine göre metin yönünü belirler
/// [TextDirection.ltr] Metin Yönü - Soldan sağa (left to right) (Varsayılan)
/// [TextDirection.rtl] Metin Yönü - Sağdan sola(right to left)
GlobalWidgetsLocalizations.delegate,
/// Cupertino widget kütüphanesi için delegate
GlobalCupertinoLocalizations.delegate,
],
supportedLocales: [
const Locale('tr', 'TR'),
const Locale('de', 'DE'),
const Locale('ru', 'RU'),
const Locale('en', 'US')
],
title: _title,
home:BottomNavigationPage(),//BottomNavigationPage(), // LoginPage1()
localeResolutionCallback: (Locale? locale, Iterable<Locale> supportedLocales) { // Aktif edilecek parametre
/// [locale]: Cihazın dili null değilse
if (locale != null) {
debugPrint("Algılanan cihaz dili: Dil Kodu: ${locale.languageCode}, Ülke Kodu: ${locale.countryCode}");
for (var supportedLocale in supportedLocales) {
/// Cihazın dil kodu desteklenen diller arasındaki dil kodlarının içinde var mı?
if (supportedLocale.languageCode == locale.languageCode) {
/// Varsa desteklenen dili döndür
return supportedLocale;
}
}
}
debugPrint("Algılanan cihaz dili desteklenen diller arasında bulunmuyor.");
/// [locale]: Cihazın dili null ise
/// Yoksa [supportedLocales] Listesindeki ilk sonucu döndür.
debugPrint(
"Uygulamanın başlatılması istenen dil: Dil Kodu: ${supportedLocales.first.languageCode}, Ülke Kodu: ${supportedLocales.first.countryCode}");
return supportedLocales.first;
},
);
}
}
5-) assets/languages/ klasörü
tr_TR.json
{
| en_US.json
{
|
6-) kullanımı
1. yol -> AppLocalizations.of(context)!.translate('hello')
2. yol -> context.translate('general_settings'), | ||
| /// Uygulamanın dil dosyalarındaki metinlere iki şekilde erişebiliriz | |
| /// 1) [context.translate()] metodunu kullanarak | |
| /// [BuildContext] üzerinden; | |
| context.translate('general_settings'), | |
|
| |
| /// 2)[translate()] metodunu kullanarak | |
| /// [AppLocalizations] sınıfı üzerinden; | |
| /// AppLocalizations.of(context)!.translate('general_settings'), | |
| /// Kodumuzu daha kısaltığı için biz ilk yöntemi terchi edeceğiz. | |
| ), | |
7-) kaynak
2--> https://docs.flutter.dev/development/accessibility-and-localization/internationalization