
Pilnīgs Flutter lokalizācijas ceļvedis
No ARB failiem līdz RTL atbalstam: lokalizējiet Flutter lietotni ar easy_localization, apstrādājiet daudzskaitli katrai valodai un automatizējiet tulkošanu ar MI.
Instalēt easy_localization
Pievienojiet pakotni easy_localization pubspec.yaml. Tā ir populārākā Flutter i18n pakotne ar ARB/JSON failu, daudzskaitļa un konteksta paplašinājumu atbalstu. Pievienojiet arī flutter_localizations no SDK lokalizācijai atbilstošai datumu, skaitļu un teksta virziena formatēšanai.
dependencies:
easy_localization: ^3.0.7
flutter_localizations:
sdk: flutterIzveidot ARB tulkošanas failus
Application Resource Bundle (ARB) faili ir standarta Flutter lokalizācijas formāts. Katrā failā ir atslēgu un vērtību pāri ar papildu metadatiem, kas apraksta vietturus, daudzskaitļa kārtulas un tulkotājiem paredzēto kontekstu. Direktorijā assets/translations izveidojiet vienu failu katrai lokalizācijai.
{
"@@locale": "en",
"appTitle": "My App",
"@appTitle": {
"description": "The title of the application"
},
"greeting": "Hello, {name}!",
"@greeting": {
"description": "Greeting with user name",
"placeholders": {
"name": {
"type": "String",
"example": "Alice"
}
}
},
"itemCount": "{count, plural, =0{No items} =1{1 item} other{{count} items}}",
"@itemCount": {
"description": "Number of items in the cart",
"placeholders": {
"count": {
"type": "num",
"format": "compact"
}
}
}
}Konfigurēt lietotni
Ietveriet lietotni ar EasyLocalization logrīku. Tas pārvalda lokalizācijas stāvokli, ielādē tulkojumus no resursu failiem un nodrošina MaterialApp vajadzīgos lokalizācijas delegātus. Trīs obligātie delegātu rekvizīti ir localizationsDelegates, supportedLocales un locale — visi pieejami ar konteksta paplašinājumiem.
import 'package:flutter/material.dart';
import 'package:easy_localization/easy_localization.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await EasyLocalization.ensureInitialized();
runApp(
EasyLocalization(
supportedLocales: [
Locale('en'),
Locale('ar'),
Locale('ja'),
Locale('de'),
],
path: 'assets/translations', // Path to your ARB/JSON files
fallbackLocale: Locale('en'),
child: MyApp(),
),
);
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
localizationsDelegates: context.localizationDelegates,
supportedLocales: context.supportedLocales,
locale: context.locale,
home: HomePage(),
);
}
}Tulkot logrīkus
Lai iegūtu tulkotu tekstu jebkurā logrīkā, virkņu atslēgām izmantojiet paplašinājuma metodi .tr(). Daudzskaitlim izmantojiet .plural() ar skaita vērtību. easy_localization nodrošina gan virknes paplašinājuma sintaksi ('key'.tr()), gan konteksta metodes sintaksi (context.tr('key')).
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
class HomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('appTitle'.tr()), // Simple key
),
body: Column(
children: [
// String with variable interpolation
Text('greeting'.tr(args: ['Alice'])),
// Named arguments
Text('greeting'.tr(namedArgs: {'name': 'Alice'})),
// Plural form
Text('itemCount'.plural(3)),
],
),
);
}
}Apstrādāt daudzskaitli un mainīgos
Flutter daudzskaitlim izmanto ICU MessageFormat — to pašu standartu, ko iOS, Android un tīmeklis. ARB failos definējiet daudzskaitļa formas ar sintaksi {count, plural, ...}. Katrai valodai vajadzīgs savs formu komplekts atbilstoši CLDR daudzskaitļa kārtulām. Arābu valodā ir 6 formas, krievu — 4, japāņu — 1.
// English: 3 useful forms (=0, =1, other)
"itemCount": "{count, plural, =0{No items} =1{1 item} other{{count} items}}"
// Arabic: 6 forms (=0, =1, =2, few, many, other)
"itemCount": "{count, plural, =0{لا عناصر} =1{عنصر واحد} =2{عنصران} few{{count} عناصر} many{{count} عنصرًا} other{{count} عنصر}}"
// Japanese: 1 form (other)
"itemCount": "{count, plural, other{{count}個のアイテム}}"
// German: 2 forms (=1, other)
"itemCount": "{count, plural, =1{1 Artikel} other{{count} Artikel}}"
// Russian: 3 forms (one, few, many)
"itemCount": "{count, plural, =0{Нет товаров} one{{count} товар} few{{count} товара} many{{count} товаров} other{{count} товаров}}"// Simple variable
"welcome": "Welcome, {name}!"
// Multiple variables
"orderStatus": "Order #{orderId} — {status}"
// Variable in plural context
"unreadMessages": "{count, plural, =0{No unread messages} =1{1 unread message from {sender}} other{{count} unread messages}}"
// In widgets:
Text('welcome'.tr(namedArgs: {'name': userName}));
Text('orderStatus'.tr(namedArgs: {'orderId': '1234', 'status': 'Shipped'}));
Text('unreadMessages'.plural(count, namedArgs: {'sender': senderName}));Atbalstīt RTL valodas
Ja lokalizācija ir no labās uz kreiso rakstāma valoda (arābu, ebreju, persiešu, urdu), Flutter automātiski spoguļo visu izkārtojumu. Taču, lai tas darbotos pareizi, kodā jāizmanto virzienu apzinoši logrīki un rekvizīti. Tieši ierakstītos left/right aizstājiet ar start/end ekvivalentiem.
import 'package:flutter/material.dart';
class AdaptiveLayout extends StatelessWidget {
@override
Widget build(BuildContext context) {
final isRtl = Directionality.of(context) == TextDirection.rtl;
return Scaffold(
body: Row(
children: [
// Use start/end instead of left/right
Expanded(
child: Padding(
padding: EdgeInsetsDirectional.only(
start: 16.0, // Leading edge (left in LTR, right in RTL)
end: 8.0, // Trailing edge
),
child: Text('content'.tr()),
),
),
// Flip icons for RTL
Icon(
isRtl ? Icons.arrow_back : Icons.arrow_forward,
),
],
),
);
}
}// Use Directional widgets for RTL-aware layouts
EdgeInsetsDirectional.only(start: 16, end: 8) // Not EdgeInsets.only(left: 16, right: 8)
AlignmentDirectional.centerStart // Not Alignment.centerLeft
BorderRadiusDirectional.only(topStart: Radius.circular(8))
// Automatically mirrors when locale changes to Arabic, Hebrew, etc.
// No conditional logic needed — Flutter handles text direction from localeViedas lokalizāciju atkāpšanās ķēdes
Pēc noklusējuma, ja trūkst pt-BR tulkojuma, Flutter uzreiz atkāpjas uz angļu valodu un izlaiž labus pt-PT tulkojumus. Pakotne locale_chain to novērš ar konfigurējamām atkāpšanās ķēdēm. Viena iestatīšanas rinda, bez migrācijas — esošie .tr() izsaukumi vienkārši darbojas.
import 'package:locale_chain/locale_chain.dart';
import 'package:locale_chain/easy_localization.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await EasyLocalization.ensureInitialized();
LocaleChain.configure(); // Enable smart fallback chains
runApp(
EasyLocalization(
supportedLocales: [
Locale('en'),
Locale('pt', 'BR'),
Locale('pt', 'PT'),
Locale('es'),
Locale('es', 'MX'),
],
path: 'assets/translations',
assetLoader: LocaleChainAssetLoader( // Swap in the chain loader
baseLoader: RootBundleAssetLoader(),
),
fallbackLocale: Locale('en'),
child: MyApp(),
),
);
}
// Result: pt-BR user sees pt-PT translations when pt-BR keys are missing,
// instead of falling back directly to English.// Override specific chains while keeping built-in defaults
LocaleChain.configure(
fallbacks: {
'pt-BR': ['pt-PT', 'pt'], // pt-BR → pt-PT → pt → en
'es-MX': ['es-419', 'es'], // es-MX → es-419 → es → en
'fr-CA': ['fr'], // fr-CA → fr → en
},
);
// Or replace all defaults with your own chains
LocaleChain.configure(
fallbacks: {
'zh-Hant-HK': ['zh-Hant-TW', 'zh-Hans'],
'pt-BR': ['pt-PT', 'pt'],
},
mergeDefaults: false, // Only your chains, no built-in defaults
);Automatizēt tulkošanu
Kad lokalizācijas iestatīšana ir pabeigta, tulkojiet ARB failus ar MI. IDE lūdziet MI asistentam iztulkot avota ARB failu vai izmantojiet i18n Agent CLI CI/CD konveijerā. ARB metadati (vietturi, apraksti) sniedz kontekstu, kas uzlabo tulkojuma kvalitāti.
# In your IDE, ask your AI assistant:
> Translate assets/translations/en.arb to Arabic, Japanese, and German
✓ ar.arb created (1.4s)
✓ ja.arb created (1.2s)
✓ de.arb created (1.1s)
# Or use the CLI in CI/CD:
npx i18n-agent translate assets/translations/en.arb --lang ar,ja,deAutomatizēt tulkojumu kvalitāti
Biežākās kļūdas
Tulkošanas faili nav atrodami izpildlaikā
Nederīga ARB faila sintakse
Tulkojumu izmaiņas neparādās pēc karstās pārlādes
Tieši ierakstīti left/right sabojā RTL
Ieteicamā failu struktūra
my_flutter_app/
├── assets/
│ └── translations/
│ ├── en.arb # Source language (English)
│ ├── ar.arb # Arabic (with 6 plural forms)
│ ├── de.arb # German
│ ├── ja.arb # Japanese
│ ├── pt-BR.arb # Brazilian Portuguese
│ └── pt-PT.arb # European Portuguese
├── lib/
│ ├── main.dart # App entry with EasyLocalization
│ ├── app.dart # MaterialApp with locale delegates
│ └── widgets/
│ └── language_switcher.dart
├── pubspec.yaml # Dependencies
└── analysis_options.yamlIzmēģiniet i18n Agent tūlīt
Nometiet tulkošanas failu šeit
JSON, YAML, PO, XML, CSV, Markdown, Properties
vai noklikšķiniet, lai izvēlētos
Mērķa valodas
Lokalizācijas atkāpšanās ar locale_chain
Ja reģionālajā lokalizācijā, piemēram, pt-BR, trūkst tulkojuma atslēgas, Flutter uzreiz pāriet uz veidnes valodu, nevis vispirms pārbauda vecāklokalizāciju pt.
flutter pub add locale_chainimport 'package:locale_chain/locale_chain.dart';
LocaleChain.configure(fallbacks: {
'pt-BR': ['pt', 'en'],
'zh-Hant-HK': ['zh-Hant', 'zh', 'en'],
});
LocaleChainAssetLoader(baseLoader: RootBundleAssetLoader());Pilnu atbalstīto sistēmu sarakstu un 75 iebūvētās ķēdes skatiet mūsu lokalizāciju atkāpšanās ceļvedī. Learn more →