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

⏱️2 мин
Поделиться:

Локализация вашего приложения является важным требованием, если вы хотите, чтобы ваше приложение использовалось во всем мире. Flutter предоставляет простой способ локализовать ваше приложение с помощью файлов arb В этой статье объясняется, как локализовать ваше приложение на Flutter . Обратите внимание, что эта статья основана на Flutter 2.0.1, поэтому, если вы используете более старые версии, способ, описанный в этой статье, может не работать.

1. Добавьте зависимости в pubspec.yaml

Добавить зависимости в pubspec.yaml

yaml
1dependencies:
2 flutter:
3 sdk: flutter
4 flutter_localizations:
5 sdk: flutter
6 intl: ^0.16.1

Эти пакеты необходимы для локализации.

2. Добавьте generate в pubspec.yaml

yaml
1flutter:
2 generate: true

Этот флаг позволяет Flutter генерировать класс AppLocalizations arb что необходимо для локализации.

3. Создайте l10n.yaml

yaml
1arb-dir: lib/l10n
2template-arb-file: app_en.arb
3output-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 .

json
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 как показано ниже.

json
1{
2 "helloWorld": "こんにちは世界!"
3}

arb содержит различные полезные выражения, и здесь я представлю одно из них, placeholder . Placeholder позволяет передавать параметры в resource value .

json
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 , вы можете вызвать его из своего приложения, как показано ниже.

dart
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

dart
1import 'package:flutter_gen/gen_l10n/app_localizations.dart';
2
3@override
4Widget build(BuildContext context) {
5 return MaterialApp(
6 localizationsDelegates: AppLocalizations.localizationsDelegates, // Add this line
7 supportedLocales: AppLocalizations.supportedLocales, // Add this line
8 home: // ...
9 );
10}

7. Вызов переведенного текста

Вы можете использовать локализованный текст, как в примере ниже. Синтаксис похож на AppLocalizations.of(context).<resource id>.

dart
1Text(AppLocalizations.of(context).helloWorld);

Локализации на дату

Вы также можете отображать локализованную дату, как показано ниже.

dart
1Locale locale = Localizations.localeOf(context);
2DateFormat.yMd(locale.toString()).format(DateTime.now());

использованная литература

Поделиться:

Связанные статьи