Organizacja zgodna z RODO
Organizacja z certyfikatem ISO 27001
Organizacja zgodna z SOC II
Lokalizacja Flutter: pliki ARB, intl i gen-l10n w praktyce
Lokalizacja Flutter dostosowuje komunikaty i interfejs aplikacji do różnych lokalizacji. We wbudowanym procesie flutter_localizations obsługuje zlokalizowane widżety frameworka, a zasoby ARB i gen-l10n generują API AppLocalizations aplikacji, przy czym intl obsługuje komunikaty i formatowanie zależne od języka.

Ponad 80 największych firm na świecie wybrało Smartcat
Skonfiguruj flutter_localizations i gen-l10n
Ten przewodnik konfiguruje mały przykład w języku angielskim i hiszpańskim, wyjaśnia metadane komunikatów i porównuje popularne podejścia oparte na pakietach. Pokazuje też, co sprawdzić przed połączeniem platformy tłumaczeniowej z projektem Flutter.
Używaj jednego generatora lokalizacji i jasno określ jego lokalizacje wejściowe i wyjściowe. Poniższy przykład zakłada istniejącą aplikację Flutter z własnymi ograniczeniami SDK i standardową konfiguracją projektu.
Scal odpowiednie wpisy z pubspec.yaml; nie duplikuj sekcji dependencies ani flutter:
dependencies:
flutter:
sdk: flutter
flutter_localizations:
sdk: flutter
intl: any
flutter:
generate: trueRozwiąż zależności za pomocą flutter pub get. Wpis intl: any jest zgodny z oficjalnym wzorcem konfiguracji i pozwala mechanizmowi rozwiązywania zależności wybrać wersję zgodną z Flutter SDK; zachowaj plik lockfile aplikacji i standardowy proces przeglądu zależności.
Utwórz l10n.yaml w katalogu głównym projektu:
arb-dir: lib/l10n
template-arb-file: app_en.arb
output-localization-file: app_localizations.dartDo konfiguracji zależnej od SDK używaj aktualnego przewodnika po internacjonalizacji Flutter. W nowoczesnym procesie wygenerowane pliki lokalizacyjne należą do drzewa źródłowego aplikacji. Przykład importuje z lib/l10n; nie kopiuj do nowej konfiguracji starego, syntetycznego importu package:flutter_gen. Zobacz notę o migracji generowanego kodu źródłowego.
Twórz pliki ARB z kontekstem i typowanymi placeholderami
Plik ARB to oparty na JSON pakiet zasobów zawierający komunikaty i opcjonalne metadane. Utrzymuj stabilne klucze komunikatów, pisz pełne komunikaty i używaj metadanych, aby wyjaśnić, jak tekst jest używany.
Utwórz 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"}
}
}
}Utwórz 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}}"
}Szablon zawiera metadane placeholderów używane przez generator. Zlokalizowany plik zachowuje klucze komunikatów, nazwy placeholderów i identyfikatory select, zmieniając jedynie sformułowania widoczne dla użytkownika. Te hiszpańskie przykłady ilustrują mechanikę; tekst produkcyjny powinien przejść natywną weryfikację w rzeczywistym kontekście produktu.
Uruchom flutter gen-l10n po dodaniu lub zmianie zasobów. Traktuj błędy generatora jako konkretne problemy z zasobami i rozwiąż je przed włączeniem plików do wydania.
Połącz wygenerowane komunikaty z MaterialApp
Zarejestruj wygenerowane delegaty i obsługiwane lokalizacje, a następnie odczytuj zlokalizowane komunikaty z kontekstu poniżej widżetu aplikacji.
Poniższy przykład należy umieścić w lib/main.dart po wygenerowaniu:
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 ma dostęp do lokalizacji dostarczanych przez MaterialApp. Pobieranie AppLocalizations z kontekstu zewnętrznego widżetu oznaczałoby szukanie powyżej providera utworzonego przez ten widżet. Dokumentacja Localizations API wyjaśnia, jak zlokalizowane zasoby są udostępniane elementom potomnym.Wygenerowane API sprawia, że różnica między zwykłym komunikatem a komunikatem z argumentami jest widoczna w kodzie. Do appTitle odwołujemy się jak do wartości; welcomeName, savedBooks i readingState otrzymują wartości potrzebne do zbudowania komunikatów.
Świadomie obsługuj liczbę mnogą i komunikaty select
Komunikaty z liczbą mnogą dobierają sformułowanie na podstawie liczby i gramatyki lokalizacji docelowej. Komunikaty select wybierają gałąź na podstawie identyfikatora dostarczonego przez aplikację. Zachowaj składnię i identyfikatory, tłumacząc tekst wyświetlany w każdej gałęzi.
Liczba mnoga
W przykładzie =0 zapewnia jawne zdanie dla stanu pustego. Gałęzie one i other obejmują formy używane w przykładowych językach; nie są uniwersalnym szablonem dla każdej lokalizacji docelowej. Daj weryfikatorowi wystarczający kontekst, aby mógł podać formy wymagane przez język i wartości, które może generować Twoja aplikacja.
Komunikaty select
Wartości takie jak active i paused to identyfikatory programu. Przetłumaczenie ich odłączyłoby zasób od kodu, który je dostarcza. Gałąź other zapewnia komunikat zastępczy dla wartości, która nie pasuje do żadnej nazwanej gałęzi.
Pełne komunikaty
Unikaj sklejania fragmentów, takich jak przetłumaczony czasownik, liczba i przetłumaczony rzeczownik. Pełny komunikat pozwala językowi docelowemu decydować o szyku zdania. Wyjaśnij w briefie wartości, oczekiwane zakresy i kontekst ekranu, aby weryfikatorzy mogli ocenić zdanie tak, jak zobaczą je użytkownicy.
Porównanie pakietów lokalizacyjnych Flutter
Wybierz pakiet na podstawie formatu zasobów, architektury aplikacji i potrzeb utrzymaniowych. Poniższe pakiety mają różne konwencje; stosowanie więcej niż jednego generatora dla tych samych komunikatów tworzy niepotrzebną niejednoznaczność.
| Podejście | Typowe zasoby | Generowanie kodu | Obsługa liczby mnogiej | Przydatne, gdy |
|---|---|---|---|---|
| Wbudowane gen-l10n | ARB | Generuje typowane akcesory Dart | Składnia komunikatów w stylu ICU | Chcesz korzystać z oficjalnego procesu zasobów Flutter |
| easy_localization | Domyślnie JSON, z dostępnymi dodatkowymi loaderami | Opcjonalne narzędzia do generowania | API liczby mnogiej pakietu i reguły zależne od lokalizacji | Wolisz jego konwencje ładowania zasobów i zarządzania lokalizacjami |
| Tłumaczenia GetX | Mapy kluczowane lokalizacją w udokumentowanym podstawowym procesie | Niewymagane dla podstawowego API map | trPlural używa kluczy dla liczby pojedynczej i mnogiej; bogatszą gramatykę oceń osobno | Twoja aplikacja już korzysta z GetX, a jego model tłumaczeń spełnia wymagania |
Przed wyborem zapoznaj się z aktualną dokumentacją easy_localization i dokumentacją GetX. Przetestuj zachowanie zastępcze, parametry, kategorie liczby mnogiej i procesy ekstrakcji na swoich rzeczywistych komunikatach. Wygodne API dla angielskich tekstów nie dowodzi obsługi każdego języka, który planujesz wydać.
intl nie jest konkurencyjną platformą do zarządzania tłumaczeniami. Dostarcza narzędzia do internacjonalizacji używane w procesach lokalizacji. gen-l10n generuje akcesory aplikacji z zasobów ARB. Osobny pakiet intl_utils również generuje kod lokalizacyjny, ale jego strona była oznaczona jako wycofana w chwili sprawdzenia 30 października 2026 r. Sprawdź status utrzymania, zanim użyjesz go w nowym projekcie.
Testuj przełączanie lokalizacji, RTL i rozszerzanie tekstu
Testuj zarówno poprawność zasobów, jak i zachowanie przetłumaczonego tekstu w interfejsie. Udane parsowanie JSON lub generowanie kodu nie dowodzi, że ekran jest zrozumiały i użyteczny.
Przełączanie lokalizacji
Na potrzeby szybkiego sprawdzenia w trakcie developmentu ustaw MaterialApp.locale na obsługiwaną wartość, np. const Locale('es'). W produkcyjnym selektorze języka przechowuj wybraną lokalizację w stanie aplikacji, zapisuj preferencję zgodnie z wymaganiami produktu i daj możliwość korzystania z języka systemu. Weryfikuj zapisaną preferencję względem lokalizacji faktycznie obsługiwanych przez bieżącą wersję aplikacji.
Układy od prawej do lewej
Używaj kierunkowych API układu dla elementów, które powinny podążać za kierunkiem czytania. Sprawdź odstępy, wyrównanie, elementy nawigacji i treści o mieszanym kierunku w rzeczywistej lokalizacji od prawej do lewej. Nie zakładaj, że każda ikona powinna być odbita lustrzanie: kierunkowa strzałka nawigacji i symbol marki mają różne znaczenie.
Rozszerzanie tekstu
Testuj długie tłumaczenia i większe rozmiary tekstu. Sprawdź przyciski, karty, okna dialogowe, puste stany, błędy i wąskie układy. Uwzględnij wartości dynamiczne, takie jak długie nazwy i liczby, aby układ był sprawdzany z komunikatem, który użytkownicy faktycznie zobaczą.
Korzystaj z praktycznej macierzy testów:
| Kontrola | Przykład |
|---|---|
| Pokrycie zasobów | Każdy wymagany klucz szablonu ma celową zlokalizowaną wartość lub wartość zastępczą |
| Argumenty komunikatów | Nazwy i typy placeholderów pozostają zgodne z wygenerowanymi metodami |
| Obsługa liczby | Zero, jeden i wartości sprawdzające dodatkowe formy języka docelowego |
| Obsługa select | Znane stany oraz nieoczekiwana wartość, która trafia do other |
| Obsługa lokalizacji | Język systemu, jawny wybór, restart i nieobsługiwana preferencja |
| Układ | Rozszerzony tekst, duże ustawienia czcionki i treści od prawej do lewej |
| Znaczenie | Natywna weryfikacja ważnych ścieżek użytkownika |
Po stronie językowej procesu skorzystaj z procesu testowania lokalizacji. Utrzymuj akceptację lingwistyczną i wyniki testów funkcjonalnych jako odrębne dowody gotowości wydania.
Planuj lokalizację Flutter web i widoczność w wyszukiwarkach osobno
Flutter web może korzystać ze zlokalizowanych zasobów aplikacji, ale lokalizacja interfejsu nie tworzy automatycznie wielojęzycznej witryny gotowej pod SEO. Wybór języka, routing, metadane i widoczność treści pozostają decyzjami architektonicznymi.
FAQ Flutter web opisuje nacisk na doświadczenia aplikacyjne i zaleca podejście dokumentowe dla statycznych treści webowych z dużą ilością tekstu. Rozważ osobne strony marketingowe, pomocy i redakcyjne oparte na HTML, jeśli mają one dobrze radzić sobie w wynikach organicznych.
Utrzymuj spójną terminologię między aplikacją a tymi stronami publicznymi. Użytkownik z wyszukiwarki powinien rozpoznać nazwę funkcji po przejściu ze zlokalizowanej strony docelowej do aplikacji, nawet jeśli obie powierzchnie korzystają z różnych systemów renderowania.
Zweryfikuj proces tłumaczenia ARB przed jego skalowaniem
Traktuj ARB jako ustrukturyzowany zasób aplikacji, a nie tylko plik z wartościami tekstowymi. Przekazanie do tłumaczenia musi zachować klucze, metadane, placeholdery i składnię komunikatów, a następnie zwrócić pliki, które przechodzą generowanie i testy aplikacji.
Udokumentowane formaty projektów oprogramowania w Smartcat obejmują import JSON, YAML, Android XML, iOS .strings i LocJSON. Dokumentacja przeanalizowana na potrzeby tego przewodnika nie potwierdza natywnej obsługi ARB ani przetestowanego procesu konwersji ARB do JSON. Nie zakładaj, że zmiana rozszerzenia pliku dowodzi zgodności. Zobacz dokumentację projektów oprogramowania.
Traktuj poniższe jako proponowaną procedurę weryfikacji do przeprowadzenia z zespołem wdrożeniowym, a nie jako już przetestowany przepis na konektor:
Wybierz reprezentatywną próbkę
Wybierz małą próbkę ARB zawierającą zwykłe teksty, metadane, typowane placeholdery, liczbę mnogą i select.
Potwierdź import i eksport
Potwierdź z zespołem produktowym obsługiwaną metodę importu i eksportu, w tym sposób traktowania metadanych
@i komunikatów ICU.Zapewnij zasoby językowe i kontekst
Dostarcz glosariusz, w razie potrzeby pamięć tłumaczeń oraz jasny kontekst dla każdego komunikatu.
Tłumacz i chroń strukturę
Tłumacz i weryfikuj tekst widoczny dla użytkownika, chroniąc identyfikatory programu i strukturę.
Porównaj i przywróć
Porównaj zwrócone zasoby z kontraktem źródłowym i przywróć je do oczekiwanych ścieżek projektu.
Generuj i testuj
Uruchom
flutter gen-l10n, analizę statyczną i odpowiednie testy w środowisku z przypiętą wersją SDK projektu.Zweryfikuj i zapisz
Sprawdź zlokalizowany interfejs i zapisz zatwierdzoną wersję źródła.
Automatyzuj synchronizację repozytorium dopiero wtedy, gdy ten pełny obieg się powiedzie. Określ, kto obsługuje zmiany w źródle, jak unieważniany jest status weryfikacji i jak zarządzane są wygenerowane artefakty. Przechowuj zasoby ARB w systemie kontroli wersji jako źródło prawdy dla procesu aplikacji.
Przejrzyj swój proces tłumaczenia Flutter
Typowe błędy i co sprawdzić w pierwszej kolejności
| Objaw | Co sprawdzić najpierw |
|---|---|
| Nie można znaleźć wygenerowanego importu | Generowanie zakończyło się powodzeniem, a import odpowiada skonfigurowanej ścieżce wyjściowej |
AppLocalizations.of(context) jest niedostępne | Kontekst znajduje się poniżej providera lokalizacji aplikacji |
| Metoda komunikatu ma nieoczekiwane argumenty | Metadane placeholderów w szablonie i wygenerowane API |
| Select zawsze pokazuje wartość zastępczą | Identyfikator aplikacji dokładnie odpowiada gałęzi zasobu |
| Brakuje lokalizacji | Pliki zasobów, obsługiwane lokalizacje i konfiguracja rozpoznawania lokalizacji |
| Tłumaczenie psuje się po eksporcie | Klucze, poprawność JSON, metadane i składnia ICU przetrwały pełny obieg |
Napraw najwcześniejszy naruszony kontrakt, zamiast ręcznie edytować wygenerowany kod Dart. Wygenerowany kod można wygenerować ponownie; ręczna poprawka w nim prawdopodobnie zniknie przy następnej zmianie zasobów.
Najczęściej zadawane pytania
Czym jest plik ARB we Flutter?
Application Resource Bundle to plik oparty na JSON, zawierający zlokalizowane komunikaty i opcjonalne metadane. Proces gen-l10n we Flutter używa zasobów ARB do generowania API lokalizacji w Dart. Metadane mogą opisywać komunikat i jego placeholdery, dając programistom i tłumaczom jaśniejszy kontrakt dla każdego klucza.
Czym różni się gen-l10n od intl_utils?
Oba generują kod lokalizacyjny z zasobów ARB, ale to osobne narzędzia z różnymi konwencjami konfiguracji i wyników. gen-l10n jest częścią wbudowanego procesu Flutter. Strona pakietu intl_utils była oznaczona jako wycofana w chwili sprawdzenia na potrzeby tego przewodnika, więc przed wyborem go do nowego wdrożenia sprawdź status utrzymania.
Jak tłumaczyć pliki ARB?
Tłumacz komunikaty widoczne dla użytkownika, zachowując stabilne klucze, identyfikatory placeholderów, metadane i wymaganą strukturę komunikatów. Korzystaj z procesu, który spełnia te wymagania, a następnie uruchom generowanie i testy aplikacji na zwróconych plikach. Natywna weryfikacja powinna oceniać znaczenie i kontekst, a nie tylko poprawność strukturalną.
Czy Smartcat obsługuje placeholdery i liczbę mnogą w ARB?
Przeanalizowana tu dokumentacja projektów oprogramowania nie potwierdza natywnej obsługi ARB ani przetestowanej ścieżki konwersji zachowującej wszystkie funkcje ARB. Przed wdrożeniem potwierdź metodę importu i eksportu z zespołem produktowym i zweryfikuj reprezentatywny pełny obieg. Sama ogólna obsługa JSON nie dowodzi zgodności z ARB.
Czy lokalizacja Flutter działa w wersji webowej?
Aplikacje Flutter web mogą korzystać ze zlokalizowanych zasobów i wyboru lokalizacji. Widoczność w wyszukiwarkach to osobna kwestia: publiczne treści marketingowe i pomocy mogą zyskać na architekturze opartej na HTML. Przetestuj routing, wybór języka i metadane dla swojego konkretnego doświadczenia webowego, zamiast zakładać, że konfiguracja lokalizacji mobilnej załatwia SEO w sieci.
Nie znalazłeś odpowiedzi? Porozmawiaj ze specjalistą ds. lokalizacji
Niech przekazanie do tłumaczenia będzie tak niezawodne jak kontrakt zasobów
Przygotuj małą próbkę ARB i testy wymagane przez Twój build. Przejrzyj proces, zanim rozszerzysz go na każdy język i wydanie.