Flutter intl с использованием Flavors

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

Настройка flavors для вашего Flutter приложения

Flavors в Flutter позволяют создавать несколько версий вашего приложения, например, staging, production или для разных локалей. Вы можете определить flavors в директориях android и ios.

Для Android:

  1. Откройте файл android/app/build.gradle.
  2. Добавьте конфигурации flavors в секцию android:
    android {
        ...
        flavorDimensions "version"
        productFlavors {
            english {
                dimension "version"
                applicationIdSuffix ".english"
                versionNameSuffix "-english"
            }
            spanish {
                dimension "version"
                applicationIdSuffix ".spanish"
                versionNameSuffix "-spanish"
            }
        }
    }
    

Для iOS:

  1. Откройте файл ios/Runner.xcodeproj в Xcode.
  2. В Xcode создайте новые схемы для каждого flavor (в данном примере для английского и испанского языков) путем дублирования текущей схемы.
  3. В разделе Build Settings создайте новую конфигурацию Build Configuration для каждого flavor.

Настройка локализации (i18n) для вашего Flutter приложения

Для интернационализации приложения Flutter используйте пакет flutter_localizations вместе с intl.

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

    dependencies:
      flutter:
        sdk: flutter
      flutter_localizations:
        sdk: flutter
      intl: ^0.17.0
    
  2. Добавьте ARB файлы для каждого языка в директорию lib/l10n:
    Пример содержимого файла app_en.arb:

    {
      "title": "Hello World",
      "message": "Welcome to the Flutter App!"
    }
    

    Пример содержимого файла app_es.arb:

    {
      "title": "Hola Mundo",
      "message": "¡Bienvenido a la aplicación Flutter!"
    }
    
  3.  Сгенерируйте классы локализации, запустив команду:
    flutter pub run intl_utils:generate
    
  4. Обновите ваш MaterialApp, чтобы поддерживать локализацию:
    import 'package:flutter_localizations/flutter_localizations.dart';
    import 'package:intl/intl.dart';
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          localizationsDelegates: [
            GlobalMaterialLocalizations.delegate,
            GlobalWidgetsLocalizations.delegate,
            GlobalCupertinoLocalizations.delegate,
            // Ваши сгенерированные делегаты локализации
          ],
          supportedLocales: [
            const Locale('en', ''), // Английский
            const Locale('es', ''), // Испанский
          ],
          localeResolutionCallback: (locale, supportedLocales) {
            if (locale == null) return supportedLocales.first;
            for (var supportedLocale in supportedLocales) {
              if (supportedLocale.languageCode == locale.languageCode) {
                return supportedLocale;
              }
            }
            return supportedLocales.first;
          },
          home: MyHomePage(),
        );
      }
    }
    

Использование flavors для загрузки определённых локалей

Вы можете использовать flavors для установки локали по умолчанию для вашего приложения в зависимости от того, какой flavor используется. Например, в вашем файле main.dart создайте отдельные точки входа для каждого flavor:

  1. Создайте отдельные файлы main_english.dart и main_spanish.dart.

  2. Установите локаль по умолчанию в каждом из этих файлов:

    void main() {
      runApp(MyApp(defaultLocale: Locale('en')));
    }
    

    И для испанского flavor:

    void main() {
      runApp(MyApp(defaultLocale: Locale('es')));
    }
    
  3. Измените localeResolutionCallback, чтобы использовать переданную defaultLocale:
    class MyApp extends StatelessWidget {
      final Locale defaultLocale;
      MyApp({required this.defaultLocale});
    
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          locale: defaultLocale,
          ...
        );
      }
    }
    

Сборка и запуск разных flavors

Для сборки различных flavors используйте флаг --flavor:

  • Для Android (английский flavor):

    flutter build apk --flavor english
    
  • Для iOS (испанский flavor):
    flutter build ios --flavor spanish
    

 

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