您好,让我们了解如何制作为您的用户提供本地化的应用程序。
Ничего не поняли? Я тоже! А теперь представьте, что пользователь тоже не понимает язык, на котором отображается интерфейс вашего приложения, и удаляет его, едва успев установить. Но это легко исправить: 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.