Sobes.tech
Назад к вопросам
Middle
636
questionbank

Какие способы добавления локализации в Flutter вам известны?

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

В Flutter локализацию обычно добавляют через встроенную систему flutter_localizations и генерацию строк из ARB-файлов. Также могут использовать ручные словари, сторонние пакеты вроде intl/flutter_intl или собственную обвязку поверх LocalizationsDelegate. Важно понимать не только способ хранения переводов, но и как приложение выбирает язык и обновляет UI.

Определение:

Локализация в Flutter — это механизм, который позволяет приложению показывать текст, форматы дат, чисел и другие ресурсы в зависимости от языка и региона пользователя. На практике это обычно делается через набор переведённых ресурсов и провайдер локали, который подставляет нужные значения в UI.

Основные способы добавления локализации в Flutter:

  • Встроенная локализация Flutter через flutter_localizations и gen-l10n.
  • Хранение переводов в ARB-файлах с генерацией Dart-классов.
  • Использование пакета intl для форматирования дат, чисел и сообщений.
  • Сторонние пакеты для удобной генерации и управления переводами, например flutter_intl.
  • Ручная реализация через LocalizationsDelegate, если нужен полный контроль.

Пример использования:

Чаще всего в проекте используют ARB-файлы и генерацию локализации.

// pubspec.yaml
dependencies:
  flutter:
    sdk: flutter
  flutter_localizations:
    sdk: flutter

flutter:
  generate: true
// lib/l10n/app_en.arb
{
  "hello": "Hello",
  "welcome": "Welcome"
}
// lib/l10n/app_ru.arb
{
  "hello": "Привет",
  "welcome": "Добро пожаловать"
}
// main.dart
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
// import 'generated/l10n.dart'; // зависит от выбранного способа генерации

MaterialApp(
  localizationsDelegates: const [
    GlobalMaterialLocalizations.delegate,
    GlobalWidgetsLocalizations.delegate,
    GlobalCupertinoLocalizations.delegate,
  ],
  supportedLocales: const [
    Locale('en'),
    Locale('ru'),
  ],
  // localizationsDelegates и generated localization обычно подключаются вместе
);

Пояснение кода:

В этом примере локализация строится так:

  1. В pubspec.yaml подключается flutter_localizations, чтобы Flutter умел локализовать стандартные виджеты Material/Cupertino.
  2. Создаются ARB-файлы для каждого языка, где ключи одинаковые, а значения разные.
  3. Flutter генерирует типобезопасный код, который позволяет обращаться к строкам без ручного словаря.
  4. В MaterialApp указываются поддерживаемые локали, чтобы приложение понимало, какие языки доступны.
  5. При смене Locale Flutter перестраивает дерево виджетов, и строки подставляются из нужного набора переводов.

Если нужен ручной способ, то логика обычно такая: хранится Map<Locale, Map<String, String>>, а в LocalizationsDelegate выбирается нужный набор строк по текущей локали. Но для большинства приложений это менее удобно и хуже масштабируется.

Ключевые моменты:

  • Самый распространённый и рекомендуемый путь во Flutter — flutter_localizations + ARB + генерация кода.
  • intl полезен не только для строк, но и для форматирования дат, чисел, валют и plurals.
  • flutter_intl часто используют как удобную оболочку над генерацией локализации.
  • Ручная реализация через LocalizationsDelegate возможна, но обычно нужна только для нестандартных требований.
  • Важно разделять localization и internationalization: i18n — подготовка приложения к разным языкам, l10n — конкретные переводы и региональные настройки.
  • При собеседовании полезно упомянуть, что локализация включает не только текст, но и форматы, направление текста и региональные особенности.