Комплексное руководство по поддержке нескольких локалей во Flutter: методы и примеры

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

Метод 1: использование пакета flutter_localizations

Flutter предоставляет пакет flutter_localizations, который предлагает встроенную поддержку широкого спектра локалей. Чтобы использовать этот пакет, выполните следующие действия:

Шаг 1. Добавьте пакет flutter_localizationsв файл pubspec.yaml:

dependencies:
  flutter:
    sdk: flutter
  flutter_localizations:
    sdk: flutter

Шаг 2. Импортируйте необходимые пакеты в файл Dart:

import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';

Шаг 3. Оберните виджет MaterialAppв MaterialAppи укажите поддерживаемые локали:

void main() {
  runApp(MyApp());
}
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      supportedLocales: [
        Locale('en', 'US'),
        Locale('es', 'ES'),
        // Add more locales as needed
      ],
      localizationsDelegates: [
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
      ],
      localeResolutionCallback: (locale, supportedLocales) {
        for (var supportedLocale in supportedLocales) {
          if (supportedLocale.languageCode == locale.languageCode &&
              supportedLocale.countryCode == locale.countryCode) {
            return supportedLocale;
          }
        }
        return supportedLocales.first;
      },
      home: MyHomePage(),
    );
  }
}
class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Localization Example'),
      ),
      body: Center(
        child: Text(
          'Hello World!',
          style: TextStyle(fontSize: 20),
        ),
      ),
    );
  }
}

Метод 2: собственный делегат локализации

Если встроенные параметры локализации не соответствуют вашим требованиям, вы можете создать собственный делегат локализации. Вот пример:

Шаг 1. Создайте класс, расширяющий LocalizationsDelegate:

class MyLocalizationDelegate extends LocalizationsDelegate<MyLocalization> {
  const MyLocalizationDelegate();
  @override
  bool isSupported(Locale locale) {
    return ['en', 'es'].contains(locale.languageCode);
  }
  @override
  Future<MyLocalization> load(Locale locale) async {
    MyLocalization localization = MyLocalization(locale);
    await localization.load();
    return localization;
  }
  @override
  bool shouldReload(MyLocalizationDelegate old) => false;
}

Шаг 2. Реализуйте класс MyLocalization:

class MyLocalization {
  final Locale locale;
  MyLocalization(this.locale);
  // Implement your localization logic here
  // Example: Map locale-specific strings
  static MyLocalization of(BuildContext context) {
    return Localizations.of<MyLocalization>(context, MyLocalization);
  }
  Future<void> load() async {
    // Load locale-specific resources
  }
}

Метод 3. Использование локализации на основе JSON

Другой подход — хранить строки локализации в файлах JSON и динамически загружать их в зависимости от языкового стандарта. Вот пример:

Шаг 1. Создайте файлы JSON для каждой поддерживаемой локали:

// en.json
{
  "greeting": "Hello",
  "farewell": "Goodbye"
}
// es.json
{
  "greeting": "Hola",
  "farewell": "Adiós"
}

Шаг 2. Создайте класс для обработки локализации на основе JSON:

class MyLocalization {
  final Locale locale;
  MyLocalization(this.locale);
  static Map<String, dynamic> _localizedStrings;
  Future<void> load() async {
    String jsonString = await rootBundle.loadString('locales/${locale.languageCode}.json');
    _localizedStrings = json.decode(jsonString);
  }
  String translate(String key) {
    return _localizedStrings[key];
  }
  static MyLocalization of(BuildContext context) {
    return Localizations.of<MyLocalization>(context, MyLocalization);
  }
}

В этой статье мы рассмотрели различные методы поддержки нескольких локалей во Flutter. Мы рассмотрели использование пакета flutter_localizations, создание пользовательских делегатов локализации и реализацию локализации на основе JSON. Приняв эти методы, вы сможете обеспечить локализованный интерфейс для пользователей на разных языках и в разных регионах.

Не забудьте определить свою целевую аудиторию и реализовать соответствующую стратегию локализации, чтобы сделать ваше приложение Flutter доступным и удобным для пользователя в глобальном масштабе.