Skip to main content

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.

1

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.

easy_localization pakub lühikeseks tõlkejuurdepääsuks context'i laiendusi, nagu context.tr() ja 'key'.tr(). See haldab arenduse ajal lokaatide laadimist, säilitamist ja tõlkefailide kuumlaadimist.
pubspec.yaml
dependencies:
  easy_localization: ^3.0.7
  flutter_localizations:
    sdk: flutter
2

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

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"
      }
    }
  }
}
@-eesliitega võtmed, näiteks @greeting, on metaandmed — need kirjeldavad enda kohal olevat stringi. Lisa kohatäitjate tüübid ja näited, et aidata tõlkijatel täpseid tõlkeid luua. Metaandmevõtmed eemaldatakse käitusajal ega tekita lisakoormust.
3

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.

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(),
    );
  }
}
Tõrge "Easy Localization not initialized" tähendab, et unustasid enne runApp() käivitamist kutsuda EasyLocalization.ensureInitialized(). Seda tuleb await'ida pärast WidgetsFlutterBinding.ensureInitialized() ja enne runApp().
4

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

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)),
        ],
      ),
    );
  }
}
Kui tõlked tagastavad tõlgitud teksti asemel töötlemata võtmeid, kontrolli järgmist: 1) EasyLocalizationi vidin ümbritseb MaterialAppi, mitte vastupidi. 2) Tõlkefailid on deklareeritud faili pubspec.yaml assets-jaotises. 3) EasyLocalizationi failitee vastab tegelikule kataloogistruktuurile.
5

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.

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}));
Ära kunagi kodeeri ainsuse või mitmuse loogikat jäigalt tingimusega if (count == 1). Sellised keeled nagu prantsuse keel käsitlevad arvu 0 ainsusena. Vene, poola ja araabia keeles on mitmusevorme, mida inglise keeles üldse pole. Kasuta alati ICU mitmusesüntaksit ja lase raamistikul õige vorm valida.
6

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.

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
Testi RTL-i, määrates rakenduse lokaadiks ajutiselt araabia keele (Locale('ar')). Flutter peegeldab kogu kasutajaliidest — navigeerimissahtlid avanevad paremalt, tagasinooled pöörduvad ja tekst joondub paremale. Kohandatud paigutuste õigeks peegeldamiseks kasuta EdgeInsetsDirectionalit, AlignmentDirectionalit ja BorderRadiusDirectionalit.
7

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

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 sisaldab sisseehitatud varulokaadiahelaid portugali, hispaania, prantsuse, saksa, itaalia, hollandi, norra ja malai keele piirkondlike variantide jaoks. pt-BR kasutaja näeb enne inglise keelt pt-PT sisu. es-MX kasutaja näeb enne vaikelokaati es-419 ja seejärel es-i.
8

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.

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
Tõlgi järk-järgult — kui lisad ARB-lähtefaili uusi võtmeid, tõlgi kõigi failide uuesti loomise asemel ainult diff. Nii säilivad inimeste ülevaadatud tõlked ja ARB-metaandmed.

Automatiseeri tõlkekvaliteet

Leia i18n-validate'i abil puuduvad võtmed ja katkised kohatäitjad enne avaldamist. Testi kasutajaliidest i18n-pseudo abil pseudotõlgetega enne päris tõlgete saabumist.

Levinud komistuskivid

Tõlkefaile ei leita käitusajal

ARB- või JSON-failid tuleb deklareerida faili pubspec.yaml assets-jaotises. Kui see samm puudub, ei leia Flutter faile käitusajal, kuigi need on kettal olemas. Lisa: assets: - assets/translations/

Vigane ARB-faili süntaks

ARB-failid on range JSON — lõpus olevaid komasid, ülakomasid ega kommentaare ei lubata. Üks süntaksiviga takistab märkamatult kogu faili laadimist. Valideeri ARB-failid JSON-i linteriga enne tõlkeprobleemide silumist.

Tõlkemuutused ei ilmu kuumlaadimisel

easy_localization puhverdab tõlked mällu. Uute võtmete lisamine või olemasolevate tõlgete muutmine võib vajada täielikku kuumtaaskäivitust, mitte kuumlaadimist. Kasuta arenduse ajal pärast tõlkefailide muutmist kuumtaaskäivitust (Shift+R).

Jäigalt kodeeritud vasak/parem rikub RTL-i

EdgeInsets.only(left: 16) kasutamine EdgeInsetsDirectional.only(start: 16) asemel takistab Flutter'il RTL-keelte jaoks paigutust peegeldamast. Otsi koodibaasist EdgeInsets, Alignment ja BorderRadius ilma Directional-sufiksita.

Soovituslik failistruktuur

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

Proovi i18n Agent'i kohe

Kukuta tõlkefail siia

JSON, YAML, PO, XML, CSV, Markdown, Properties

või klõpsa faili valimiseks

Sihtkeeled

Registreerumine pole vajalikKohene hinnang

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.

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());

Vaata meie varulokaadi juhendist kõigi toetatud raamistike ja 75 sisseehitatud ahela loendit. Learn more →

Korduma kippuvad küsimused