您好,让我们了解如何制作为您的用户提供本地化的应用程序。

Ничего не поняли? Я тоже! А теперь представьте, что пользователь тоже не понимает язык, на котором отображается интерфейс вашего приложения, и удаляет его, едва успев установить. Но это легко исправить: Flutter позволяет разрабатывать приложения, которые будут понятны пользователям.

Как? Смотрите официальную документацию Flutter или следуйте инструкциям в этом руководстве.

Шаг 1. Для начала добавим в pubspec.yaml нужные зависимости (flutter_localizations, provider, intl) и вставим generate: true.

dependencies:
 flutter_localizations:
 sdk: flutter
 
 provider:
 intl: ^0.17.0
 ….
 ….
 
flutter:
 uses-material-design: true
 generate: true

Шаг 2. Теперь создадим файл l10n.yaml (первая буква — маленькая L) и вставим следующий код:

arb-dir: lib/l10n
template_arb-file: app_en.arb
output_localization-files: app_localizations.dart

В коде выше arb-dir — каталог входных файлов локализации, app_en.arb — шаблон, output_localization-files — выходной файл, который сгенерирует Flutter (именно для этого мы добавили generate: true в файл pubspec.yaml).

Шаг 3. Согласно определению в l10n.yaml, входные файлы будут находиться в папке lib/l10n. Поэтому в папке lib нужно создать папку l10n — туда мы поместим файлы, которые сгенерируем на шаге 4 и 5.

Шаг 4. Создадим файл all_locales.dart в папке l10n.

import ‘package:flutter/material.dart’;

class AllLocale{
 AllLocale();
 
static final all = [
 const Locale(“en”, “US”),  // en is language Code and US
                            // is the country code
 const Locale(“hi”, “In”),
 ];
 }

Шаг 5. Теперь создадим файлы для отдельных языков. Здесь в приложении используются только английский и хинди, но по такой же схеме можно добавить и все 78 поддерживаемых языков.

На этом этапе мы создаем файлы .arb для каждого языка, который будет в приложении.

Примечания:

  • Создаваемые файлы должны быть в папке l10n.

  • У файлов должно быть расширение .arb.

  • Название ключей должно начинаться с маленьких букв — специальные символы запрещены.

  • Не ставьте запятую в конце последней пары «ключ-значение».

  • Если нужно принимать параметры, можете посмотреть, как в этом примере отображается GST (налог на товары и услуги), который в качестве параметра использует тег rate.

-> app_en.arb

{
 “frieghtInRs”: “Freight (Rs)”,
 “gst” : “GST ({rate}%) (Rs)”,
 “@gst”:{
 “description”: “Enter % for gst”,
 “placeholders”: {
 “rate”: {
         “type”:”String”
         }
       }
    }, 
 “language”: “English”
}

-> app_hi.arb

{ 
 “frieghtInRs”: “किराया (रु.)”,
 “gst” : “GST ({rate}%) (रु.)”,
 “language”: “Hindi”
}

Теги определять нужно только в шаблоне — в нашем случае это app_en.arb.

Шаг 6. Теперь задаем все локали и делегаты локализации в MaterialApp в файле main.dart.

import ‘package:flutter_localizations/flutter_localizations.dart’;
MaterialApp(
           title: 'Parcel',
           debugShowCheckedModeBanner: false,
           theme: ThemeData(
                      primarySwatch: Colors.orange,
                 ),
           supportedLocales: AllLocale.all,
           locale: Provider.of<LocaleProvider>(context).locale, 
           localizationsDelegates: [
                  AppLocalizations.delegate,
                  GlobalMaterialLocalizations.delegate,
                  GlobalCupertinoLocalizations.delegate,
                  GlobalWidgetsLocalizations.delegate,
                  ],
           initialRoute: "/",
           onGenerateRoute: Routes.generateRoutes,
          )

В коде выше мы использовали LocaleProvider для установки значения локали, поэтому создадим соответствующий файл.

import 'l10n/all_locales.dart';
class LocaleProvider with ChangeNotifier {
Locale _locale;
Locale get locale => _locale;
void setLocale(Locale locale) {
if (!AllLocales.all.contains(locale)) return;
_locale = locale;
notifyListeners();
   }
}

Шаг 7. Теперь запустим flutter pub get — эта команда создаст файлы локализации в папке dart_tools/flutter_gen. Поздравляю! Можете похвастаться перед руководителем или коллегой.

Как использовать локализацию в интерфейсе

Для смены языка приложения используйте приведенный ниже код или измените язык в настройках устройства.

Provider.of<LocaleProvider>(context,listen: false)
  .setLocale(AllLocale.all[1]);

Использование локализации:

Column(
          mainAxisAlignment: MainAxisAlignment.center,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: [
            Text(
              AppLocalizations.of(context).frieghtInRs + "50",
              style: Theme.of(context).textTheme.headline4,
            ),
            Text(
              AppLocalizations.of(context).gst("5") + "10",
              style: Theme.of(context).textTheme.headline4,
            ),
            Text(
              "${AppLocalizations.of(context).total}: 60",
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),

Ура! Вы создали приложение с поддержкой нескольких языков.

Спасибо, что дочитали до конца. Ставьте лайки, подписывайтесь и всё такое — я буду благодарен!


О переводчике

Перевод статьи выполнен в Alconost.

Alconost занимается локализацией игр, приложений и сайтов на 70 языков. Переводчики-носители языка, лингвистическое тестирование, облачная платформа с API, непрерывная локализация, менеджеры проектов 24/7, любые форматы строковых ресурсов.

Мы также делаем рекламные и обучающие видеоролики — для сайтов, продающие, имиджевые, рекламные, обучающие, тизеры, эксплейнеры, трейлеры для Google Play и App Store.

Комментарии (0)