Skip to main content

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.

1

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.

easy_localization nodrošina tādus konteksta paplašinājumus kā context.tr() un 'key'.tr() īsai tulkojumu piekļuvei. Tas apstrādā lokalizāciju ielādi, saglabāšanu un tulkošanas failu karsto pārlādi izstrādes laikā.
pubspec.yaml
dependencies:
  easy_localization: ^3.0.7
  flutter_localizations:
    sdk: flutter
2

Izveidot 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.

assets/translations/en.arb
{
  "@@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"
      }
    }
  }
}
Ar prefiksu @ apzīmētās atslēgas (piemēram, @greeting) ir metadati: tās apraksta virs tām esošo virkni. Iekļaujiet vietturu tipus un piemērus, lai tulkotāji varētu radīt precīzus tulkojumus. Izpildlaikā šīs metadatu atslēgas tiek noņemtas un nerada papildu slodzi.
3

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.

lib/main.dart
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(),
    );
  }
}
„Easy Localization not initialized“ — šī kļūda nozīmē, ka pirms runApp() aizmirsāt izsaukt EasyLocalization.ensureInitialized(). Tā jāgaida pēc WidgetsFlutterBinding.ensureInitialized() un pirms runApp().
4

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')).

lib/widgets/home_page.dart
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)),
        ],
      ),
    );
  }
}
Ja tulkojumi atgriež neapstrādātas atslēgas tulkota teksta vietā, pārbaudiet: 1) EasyLocalization logrīks ietver MaterialApp, nevis otrādi; 2) tulkošanas faili ir deklarēti pubspec.yaml sadaļā assets; 3) faila ceļš EasyLocalization atbilst faktiskajai direktoriju struktūrai.
5

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.

Plural forms by language
// 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} товаров}}"
Variables and named arguments
// 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}));
Nekad tieši neierakstiet vienskaitļa vai daudzskaitļa loģiku ar if (count == 1). Tādas valodas kā franču uzskata 0 par vienskaitli. Krievu, poļu un arābu valodā ir daudzskaitļa formas, kuru angļu valodā vispār nav. Vienmēr izmantojiet ICU daudzskaitļa sintaksi un ļaujiet sistēmai izvēlēties pareizo formu.
6

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.

lib/widgets/adaptive_layout.dart
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,
          ),
        ],
      ),
    );
  }
}
RTL-aware widget patterns
// 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 locale
Testējiet RTL, īslaicīgi iestatot lietotnes lokalizāciju uz arābu (Locale('ar')). Flutter spoguļo visu UI: navigācijas atvilktnes atveras no labās puses, atpakaļbultiņas apgriežas un teksts tiek līdzināts pa labi. Izmantojiet EdgeInsetsDirectional, AlignmentDirectional un BorderRadiusDirectional, lai pielāgotie izkārtojumi spoguļotos pareizi.
7

Viedas 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.

lib/main.dart with LocaleChain
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.
Custom fallback configuration
// 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
);
locale_chain ietver iebūvētas atkāpšanās ķēdes portugāļu, spāņu, franču, vācu, itāļu, nīderlandiešu, norvēģu un malajiešu valodu reģionālajiem variantiem. pt-BR lietotājs pirms angļu valodas redzēs pt-PT saturu. es-MX lietotājs pirms noklusējuma lokalizācijas redzēs es-419, tad es.
8

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.

Terminal
# 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,de
Tulkojiet pakāpeniski — pievienojot avota ARB failam jaunas atslēgas, tulkojiet tikai izmaiņas, nevis ģenerējiet visus failus no jauna. Tas saglabā cilvēku pārskatītos tulkojumus un ARB metadatus neskartus.

Automatizēt tulkojumu kvalitāti

Ar i18n-validate pirms izlaišanas atrodiet trūkstošās atslēgas un bojātos vietturus. Kamēr īstie tulkojumi vēl nav gatavi, pārbaudiet UI ar i18n-pseudo pseidotulkojumiem.

Biežākās kļūdas

Tulkošanas faili nav atrodami izpildlaikā

ARB/JSON failiem jābūt deklarētiem pubspec.yaml sadaļā assets. Izlaižot šo soli, Flutter neatradīs failus izpildlaikā, pat ja tie ir diskā. Pievienojiet: assets: - assets/translations/

Nederīga ARB faila sintakse

ARB faili ir stingrs JSON: bez komatiem beigās, vienpēdiņām vai komentāriem. Viena sintakses kļūda klusām neļauj ielādēt visu failu. Pirms tulkošanas problēmu atkļūdošanas validējiet ARB failus ar JSON analizatoru.

Tulkojumu izmaiņas neparādās pēc karstās pārlādes

easy_localization glabā tulkojumus atmiņā. Pievienojot jaunas atslēgas vai mainot esošus tulkojumus, var būt vajadzīga pilna karstā restartēšana (nevis karstā pārlāde), lai izmaiņas stātos spēkā. Izstrādes laikā pēc tulkošanas failu rediģēšanas veiciet karsto restartēšanu (Shift+R).

Tieši ierakstīti left/right sabojā RTL

Izmantojot EdgeInsets.only(left: 16) EdgeInsetsDirectional.only(start: 16) vietā, Flutter nevar spoguļot izkārtojumu RTL valodām. Kodu bāzē meklējiet EdgeInsets, Alignment un BorderRadius bez sufiksa Directional.

Ieteicamā failu struktūra

Project Structure
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.yaml

Izmēģ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

Reģistrācija nav vajadzīgaTūlītēja tāme

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.

Terminal
flutter pub add locale_chain
Configuration
import '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 →

Bieži uzdotie jautājumi