1-) FLUTTER - Çoklu dil desteği ekleme localizations kullanımı tr en de ru easy localization ile
EKRAN GÖRÜNTÜSÜ
UYARI GETX İLE KULLANIYORSAN EXTENSİON OLUŞTUR
1. ADIM StringLocalization.dart diye dosya oluştur ve title: Text('MyApp'.localized), //şeklide kullan
import 'package:easy_localization/easy_localization.dart'; kullanımı title: Text('MyApp'.trLocalized), //şeklide kullan
|
1-) pubspec.yaml
easy_localization: ^3.0.0 # bu kütüphane ile yapıcaz ama flutter_localizations danda yararlancaz
dropdown_button2: ^1.2.1 # dropdownbutton ile bayrak seçmek için
dev_dependencies:
flutter_test:
sdk: flutter
flutter_localizations: # yararlancaz
sdk: flutter
assets:
- assets/images/ # yolları tanıtmayı unutma
- assets/languages/ # yolları tanıtmaya unutma
2-) assets/languages/ klasörü
tr_TR.json
{
| en_US.json
{
|
3-) LocaleKeys.dart
import 'dart:ui';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'AppConstant.dart';
import 'CustomButtonTest.dart';
abstract class LocaleKeys {
static const hello= 'hello';
static String suankiDil = "assets/images/turkce.png";
static setLocale(BuildContext context, MenuItem item) {
switch (item) {
case MenuItems.turkce:
LocaleKeys.suankiDil = "assets/images/turkce.png";
context.setLocale(AppConstant.TR_LOCALE);
break;
case MenuItems.ingilizce:
LocaleKeys.suankiDil = "assets/images/ingilizce.png";
context.setLocale(AppConstant.EN_LOCALE);
break;
case MenuItems.rusca:
LocaleKeys.suankiDil = "assets/images/rusca.png";
context.setLocale(AppConstant.RU_LOCALE);
break;
case MenuItems.almanca:
LocaleKeys.suankiDil = "assets/images/almanca.png";
context.setLocale(AppConstant.DE_LOCALE);
break;
}
}
static Locale? varsayilanTelefonunDili(
Locale? locale, Iterable<Locale> supportedLocales) {
// Aktif edilecek parametre
/// [locale]: Cihazın dili null değilse
if (locale != null) {
switch (locale.languageCode) {
case "tr":
LocaleKeys.suankiDil = "assets/images/turkce.png";
break;
case "en":
LocaleKeys.suankiDil = "assets/images/ingilizce.png";
break;
case "de":
LocaleKeys.suankiDil = "assets/images/almanca.png";
break;
case "ru":
LocaleKeys.suankiDil = "assets/images/rusca.png";
break;
}
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
switch (locale.languageCode) {
case "tr":
return AppConstant.TR_LOCALE;
case "en":
return AppConstant.EN_LOCALE;
case "de":
return AppConstant.DE_LOCALE;
case "ru":
return AppConstant.RU_LOCALE;
}
}
}
}
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 AppConstant.TR_LOCALE;
}
}
4-) CustomButtonTest.dart
import 'package:dropdown_button2/dropdown_button2.dart';
import 'package:flutter/material.dart';
import 'LocaleKeys.dart';
class CustomButtonTest extends StatefulWidget {
const CustomButtonTest({Key? key}) : super(key: key);
@override
State<CustomButtonTest> createState() => _CustomButtonTestState();
}
class _CustomButtonTestState extends State<CustomButtonTest> {
@override
void initState() {
// TODO: implement initState
super.initState();
}
@override
Widget build(BuildContext context) {
return DropdownButtonHideUnderline(
child: DropdownButton2(
customButton: Container(
alignment: Alignment.center,
child: Padding(
padding: EdgeInsets.all(5),
child: Row(children: [
Image.asset(LocaleKeys.suankiDil),
Icon(Icons.arrow_downward)
],),
),
),
customItemsIndexes: const [4],
customItemsHeight: 8,
items: [
...MenuItems.firstItems.map(
(item) => DropdownMenuItem<MenuItem>(
value: item,
child: MenuItems.buildItem(item),
),
),
],
onChanged: (value) {
MenuItems.onChanged(context, value as MenuItem);
},
itemHeight: 55,
itemPadding: const EdgeInsets.only(left: 16, right: 16),
dropdownWidth: 180,
dropdownPadding: const EdgeInsets.symmetric(vertical: 6),
dropdownDecoration: BoxDecoration(
borderRadius: BorderRadius.circular(4),
color: Colors.white,
),
dropdownElevation: 8,
offset: const Offset(0, 8),
),
);
}
}
class MenuItem {
final String text;
final String logo;
const MenuItem({
required this.text,
required this.logo,
});
}
class MenuItems {
static const List<MenuItem> firstItems = [turkce, ingilizce, almanca,rusca];
static const turkce =
MenuItem(text: 'Türkçe', logo: "assets/images/turkce.png");
static const ingilizce =
MenuItem(text: 'English', logo: "assets/images/ingilizce.png");
static const almanca =
MenuItem(text: 'Deutsche', logo: "assets/images/almanca.png");
static const rusca =
MenuItem(text: 'русский', logo: "assets/images/rusca.png");
static Widget buildItem(MenuItem item) {
return Row(
children: [
Container(
width: 42,
height: 30,
decoration: BoxDecoration(
color: Colors.orange,
shape: BoxShape.rectangle,
image: new DecorationImage(
image: AssetImage(item.logo),
fit: BoxFit.cover,
),
),
),
const SizedBox(
width: 10,
),
Text(
item.text,
style: const TextStyle(
color: Colors.black, fontWeight: FontWeight.bold, fontSize: 13),
),
],
);
}
static onChanged(BuildContext context, MenuItem item) {
LocaleKeys.setLocale(context, item);
}
}
5-) AppConstant.dart
import 'package:flutter/widgets.dart';
class AppConstant {
static const TR_LOCALE = Locale("tr", "TR");
static const EN_LOCALE = Locale("en", "US");
static const RU_LOCALE = Locale("ru", "RU");
static const DE_LOCALE = Locale("de", "DE");
static const LANG_PATH = "assets/languages";
static const SUPPORTED_LOCALE = [
AppConstant.EN_LOCALE,
AppConstant.TR_LOCALE,
AppConstant.DE_LOCALE,
AppConstant.RU_LOCALE,
];
}
6-) main.dart
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:rmosflutterguest/langs/LocaleKeys.dart';
import 'langs/AppConstant.dart';
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
await EasyLocalization.ensureInitialized();
runApp(
EasyLocalization(
supportedLocales: AppConstant.SUPPORTED_LOCALE,
path: AppConstant.LANG_PATH,
//fallbackLocale: Locale('tr','TR'),
child: MyApp(),
),
);
}
class MyApp extends StatefulWidget {
const MyApp({Key? key}) : super(key: key);
static const String _title = 'Flutter Code Sample';
@override
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
localizationsDelegates: context.localizationDelegates,
supportedLocales: context.supportedLocales,
title: MyApp._title,
locale: context.locale,
home: Row(
children: [
SizedBox(
width: 20,
),
Card(
child: Container(
child: CustomButtonTest(),
),
),
],
),
//BottomNavigationPage(), // LoginPage1()
builder: EasyLoading.init(),
localeResolutionCallback: LocaleKeys.varsayilanTelefonunDili,
);
}
}
7-) BAYRAKLAR
bayraklar : https://github.com/madebybowtie/FlagKit/blob/master/Assets/Flags.md
8-) KULLANIMI
KULLANIMI : Text(LocaleKeys.hello.tr()) veya Text('hello').tr() veya tr('hello') veya print('hello'.tr());
DİL DEĞİŞTİRMEK İÇİN : onPressed: () {LocaleKeys.setLocale(context, item); } veya context.setLocale(AppConstant.EN_LOCALE);
VARSAYILAN TELEFONUN DİLİ : LocaleKeys.varsayilanTelefonunDili
9-) KAYNAK
kaynak : https://www.mobiler.dev/post/flutter-da-coklu-dil-destegi-localization
kaynak : https://pub.dev/packages/easy_localization/example