Как локализовать приложение во Flutter

Эта статья была опубликована более года назад. Информация может быть устаревшей.
Локализация вашего приложения является важным требованием, если вы хотите, чтобы ваше приложение использовалось во всем мире. Flutter предоставляет простой способ локализовать ваше приложение с помощью файлов arb
В этой статье объясняется, как локализовать ваше приложение на Flutter .
Обратите внимание, что эта статья основана на Flutter 2.0.1, поэтому, если вы используете более старые версии, способ, описанный в этой статье, может не работать.
1. Добавьте зависимости в pubspec.yaml
Добавить зависимости в pubspec.yaml
1dependencies:2 flutter:3 sdk: flutter4 flutter_localizations:5 sdk: flutter6 intl: ^0.16.1Эти пакеты необходимы для локализации.
2. Добавьте generate в pubspec.yaml
1flutter:2 generate: trueЭтот флаг позволяет Flutter генерировать класс AppLocalizations arb что необходимо для локализации.
3. Создайте l10n.yaml
1arb-dir: lib/l10n2template-arb-file: app_en.arb3output-localization-file: app_localizations.dartЭтот файл предоставляет конфигурации при автоматическом создании класса AppLocalizations
arb-dir указывает каталог для файлов arb
template-arb-file указывает arb используемый в качестве шаблона.
output-localization-file указывает имя файла класса AppLocalizations
4. Создайте файл arb
Создайте arb в каталоге, указанном в l10n.yaml.
arb имеет формат json, и вы можете предоставить переводы для каждого ключа.
Кай называется resource id а значение - resource value .
Например, в приведенном ниже примере представлен английский перевод resource id helloWorld .
1{2 "helloWorld": "Hello World!",3 "@helloWorld": {4 "description": "The conventional newborn programmer greeting"5 }6}Вы можете предоставить подробное объяснение resource id , добавив префикс @ resource id . В приведенном выше примере @helloWorld описывает подробную информацию об resource id helloWorld .
Затем вы можете создавать другие arb соответствии с языком, поддерживаемым вашим приложением.
Например, если вы поддерживаете японский язык, вы можете добавить app_ja.arb как показано ниже.
1{2 "helloWorld": "こんにちは世界!"3}arb содержит различные полезные выражения, и здесь я представлю одно из них, placeholder .
Placeholder позволяет передавать параметры в resource value .
1"pricePerMonth": "{price} per month",2"@pricePerMonth": {3 "placeholders": {4 "price": {5 "example": "123.45",6 "description": "price"7 }8 }9}resource value можно передавать любые параметры, например {price} .
Затем напишите описание параметра в placeholders под @resource id .
После того, как вы создадите placeholder и автоматически сгенерируете AppLocalizations , вы можете вызвать его из своего приложения, как показано ниже.
1AppLocalizations.of(context).pricePerMonth(100.0);5. Автоматически создавать файл класса AppLocalizations
Если вы вызываете flutter pub get или build свое приложение, AppLocalizations будет автоматически сгенерирован. Имя файла указано в l10n.yaml.
В этом случае это будет файл .dart_tool/flutter_gen/gen_l10n/app_localizations.dart . Каталог определяется системой.
Кстати, вам не нужно фиксировать этот файл в git. Этот файл всегда создается при сборке приложения и отражает последнее содержимое файла arb
6. Материал для звонков / виджет / CupertinoApp
Установите параметры localizationsDelegates и supportedLocales .
Не забудьте импортировать класс AppLocalizations
1import 'package:flutter_gen/gen_l10n/app_localizations.dart';2 3@override4Widget build(BuildContext context) {5 return MaterialApp(6 localizationsDelegates: AppLocalizations.localizationsDelegates, // Add this line7 supportedLocales: AppLocalizations.supportedLocales, // Add this line8 home: // ...9 );10}7. Вызов переведенного текста
Вы можете использовать локализованный текст, как в примере ниже.
Синтаксис похож на AppLocalizations.of(context).<resource id>.
1Text(AppLocalizations.of(context).helloWorld);Локализации на дату
Вы также можете отображать локализованную дату, как показано ниже.
1Locale locale = Localizations.localeOf(context);2DateFormat.yMd(locale.toString()).format(DateTime.now());



