Flutter’da Localization
Merhaba değerli okurlar bu yazımda sizlere Flutter’da Localization işleminden bahsedeceğim.
Flutter dünyasında global bir oyuncu olmak, uygulamanızın farklı dilleri ve kültürleri “anlaması” ile mümkündür. İşte bu sanata Localization (Yerelleştirme) diyoruz. Bu, sadece metinleri tercüme etmek değildir; tarihleri, para birimlerini ve sayı formatlarını kullanıcının kendi bölgesine göre uyarlamaktır. Kısacası, kullanıcınıza kendi evindeymiş gibi hissettirmektir.
“Ama bu çok karmaşık değil mi?” diye soruyor olabilirsiniz. .arb dosyaları, kod üretimi, delegates… Bu terimler ilk başta göz korkutucu gelebilir. Endişelenmeyin! Bu makale, Flutter’da localization sürecini adım adım işliyor olacağız.
Temel Kavramlar
Localization sürecine başlamadan önce, tüm geliştiricilerin bilmesi gereken birkaç temel terim var.
- Internationalization (i18n): “Uluslararasılaştırma” anlamına gelir. -tekerleme gibi ama olsun- Bu, kodunuzu farklı dillere ve bölgelere hazırlama sürecidir. Yani, metinleri doğrudan koda yazmak yerine (“Merhaba Dünya”), onları bir anahtar ile çağırmaya hazır hale getirmektir (Strings.helloWorld). Uygulamanızın mimarisini esnek hale getirme sanatıdır. (Not: ‘i’ ve ’n’ harfleri arasında 18 harf olduğu için bu kısaltma kullanılır.)
- Localization (l10n): “Yerelleştirme” anlamına gelir. Bu, hazırlanan altyapıyı kullanarak uygulamanızı belirli bir dil ve bölge için uyarlama eylemidir. Yani, İngilizce için “Hello World”, Türkçe için “Merhaba Dünya” metinlerini sağlamaktır. (Not: ‘l’ ve ’n’ arasında 10 harf vardır.)
- Locale: Bir dil ve isteğe bağlı olarak bir ülke kodunun birleşimidir. Kullanıcının dilini ve bölgesini tanımlar. Örneğin:
- Locale(‘en’): İngilizce
- Locale(‘tr’): Türkçe
- Locale(‘en’, ‘US’): Amerikan İngilizcesi
- Locale(‘en’, ‘GB’): İngiliz İngilizcesi
- ARB Dosyaları (.arb): “Application Resource Bundle” (Uygulama Kaynak Paketi) anlamına gelir. Bunlar, çevirilerimizi sakladığımız basit, JSON benzeri dosyalardır. Her bir dil için ayrı bir .arb dosyası oluştururuz. İçerisinde anahtar-değer çiftleri bulunur:
// app_tr.arb dosyasından bir örnek
{
"helloWorld": "Merhaba Dünya!",
"@helloWorld": {
"description": "Uygulamanın ana karşılama mesajı"
}
}
//@ ile başlayan anahtarlar, çevirmenler için açıklama ve metadata içerir.- Code Generation (Kod Üretimi): Flutter’ın modern localization yaklaşımının kalbidir. Biz .arb dosyalarımızı oluştururuz ve Flutter’ın araçları, bu dosyalardan bizim için güvenli ve kolay kullanımlı bir Dart sınıfı (AppLocalizations) üretir. Bu sayede AppLocalizations.of(context)!.helloWorld gibi bir kodla metinlerimize hatasız bir şekilde erişiriz.
Temel kavramlara göz attıktan sonra gelin bu işlemi Flutter tarafında nasıl yaptığımıza bakalım
Paket Ekleme
Flutter’da localization yapmanın en güncel ve tavsiye edilen yolu, flutter_localizations paketini ve dahili kod üretimi aracını kullanmaktır. Hadi bu süreci birlikte, adım adım uygulayalım.
Projenizin pubspec.yaml dosyasına gidin ve dependencies altına flutter_localizations paketini, dev_dependencies altına ise intl paketini ekleyin.
dependencies:
flutter:
sdk: flutter
# Bu satırı ekleyin
flutter_localizations:
sdk: flutter
dev_dependencies:
flutter_test:
sdk: flutter
# Bu paket kod üretimi için gereklidir
intl: ^0.18.0 # Sürüm numarasını kontrol edinAynı pubspec.yaml dosyası içinde, flutter bölümünün altına generate: true satırını ekleyin. Bu, Flutter’a localization için kod üretimi özelliğini kullanmak istediğimizi söyler.
flutter:
uses-material-design: true
# Bu satırı ekleyin
generate: truel10n.yaml Yapılandırma Dosyasını Oluşturma
Projenizin ana dizininde ( pubspec.yaml ile aynı seviyede) l10n.yaml adında yeni bir dosya oluşturun. Bu dosya, localization aracına kaynak dosyalarının nerede olduğunu ve çıktı dosyasını nereye oluşturacağını söyler.
# l10n.yaml dosyasının içeriği
arb-dir: lib/l10n # .arb dosyalarımızın bulunduğu klasör
template-arb-file: app_en.arb # Şablon olarak kullanılacak ana dil dosyası
output-localization-file: app_localizations.dart # Üretilecek Dart dosyasının adıÇeviri Dosyalarını (.arb) Oluşturma
l10n.yaml dosyasında belirttiğimiz yolda (lib/l10n) .arb dosyalarımızı oluşturalım.
- lib klasörü altında l10n adında yeni bir klasör oluşturun.
- Bu klasörün içine app_en.arb (İngilizce) ve app_tr.arb (Türkçe) dosyalarını oluşturun.
lib/l10n/app_en.arb:
{
"@@locale": "en",
"pageHomeTitle": "Home Page",
"welcomeMessage": "Hello {userName}!",
"@welcomeMessage": {
"description": "A welcome message that greets the user by name.",
"placeholders": {
"userName": {
"type": "String",
"example": "John"
}
}
},
"appleCount": "{count,plural, =0{no apples} =1{1 apple} other{{count} apples}}",
"@appleCount": {
"description": "A message that shows the number of apples.",
"placeholders": {
"count": {
"type": "int"
}
}
}
}lib/l10n/app_tr.arb:
{
"@@locale": "tr",
"pageHomeTitle": "Ana Sayfa",
"welcomeMessage": "Merhaba {userName}!",
"appleCount": "{count,plural, =0{hiç elma yok} =1{1 elma} other{{count} elma}}"
}Bu adımları öğrenip kavradıktan sonra sizler kendi ihtiyaçlarınıza yönelik olarak düzenlemeler eklemeler yaparsınız arkadaşlar..
Kodları Üretme
Her şey hazır! Şimdi terminali açın ve flutter pub get komutunu çalıştırın. Bu komut, generate: true ayarını gördüğü için otomatik olarak localization kodlarını üretecektir. Üretilen dosyalar .dart_tool/flutter_gen/gen_l10n/ klasöründe yer alır.
Eğer .arb dosyalarında bir değişiklik yaparsanız, bu komutu tekrar çalıştırmanız veya uygulamanızı yeniden başlatmanız yeterlidir.
Şimdi her şey bitti mi diyeceksiniz hayır bitmedi neden çünkü patron çıldırdı şaka şaka son bir adım daha var
MaterialApp’ı Yapılandırma
Son adım olarak, MaterialApp widget’ımızı ürettiğimiz kodları kullanacak şekilde yapılandırmamız gerekiyor.
import 'package:flutter/material.dart';
// Üretilen dosyayı import ediyoruz.
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Localization Demo',
// 1. Desteklenen dilleri listeliyoruz.
supportedLocales: AppLocalizations.supportedLocales,
// 2. Gerekli delegate'leri ekliyoruz.
localizationsDelegates: AppLocalizations.localizationsDelegates,
home: const HomePage(),
);
}
}- supportedLocales: Uygulamanızın hangi dilleri desteklediğini MaterialApp’a bildirir. Bu liste, kod üretimi sayesinde bizim için otomatik olarak oluşturulur.
- localizationsDelegates: Bu, Flutter’a AppLocalizations sınıfını nasıl yükleyeceğini ve kullanacağını söyleyen bir dizi “temsilci”dir. Ayrıca Material ve Cupertino widget’larının kendi içindeki metinleri (örneğin “OK”, “Cancel” butonları) yerelleştirmesi için de gereklidirler.
Artık her şey hazır.. Hayırlı uğurlu olsun arkadaşlar.. Fakat makaleyi böyle bitirince bazı arkadaşlar üzülüyor neden Flutter tarafında nasıl kullanılır örneği olmuyor hocam diye.. Arkadaşlarımız üzülmesinler..
import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
class HomePage extends StatelessWidget {
const HomePage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
// 1. AppLocalizations nesnesine context üzerinden erişiyoruz.
final l10n = AppLocalizations.of(context)!;
final String userName = "Flutterista";
final int elmaSayisi = 5;
return Scaffold(
// 2. Basit bir metin kullanımı
appBar: AppBar(title: Text(l10n.pageHomeTitle)),
body: Center(
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
// 3. Parametreli metin kullanımı
Text(
l10n.welcomeMessage(userName),
style: Theme.of(context).textTheme.headlineSmall,
),
const SizedBox(height: 20),
// 4. Çoğul (plural) metin kullanımı
Text(
l10n.appleCount(elmaSayisi),
style: Theme.of(context).textTheme.titleLarge,
),
],
),
),
),
);
}
}- AppLocalizations.of(context)!: Bu statik metot, widget ağacında yukarı doğru giderek MaterialApp’ta tanımladığımız AppLocalizations örneğini bulur ve bize verir. ! (null check operator) kullanıyoruz çünkü MaterialApp’ı doğru yapılandırdığımızdan eminiz.
- Basit Metin: l10n.pageHomeTitle gibi doğrudan erişim sağlarız.
- Parametreli Metin: Kod üretimi, {userName} placeholder’ı için welcomeMessage(String userName) şeklinde bir metot oluşturur. Bu, tür güvenliği sağlar.
- Çoğul Metin: En güçlü özelliklerden biridir. .arb dosyasındaki plural kuralına göre, kod üretimi appleCount(int count) şeklinde bir metot oluşturur. Bu metot, verdiğiniz sayıya göre doğru cümleyi (örneğin 1 için “1 elma”, 5 için “5 elma”) otomatik olarak seçer.
Değerli arkadaşlar bu yazımda elimden geldiğince Flutter’da Localization işlemini anlatmaya çalıştım.. Umarım sizler için faydalı olmuştur.
Konuyu bitirmeden önce lütfen localization değişken isimlerini doğru, güzel ve temiz kullanalım.. Anlaşılır ifadeler kullanalım. hello1 welcome4 gibi garip isimlendirmelerden uzak duralım..
İşin uygulama içinde dil değişikliği yapma kısmıda sizlere ev ödevi olsun..
Sonraki yazılarda görüşmek üzere..
Github: www.github.com/abdullah017
Linkedin: www.linkedin.com/in/abdullahtas
Stackoverflow: https://stackoverflow.com/users/13807726/abdullah-t
#FREEPALESTINA
