🙂 İNSANLARIN EN HAYIRLISI INSANLARA FAYDALI OLANDIR 🙂

Ramazan HABER / FLUTTER / Çoklu dil desteği ekleme localizations kullanımı tr en de ru

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

 

{
  
"hello": "Merhaba"
}

 

 

 

en_US.json

 

{
  
"hello": "Hello"
}

 

 

 

 

 

 

 

6-) kullanımı

 

1. yol -> AppLocalizations.of(context)!.translate('hello')

2. yol -> context.translate('general_settings'),

 Text(

 

/// 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

 

1--> https://ahmet-kahrimanoglu.medium.com/10-ad%C4%B1mda-flutterda-lokalizasyon-i%CC%87%C5%9Flemleri-1-%C3%A7oklu-dil-deste%C4%9Fi-ekleme-manuel-3701e3673300

 

2--> https://docs.flutter.dev/development/accessibility-and-localization/internationalization

 

 2022 Mart 09 Çarşamba
 422