Flutter - Uluslararasılaşma

Günümüzde mobil uygulamalar farklı ülkelerden müşteriler tarafından kullanılmakta ve sonuç olarak uygulamaların içeriği farklı dillerde göstermesi gerekmektedir. Bir uygulamanın birden çok dilde çalışmasını sağlamaya, uygulamayı uluslararasılaştırma adı verilir.

Bir uygulamanın farklı dillerde çalışması için, önce uygulamanın çalıştığı sistemin mevcut yerel ayarını bulması ve ardından içeriğini belirli bir yerel ayarda göstermesi gerekir ve bu işleme Yerelleştirme adı verilir.

Flutter çerçevesi, yerelleştirme için üç temel sınıf ve bir uygulamayı yerelleştirmek için temel sınıflardan türetilen kapsamlı yardımcı sınıflar sağlar.

Temel sınıflar aşağıdaki gibidir -

  • Yerel Ayar - Yerel, kullanıcının dilini tanımlamak için kullanılan bir sınıftır. Örneğin, en-us Amerikan İngilizcesini tanımlar ve olarak oluşturulabilir.

Locale en_locale = Locale('en', 'US')

Burada, birinci argüman dil kodu ve ikinci argüman ülke kodudur. Arjantin İspanyolca (es-ar) yerel ayarı oluşturmanın bir başka örneği de aşağıdaki gibidir -

Locale es_locale = Locale('es', 'AR')
  • Yerelleştirmeler - Yerelleştirmeler, Yerel Ayarı ve alt öğesinin yerelleştirilmiş kaynaklarını ayarlamak için kullanılan genel bir pencere öğesidir.

class CustomLocalizations { 
   CustomLocalizations(this.locale); 
   final Locale locale; 
   static CustomLocalizations of(BuildContext context) { 
      return Localizations.of<CustomLocalizations>(context, CustomLocalizations); 
   } 
   static Map<String, Map<String, String>> _resources = {
      'en': {
         'title': 'Demo', 
         'message': 'Hello World' 
      }, 
      'es': {
         'title': 'Manifestación', 
         'message': 'Hola Mundo', 
      }, 
   }; 
   String get title { 
      return _resources[locale.languageCode]['title']; 
   }
   String get message { 
      return _resources[locale.languageCode]['message']; 
   } 
}
  • Burada, CustomLocalizations, widget için belirli yerelleştirilmiş içeriği (başlık ve mesaj) almak için özel olarak oluşturulmuş yeni bir özel sınıftır. of method, yeni CustomLocalizations sınıfını döndürmek için Localizations sınıfını kullanır.

  • LocalizationsDelegate <T> - LocalizationsDelegate <T>, Localizations widget'ının yüklendiği bir fabrika sınıfıdır. Üç adet aşırı kullanılabilir yöntemi vardır -

    • isSupported - Bir yerel ayarı kabul eder ve belirtilen yerel ayarın desteklenip desteklenmediğini döndürür.

@override 
bool isSupported(Locale locale) => ['en', 'es'].contains(locale.languageCode);

      Burada, delege yalnızca en ve es yerel ayarları için çalışır.

    • load - Bir yerel ayarı kabul eder ve belirtilen yerel ayar için kaynakları yüklemeye başlar.

@override 
Future<CustomLocalizations> load(Locale locale) { 
   return SynchronousFuture<CustomLocalizations>(CustomLocalizations(locale)); 
}

      Burada, yükleme yöntemi CustomLocalizations döndürür. Döndürülen CustomLocalizations, hem İngilizce hem de İspanyolca olarak başlık ve mesaj değerlerini almak için kullanılabilir

    • shouldReload - Yerelleştirmeler pencere öğesi yeniden oluşturulurken Özel Yerelleştirmelerin yeniden yüklenmesinin gerekli olup olmadığını belirtir.

@override 
bool shouldReload(CustomLocalizationsDelegate old) => false;
  • CustomLocalizationDelegate'in tam kodu aşağıdaki gibidir -

class CustomLocalizationsDelegate extends 
LocalizationsDelegate<CustomLocalizations> { 
   const CustomLocalizationsDelegate(); 
   @override 
   bool isSupported(Locale locale) => ['en', 'es'].contains(locale.languageCode);
   @override 
   Future<CustomLocalizations> load(Locale locale) { 
      return SynchronousFuture<CustomLocalizations>(CustomLocalizations(locale));
   } 
   @override bool shouldReload(CustomLocalizationsDelegate old) => false; 
}

Genel olarak, Flutter uygulamaları, MaterialApp veya WidgetsApp olmak üzere iki kök düzeyi parçacığa dayanır. Flutter, her iki widget için de hazır yerelleştirme sağlar ve bunlar MaterialLocalizations ve WidgetsLocaliations'dır. Ayrıca, Flutter delegelerin MaterialLocalizations ve WidgetsLocaliations yüklemelerini sağlar ve bunlar sırasıyla GlobalMaterialLocalizations.delegate ve GlobalWidgetsLocalizations.delegate'dir.

Kavramı test etmek ve anlamak için basit bir uluslararasılaştırma etkin uygulama oluşturalım.

  • Yeni bir flutter uygulaması oluşturun, flutter_localization_app.

  • Flutter, özel flutter paketi flutter_localizations kullanarak uluslararasılaştırmayı destekler. Buradaki fikir, yerelleştirilmiş içeriği ana SDK'dan ayırmaktır. Pubspec.yaml dosyasını açın ve uluslararasılaştırma paketini etkinleştirmek için aşağıdaki kodu ekleyin -

dependencies: 
   flutter: 
      sdk: flutter 
   flutter_localizations:
      sdk: flutter
  • Android stüdyo, pubspec.yaml dosyasının güncellendiğine dair aşağıdaki uyarıyı görüntüler.

  • Bağımlılıkları al seçeneğini tıklayın. Android stüdyosu paketi İnternet'ten alacak ve uygulama için uygun şekilde yapılandıracaktır.

  • Flutter_localizations paketini main.dart'ta aşağıdaki gibi içe aktarın -

import 'package:flutter_localizations/flutter_localizations.dart'; 
import 'package:flutter/foundation.dart' show SynchronousFuture;
  • Burada, SynchronousFuture'un amacı özel yerelleştirmeleri eşzamanlı olarak yüklemektir.

  • Aşağıda belirtildiği gibi özel bir yerelleştirme ve ilgili temsilcisini oluşturun -

class CustomLocalizations { 
   CustomLocalizations(this.locale); 
   final Locale locale; 
   static CustomLocalizations of(BuildContext context) {
      return Localizations.of<CustomLocalizations>(context, CustomLocalizations); 
   }
   static Map<String, Map<String, String>> _resources = {
      'en': {
         'title': 'Demo', 
         'message': 'Hello World' 
      }, 
      'es': { 
         'title': 'Manifestación', 
         'message': 'Hola Mundo', 
      }, 
   }; 
   String get title { 
      return _resources[locale.languageCode]['title']; 
   } 
   String get message { 
      return _resources[locale.languageCode]['message']; 
   } 
}
class CustomLocalizationsDelegate extends
LocalizationsDelegate<CustomLocalizations> {
   const CustomLocalizationsDelegate();
   
   @override 
   bool isSupported(Locale locale) => ['en', 'es'].contains(locale.languageCode); 
   
   @override 
   Future<CustomLocalizations> load(Locale locale) { 
      return SynchronousFuture<CustomLocalizations>(CustomLocalizations(locale)); 
   } 
   @override bool shouldReload(CustomLocalizationsDelegate old) => false; 
}
  • Burada, uygulamadaki başlık ve mesaj için yerelleştirmeyi desteklemek için CustomLocalizations oluşturulur ve CustomLocalizationsDelegate, CustomLocalizations'ı yüklemek için kullanılır.

  • MaterialApp özelliklerini, localizationsDelegates'i ve supportedLocales'i aşağıda belirtildiği gibi kullanarak MaterialApp, WidgetsApp ve CustomLocalization için temsilciler ekleyin -

localizationsDelegates: [
   const CustomLocalizationsDelegate(),   
   GlobalMaterialLocalizations.delegate, 
   GlobalWidgetsLocalizations.delegate, 
], 
supportedLocales: [
   const Locale('en', ''),
   const Locale('es', ''), 
],
  • Başlık ve mesajın yerelleştirilmiş değerini almak ve aşağıda belirtildiği gibi uygun yerde kullanmak için CustomLocalizations yöntemini kullanın -

class MyHomePage extends StatelessWidget {
   MyHomePage({Key key, this.title}) : super(key: key); 
   final String title; 
   @override 
   Widget build(BuildContext context) {
      return Scaffold(
         appBar: AppBar(title: Text(CustomLocalizations .of(context) .title), ), 
         body: Center(
            child: Column(
               mainAxisAlignment: MainAxisAlignment.center, 
               children: <Widget>[ 
                  Text( CustomLocalizations .of(context) .message, ), 
               ], 
            ), 
         ),
      );
   }
}
  • Burada, basitlik nedeniyle MyHomePage sınıfını StatefulWidget'ten StatelessWidget'e değiştirdik ve başlık ve mesaj almak için CustomLocalizations'ı kullandık.

  • Uygulamayı derleyin ve çalıştırın. Uygulama, içeriğini İngilizce olarak gösterecektir.

  • Uygulamayı kapatın. GitSettings → System → Languages and Input → Languages*.

  • Dil seçeneği ekle'yi tıklayın ve İspanyolca'yı seçin. Bu, İspanyolca dilini yükleyecek ve ardından seçeneklerden biri olarak listeleyecektir.

  • İspanyolca'yı seçin ve İngilizcenin üzerine taşıyın. Bu, İspanyolca olarak ilk dil olarak ayarlanacak ve her şey İspanyolca metne dönüştürülecektir.

  • Şimdi uluslararasılaştırma uygulamasını yeniden başlatın ve başlığı ve mesajı İspanyolca dilinde göreceksiniz.

  • Ayarda İngilizce seçeneğini İspanyolca seçeneğinin üzerine getirerek dili İngilizceye döndürebiliriz.

  • Başvurunun sonucu (İspanyolca) aşağıda verilen ekran görüntüsünde gösterilmektedir -

Uluslararası Paketi kullanma

Flutter, yerelleştirilmiş mobil uygulamanın geliştirilmesini daha da basitleştirmek için uluslararası paket sağlar. intl paketi, dile özgü iletileri yarı otomatik olarak oluşturmak için özel yöntemler ve araçlar sağlar.

Intl paketini kullanarak yeni bir yerelleştirilmiş uygulama oluşturalım ve kavramı anlayalım.

  • Yeni bir flutter uygulaması oluşturun, flutter_intl_app.

  • Pubspec.yaml dosyasını açın ve paket ayrıntılarını ekleyin.

dependencies: 
   flutter: 
      sdk: flutter 
   flutter_localizations: 
      sdk: flutter 
   intl: ^0.15.7 
   intl_translation: ^0.17.3
  • Android studio, pubspec.yaml dosyasının güncellendiğini bildiren uyarıyı aşağıda gösterildiği gibi görüntüleyecektir.

  • Bağımlılıkları al seçeneğini tıklayın. Android stüdyosu paketi İnternet'ten alacak ve uygulama için uygun şekilde yapılandıracaktır.

  • Önceki örnekten main.dart'ı kopyalayın, flutter_internationalization_app.

  • Uluslararası paketi aşağıda gösterildiği gibi içe aktarın -

import 'package:intl/intl.dart';
  • CustomLocalization sınıfını aşağıda verilen kodda gösterildiği gibi güncelleyin -

class CustomLocalizations { 
   static Future<CustomLocalizations> load(Locale locale) {
      final String name = locale.countryCode.isEmpty ? locale.languageCode : locale.toString(); 
      final String localeName = Intl.canonicalizedLocale(name); 
      
      return initializeMessages(localeName).then((_) {
         Intl.defaultLocale = localeName; 
         return CustomLocalizations(); 
      }); 
   } 
   static CustomLocalizations of(BuildContext context) { 
      return Localizations.of<CustomLocalizations>(context, CustomLocalizations); 
   } 
   String get title {
      return Intl.message( 
         'Demo', 
         name: 'title', 
         desc: 'Title for the Demo application', 
      ); 
   }
   String get message{
      return Intl.message(
         'Hello World', 
         name: 'message', 
         desc: 'Message for the Demo application', 
      ); 
   }
}
class CustomLocalizationsDelegate extends 
LocalizationsDelegate<CustomLocalizations> {
   const CustomLocalizationsDelegate();
   
   @override
   bool isSupported(Locale locale) => ['en', 'es'].contains(locale.languageCode); 
   @override 
   Future<CustomLocalizations> load(Locale locale) { 
      return CustomLocalizations.load(locale); 
   } 
   @override 
   bool shouldReload(CustomLocalizationsDelegate old) => false; 
}
  • Burada, özel yöntemler yerine intl paketinden üç yöntem kullandık. Aksi takdirde kavramlar aynıdır.

    • Intl.canonicalizedLocale - Doğru yerel adı almak için kullanılır.

    • Intl.defaultLocale - Mevcut yerel ayarı ayarlamak için kullanılır

    • Intl.message - Yeni mesajları tanımlamak için kullanılır.

  • ithalat l10n/messages_all.dartdosya. Bu dosyayı kısa süre içinde oluşturacağız

import 'l10n/messages_all.dart';
  • Şimdi bir klasör oluşturun, lib / l10n

  • Bir komut istemi açın ve uygulama kök dizinine gidin (pubspec.yaml'nin bulunduğu yer) ve aşağıdaki komutu çalıştırın -

flutter packages pub run intl_translation:extract_to_arb --output-
   dir=lib/l10n lib/main.dart
  • Burada komut, intl_message.arb dosyası, farklı yerel ayarda mesaj oluşturmak için bir şablon oluşturacaktır. Dosyanın içeriği aşağıdaki gibidir -

{
   "@@last_modified": "2019-04-19T02:04:09.627551", 
   "title": "Demo", 
   "@title": {
      "description": "Title for the Demo application", 
      "type": "text", 
      "placeholders": {} 
   }, 
   "message": "Hello World", 
   "@message": {
      "description": "Message for the Demo 
      application", 
      "type": "text", 
      "placeholders": {} 
   }
}
  • İntl_message.arb dosyasını kopyalayın ve intl_en.arb adında yeni bir dosya oluşturun.

  • İntl_message.arb dosyasını kopyalayın ve yeni dosya, intl_es.arb oluşturun ve içeriği aşağıda gösterildiği gibi İspanyolca diline değiştirin -

{
   "@@last_modified": "2019-04-19T02:04:09.627551",  
   "title": "Manifestación", 
   "@title": {
      "description": "Title for the Demo application", 
      "type": "text", 
      "placeholders": {} 
   },
   "message": "Hola Mundo",
   "@message": {
      "description": "Message for the Demo application", 
      "type": "text", 
      "placeholders": {} 
   } 
}
  • Şimdi, son mesaj dosyası olan messages_all.dart'ı oluşturmak için aşağıdaki komutu çalıştırın.

flutter packages pub run intl_translation:generate_from_arb 
--output-dir=lib\l10n --no-use-deferred-loading 
lib\main.dart lib\l10n\intl_en.arb lib\l10n\intl_es.arb
  • Uygulamayı derleyin ve çalıştırın. Yukarıdaki uygulamaya benzer şekilde çalışacaktır, flutter_localization_app.