
Täielik Flutter'i lokaliseerimise juhend
ARB-failidest RTL-toeni: lokaliseeri Flutter'i rakendus easy_localizationiga, töötle iga keele mitmusevorme ja automatiseeri tõlked tehisintellektiga.
Paigalda easy_localization
Lisa pakett easy_localization faili pubspec.yaml. See on populaarseim Flutter'i i18n-pakett, mis toetab ARB- ja JSON-faile, mitmusevorme ning context'i laiendusi. Lisa SDK-st ka flutter_localizations kuupäevade, arvude ja tekstisuuna lokaaditeadlikuks vormindamiseks.
dependencies:
easy_localization: ^3.0.7
flutter_localizations:
sdk: flutterLoo ARB-tõlkefailid
Application Resource Bundle'i (ARB) failid on Flutter'i standardne lokaliseerimisvorming. Iga fail sisaldab võtme-väärtuse paare koos valikuliste metaandmetega, mis kirjeldavad tõlkijatele kohatäitjaid, mitmusereegleid ja konteksti. Loo kataloogi assets/translations üks fail lokaadi kohta.
{
"@@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"
}
}
}
}Seadista rakendus
Ümbritse rakendus EasyLocalizationi vidinaga. See haldab lokaadiolekut, laadib tõlked varafailidest ja pakub MaterialAppi vajalikke lokaadidelegaate. Kolm nõutavat delegaadiatribuuti on localizationsDelegates, supportedLocales ja locale, mis kõik on saadaval context'i laienduste kaudu.
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(),
);
}
}Tõlgi vidinad
Kasuta tõlgitud teksti hankimiseks mis tahes vidinas stringivõtmete laiendusmeetodit .tr(). Mitmusevormide jaoks kasuta .plural() koos koguse väärtusega. easy_localization pakub nii stringilaienduse süntaksit ('key'.tr()) kui ka context'i meetodi süntaksit (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)),
],
),
);
}
}Töötle mitmusevorme ja muutujaid
Flutter kasutab mitmusevormide jaoks ICU MessageFormat'it, sama standardit nagu iOS, Android ja veeb. Määra ARB-failides mitmusevormid süntaksiga {count, plural, ...}. Iga keel vajab oma CLDR-i mitmusereeglitel põhinevaid vorme. Araabia keeles on kuus vormi, vene keeles neli ja jaapani keeles üks.
// 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}));Toeta RTL-keeli
Flutter peegeldab kogu paigutuse automaatselt, kui lokaat on paremalt vasakule kirjutatav keel (araabia, heebrea, pärsia, urdu). Kood peab aga kasutama suunateadlikke vidinaid ja atribuute, et peegeldamine õigesti toimiks. Asenda jäigalt kodeeritud left/right väärtused start/end vastetega.
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 localeNutikad varulokaadiahelad
Kui pt-BR tõlge puudub, taandub Flutter vaikimisi otse inglise keelele, jättes täiesti sobivad pt-PT tõlked vahele. Pakett locale_chain parandab selle seadistatavate varulokaadiahelatega. Üks seadistusrida, migreerimist pole — olemasolevad .tr() kutsed lihtsalt töötavad.
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
);Automatiseeri tõlked
Kui lokaliseerimise seadistus on valmis, tõlgi ARB-failid tehisintellektiga. Palu IDE-s oma tehisintellekti abilisel ARB-lähtefail tõlkida või kasuta CI/CD-konveieris i18n Agent'i CLI-d. ARB-metaandmed (kohatäitjad, kirjeldused) annavad konteksti, mis parandab tõlkekvaliteeti.
# 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,deAutomatiseeri tõlkekvaliteet
Levinud komistuskivid
Tõlkefaile ei leita käitusajal
Vigane ARB-faili süntaks
Tõlkemuutused ei ilmu kuumlaadimisel
Jäigalt kodeeritud vasak/parem rikub RTL-i
Soovituslik failistruktuur
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.yamlProovi i18n Agent'i kohe
Kukuta tõlkefail siia
JSON, YAML, PO, XML, CSV, Markdown, Properties
või klõpsa faili valimiseks
Sihtkeeled
Varulokaat locale_chainiga
Kui piirkondlikust lokaadist, näiteks pt-BR-st, puudub tõlkevõti, liigub Flutter otse malli keelele ega kontrolli esmalt põhilokaati 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());Vaata meie varulokaadi juhendist kõigi toetatud raamistike ja 75 sisseehitatud ahela loendit. Learn more →