GDPR-kompatibel organisation

ISO 27001-certifierad organisation

SOC II-kompatibel organisation

Flutter-lokalisering: ARB-filer, intl och gen-l10n förklarade

Flutter-lokalisering anpassar en applikations meddelanden och gränssnitt för olika språkområden. I det inbyggda arbetsflödet ger flutter_localizations stöd för lokaliserade ramverkswidgetar, medan ARB-resurser och gen-l10n genererar applikationens AppLocalizations-API, och intl stöder språkberoende meddelanden och formatering.

Boka en demo

Boka en demo

Ta med ett litet ARB-exempel och de kontroller ert bygge kräver

Smartcat-projekt för programvarulokalisering som visar översättningsförloppet per målspråk

Över 80 av världens största företag har valt Smartcat

Konfigurera flutter_localizations och gen-l10n

Den här guiden sätter upp ett litet exempel på engelska och spanska, förklarar metadata för meddelanden och jämför vanliga paketlösningar. Den visar också vad som bör valideras innan en översättningsplattform kopplas till ett Flutter-projekt.

Använd en enda lokaliseringsgenerator och ange tydligt var dess in- och utdata finns. Exemplet nedan förutsätter en befintlig Flutter-applikation med egna SDK-begränsningar och normal projektkonfiguration.

Slå samman relevanta poster i pubspec.yaml; duplicera inte avsnitten dependencies eller flutter:

dependencies:
  flutter:
    sdk: flutter
  flutter_localizations:
    sdk: flutter
  intl: any

flutter:
  generate: true

Hämta beroenden med flutter pub get. Posten intl: any följer det officiella konfigurationsmönstret och låter beroendeupplösningen välja den version som är kompatibel med Flutter SDK; behåll applikationens låsfil och er normala process för granskning av beroenden.

Skapa l10n.yaml i projektets rot:

arb-dir: lib/l10n
template-arb-file: app_en.arb
output-localization-file: app_localizations.dart

Använd den aktuella guiden för internationalisering i Flutter för SDK-specifik konfiguration. Genererade lokaliseringsfiler hör hemma i applikationens källträd i det moderna arbetsflödet. Exemplet importerar från lib/l10n; undvik att kopiera en gammal syntetisk package:flutter_gen-import till en ny konfiguration. Se migreringsanteckningen om genererad källkod.

Skriv ARB-filer med kontext och typade platshållare

En ARB-fil är ett JSON-baserat resurspaket med meddelanden och valfri metadata. Håll meddelandenycklarna stabila, skriv fullständiga meddelanden och använd metadata för att förklara hur texten används.

Skapa lib/l10n/app_en.arb:

{
  "@@locale": "en",
  "appTitle": "Reading room",
  "@appTitle": {
    "description": "Title of the sample reading application"
  },
  "welcomeName": "Welcome, {name}",
  "@welcomeName": {
    "description": "Greeting on the home screen",
    "placeholders": {
      "name": {"type": "String", "example": "Sam"}
    }
  },
  "savedBooks": "{count, plural, =0{No saved books} one{1 saved book} other{{count} saved books}}",
  "@savedBooks": {
    "description": "Number of books saved to the user's library",
    "placeholders": {
      "count": {"type": "int"}
    }
  },
  "readingState": "{state, select, active{Reading now} paused{Reading paused} other{Ready to read}}",
  "@readingState": {
    "description": "Reading status; state is active, paused or another value",
    "placeholders": {
      "state": {"type": "String"}
    }
  }
}

Skapa lib/l10n/app_es.arb:

{
  "@@locale": "es",
  "appTitle": "Sala de lectura",
  "welcomeName": "Te damos la bienvenida, {name}",
  "savedBooks": "{count, plural, =0{No hay libros guardados} one{1 libro guardado} other{{count} libros guardados}}",
  "readingState": "{state, select, active{Leyendo ahora} paused{Lectura en pausa} other{Todo listo para leer}}"
}

Mallen innehåller den platshållarmetadata som generatorn använder. Den lokaliserade filen bevarar meddelandenycklar, platshållarnamn och select-identifierare medan den användarvända formuleringen ändras. De spanska exemplen illustrerar mekaniken; produktionstext bör granskas av modersmålstalare i sitt faktiska produktsammanhang.

Kör flutter gen-l10n efter att du har lagt till eller ändrat resurser. Behandla generatorfel som konkreta resursproblem och åtgärda dem innan filerna integreras i en release.

Koppla de genererade meddelandena till MaterialApp

Registrera de genererade delegaterna och de språk som stöds, och läs sedan lokaliserade meddelanden från en kontext under applikationswidgeten.

Följande exempel hör hemma i lib/main.dart efter genereringen:

import 'package:flutter/material.dart';
import 'l10n/app_localizations.dart';

void main() => runApp(const ReadingApp());

class ReadingApp extends StatelessWidget {
  const ReadingApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      localizationsDelegates: AppLocalizations.localizationsDelegates,
      supportedLocales: AppLocalizations.supportedLocales,
      home: const ReadingHome(),
    );
  }
}

class ReadingHome extends StatelessWidget {
  const ReadingHome({super.key});

  @override
  Widget build(BuildContext context) {
    final messages = AppLocalizations.of(context)!;
    return Scaffold(
      appBar: AppBar(title: Text(messages.appTitle)),
      body: Padding(
        padding: const EdgeInsetsDirectional.all(16),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Text(messages.welcomeName('Sam')),
            Text(messages.savedBooks(3)),
            Text(messages.readingState('active')),
          ],
        ),
      ),
    );
  }
}
ReadingHome har tillgång till lokaliseringarna som tillhandahålls av MaterialApp. Att hämta AppLocalizations från den yttre widgetens kontext skulle leta ovanför den provider som widgeten själv skapar. Dokumentationen för Localizations-API:t förklarar hur lokaliserade resurser görs tillgängliga för underordnade widgetar.

Det genererade API:t gör skillnaden mellan ett enkelt meddelande och ett meddelande med argument synlig i koden. appTitle nås som ett värde; welcomeName, savedBooks och readingState tar emot de värden som behövs för att bygga meddelandena.

Hantera plural- och select-meddelanden medvetet

Pluralmeddelanden väljer formulering utifrån ett antal och målspråkets grammatik. Select-meddelanden väljer en gren utifrån en identifierare som applikationen tillhandahåller. Bevara syntaxen och identifierarna och översätt texten som varje gren visar.

Pluralformer

I exemplet ger =0 en uttrycklig mening för tomt tillstånd. Grenarna one och other täcker de former som exempelspråken använder; de är ingen universell mall för alla målspråk. Ge granskaren tillräckligt med sammanhang för att ta fram de former som språket kräver och de värden appen kan producera.

Select-meddelanden

Värden som active och paused är programidentifierare. Om de översätts kopplas resursen bort från koden som tillhandahåller dem. Grenen other ger meddelandet en reserv för värden som inte matchar någon namngiven gren.

Fullständiga meddelanden

Undvik att sätta ihop fragment som ett översatt verb, ett antal och ett översatt substantiv. Ett fullständigt meddelande låter målspråket styra ordföljden. Förklara värdena, förväntade intervall och skärmkontexten i instruktionerna så att granskarna kan bedöma meningen så som användarna kommer att se den.

Jämför paket för Flutter-lokalisering

Välj paket utifrån resursformat, applikationsarkitektur och underhållsbehov. Paketen nedan har olika konventioner; att använda mer än en generator för samma meddelanden skapar onödig oklarhet.

MetodTypiska resurserKodgenereringPluralhanteringPassar när
Inbyggd gen-l10nARBGenererar typade Dart-accessorerMeddelandesyntax i ICU-stilDu vill använda Flutters officiella resursarbetsflöde
easy_localizationJSON som standard, med fler inläsare tillgängligaValfria genereringsverktygPaketets plural-API:er och språkmedvetna reglerDu föredrar dess konventioner för inläsning av resurser och språkhantering
GetX-översättningarMappar med språk som nycklar i det dokumenterade grundläggande arbetsflödetKrävs inte för det grundläggande map-API:ttrPlural använder nycklar för singular och plural; bedöm mer komplex grammatik separatApplikationen använder redan GetX och dess översättningsmodell uppfyller kraven

Läs den aktuella dokumentationen för easy_localization och dokumentationen för GetX innan du väljer. Testa reservbeteende, parametrar, pluralkategorier och extraheringsflöden med era riktiga meddelanden. Ett bekvämt API för engelska strängar bevisar inte täckning för alla språk ni planerar att lansera.

intl är ingen konkurrerande plattform för översättningshantering. Paketet tillhandahåller internationaliseringsverktyg som används i lokaliseringsarbetsflöden. gen-l10n genererar applikationsaccessorer från ARB-resurser. Det separata paketet intl_utils genererar också lokaliseringskod, men dess paketsida var markerad som avvecklad vid kontroll den 30 oktober 2026. Kontrollera underhållsstatusen innan du använder det i ett nytt projekt.

Testa språkbyte, RTL och textexpansion

Testa både att resurserna är korrekta och hur översatt text beter sig i gränssnittet. En lyckad JSON-tolkning eller kodgenerering visar inte att en skärm är begriplig och användbar.

Språkbyte

För en riktad utvecklingskontroll kan du sätta MaterialApp.locale till ett värde som stöds, till exempel const Locale('es'). För en språkväljare i produktion bör det valda språket ligga i applikationens tillstånd, preferensen sparas enligt era produktkrav och det finnas ett sätt att följa systemspråket. Validera en sparad preferens mot de språk som den aktuella appversionen faktiskt stöder.

Layouter för höger-till-vänster

Använd riktningsberoende layout-API:er för element som ska följa läsriktningen. Kontrollera utfyllnad, justering, navigeringselement och innehåll med blandad riktning i ett verkligt höger-till-vänster-språk. Utgå inte från att alla ikoner ska speglas: en riktningspil för navigering och en varumärkessymbol har olika betydelse.

Textexpansion

Testa långa översättningar och större textstorlekar. Granska knappar, flikar, dialogrutor, tomma vyer, felmeddelanden och smala layouter. Ta med dynamiska värden som långa namn och antal så att layouten kontrolleras med det meddelande användarna faktiskt får.

Använd en praktisk testmatris:

KontrollExempel
ResurstäckningVarje obligatorisk mallnyckel har ett avsiktligt lokaliserat värde eller en reserv
MeddelandeargumentPlatshållarnamn och typer förblir kompatibla med de genererade metoderna
AntalsbeteendeNoll, ett och värden som testar målspråkets ytterligare former
Select-beteendeKända tillstånd plus ett oväntat värde som hamnar i other
SpråkbeteendeSystemspråk, uttryckligt val, omstart och preferens som inte stöds
LayoutExpanderad text, stora teckensnittsinställningar och höger-till-vänster-innehåll
BetydelseGranskning av modersmålstalare för viktiga användarflöden

För processens språkliga del kan du använda arbetsflödet för lokaliseringstestning. Håll språkligt godkännande och funktionella testresultat synliga som separata underlag för releasen.

Planera lokalisering och sökbarhet för Flutter web separat

Flutter web kan använda lokaliserade applikationsresurser, men att lokalisera gränssnittet skapar inte automatiskt en SEO-redo flerspråkig webbplats. Språkval, routning, metadata och innehållets sökbarhet är fortfarande arkitekturbeslut.

Flutters vanliga frågor om web beskriver fokus på applikationsupplevelser och rekommenderar ett dokumentorienterat angreppssätt för statiskt, textrikt webbinnehåll. Överväg separata HTML-baserade sidor för marknadsföring, hjälp och redaktionellt innehåll när de sidorna behöver prestera i organisk sökning.

Håll terminologin samstämmig mellan appen och de offentliga sidorna. En besökare från sökningen ska känna igen funktionsnamnet när hen går från den lokaliserade landningssidan till applikationen, även om de två ytorna renderas med olika system.

Validera ett översättningsarbetsflöde för ARB innan du skalar upp det

Behandla ARB som en strukturerad applikationsresurs, inte bara som en fil med textvärden. En översättningsöverlämning måste bevara nycklar, metadata, platshållare och meddelandesyntax och sedan returnera filer som klarar generering och apptester.

Smartcats dokumenterade format för programvaruprojekt omfattar import av JSON, YAML, Android XML, iOS .strings och LocJSON. Den dokumentation som granskades för den här guiden visar inte inbyggt stöd för ARB eller ett testat arbetsflöde för konvertering från ARB till JSON. Utgå inte från att en ändrad filändelse bevisar kompatibilitet. Se dokumentationen för programvaruprojekt.

Använd följande som ett förslag på valideringsprocedur tillsammans med ert implementeringsteam, inte som ett redan testat recept för en koppling:

  1. Välj ett representativt urval

    Välj ett litet ARB-urval med enkla strängar, metadata, typade platshållare, pluralformer och select.

  2. Bekräfta import och export

    Bekräfta den import-/exportmetod som stöds med produktteamet, inklusive hur @-metadata och ICU-meddelanden hanteras.

  3. Tillhandahåll språkresurser och kontext

    Tillhandahåll en ordlista, översättningsminne där det är lämpligt och tydlig kontext för varje meddelande.

  4. Översätt och skydda strukturen

    Översätt och granska den användarvända texten och skydda samtidigt programidentifierare och struktur.

  5. Jämför och återställ

    Jämför de returnerade resurserna med källkontraktet och återställ dem till de förväntade projektsökvägarna.

  6. Generera och testa

    Kör flutter gen-l10n, statisk analys och relevanta tester i projektets låsta SDK-miljö.

  7. Granska och dokumentera

    Granska det lokaliserade gränssnittet och dokumentera den godkända källversionen.

Automatisera synkroniseringen med repositoryt först när den rundturen fungerar. Definiera vem som hanterar källändringar, hur granskningsstatus ogiltigförklaras och hur genererade artefakter hanteras. Ha ARB-resurserna under versionshantering som sanningskälla för applikationens arbetsflöde.

Gå igenom ert arbetsflöde för Flutter-översättning

Vanliga fel och vad du ska kontrollera först

SymtomKontrollera först
Den genererade importen hittas inteAtt genereringen lyckades och att importen matchar den konfigurerade utdatasökvägen
AppLocalizations.of(context) är inte tillgängligtAtt kontexten ligger under applikationens lokaliseringsprovider
En meddelandemetod har oväntade argumentMallens platshållarmetadata och det genererade API:t
En select visar alltid reservgrenenAtt applikationens identifierare exakt matchar resursgrenen
Ett språk saknasResursfiler, språk som stöds och konfigurationen för språkupplösning
Översättningen går sönder efter exportAtt nycklar, JSON-giltighet, metadata och ICU-syntax klarade rundturen

Åtgärda det tidigaste brutna kontraktet i stället för att redigera genererad Dart-kod för hand. Genererad kod kan genereras om; en manuell reparation där försvinner troligen nästa gång resurserna ändras.

Vanliga frågor

Vad är en ARB-fil i Flutter?

Ett Application Resource Bundle är en JSON-baserad fil med lokaliserade meddelanden och valfri metadata. Flutters arbetsflöde gen-l10n använder ARB-resurser för att generera ett lokaliserings-API i Dart. Metadata kan beskriva meddelandet och dess platshållare, vilket ger utvecklare och översättare ett tydligare kontrakt för varje nyckel.

Vad är skillnaden mellan gen-l10n och intl_utils?

Båda genererar lokaliseringskod från ARB-resurser, men de är separata verktyg med olika konventioner för konfiguration och utdata. gen-l10n ingår i Flutters inbyggda arbetsflöde. Paketsidan för intl_utils var markerad som avvecklad när den kontrollerades för den här guiden, så verifiera underhållsstatusen innan du väljer det för en ny implementering.

Hur ska jag översätta ARB-filer?

Översätt de användarvända meddelandena och bevara stabila nycklar, platshållaridentifierare, metadata och den meddelandestruktur som krävs. Använd ett arbetsflöde som stöder de kraven och kör sedan generering och applikationstester på de returnerade filerna. Granskning av modersmålstalare ska bedöma betydelse och sammanhang utöver strukturell giltighet.

Stöder Smartcat platshållare och pluralformer i ARB?

Dokumentationen för programvaruprojekt som granskats här visar inte inbyggt stöd för ARB eller en testad konverteringsväg som bevarar alla ARB-funktioner. Bekräfta import-/exportmetoden med produktteamet och validera en representativ rundtur innan ni börjar använda den. Generellt stöd för JSON bevisar inte ensamt kompatibilitet med ARB.

Fungerar Flutter-lokalisering på webben?

Flutter web-applikationer kan använda lokaliserade resurser och språkval. Sökbarhet är en separat fråga: offentligt marknadsförings- och hjälpinnehåll kan dra nytta av en HTML-baserad arkitektur. Testa routning, språkval och metadata för just er webbupplevelse i stället för att utgå från att mobillokaliseringen löser SEO på webben.

Hittade du inte svaret? Prata med en lokaliseringsspecialist

Gör översättningsöverlämningen lika tillförlitlig som ert resurskontrakt

Ta med ett litet ARB-exempel och de kontroller ert bygge kräver. Gå igenom arbetsflödet innan ni skalar upp till alla språk och releaser.