Интернационализация Flutter в пакете

Вопрос или проблема

Я пытаюсь разбить код на различные пакеты в приложении, которое я сейчас программирую. (приходя из среды C#/WPF и желая ограничить “кто может использовать какой код”, это кажется правильным для меня) Соответственно, я создал пакет, в котором управляю .dart файлами с представлениями или виджетами (название: presentation). Теперь я хотел бы поддерживать несколько языков в своем приложении и хранить тексты в .arb файле. Я следовал документации https://docs.flutter.dev/ui/accessibility-and-internationalization/internationalization и создал файлы в своем пакете (l10n.yaml в корне пакета, папка lib/l10n в lib пакета, а папка “flutter_gen” также отображается в папке .dart_tool пакета после сборки. Теперь я хочу добавить импорт

import 'package:flutter_gen/gen_l10n/app_localizations.dart';

Когда я собираю приложение, я получаю следующую ошибку:

presentation/lib/providers/multi_provider_builder.dart:13:8: Error: Ошибка при чтении '../../AppData/Local/Pub/Cache/hosted/pub.dev/flutter_gen-5.7.0/lib/gen_l10n/app_localizations.dart': Системе не удается найти указанный путь.

import 'package:flutter_gen/gen_l10n/app_localizations.dart';
       ^
Целевая программа kernel_snapshot_program завершилась с ошибкой: Исключение


ОШИБКА: Сборка завершилась с исключением.

* Что пошло не так:
Ошибка выполнения задачи ':app:compileFlutterBuildDebug'.
> Процесс 'команда 'C:\flutter\flutter\bin\flutter.bat'' завершился с ненулевым кодом выхода 1

* Попробуйте:
> Запустите с параметром --stacktrace, чтобы получить трассировку стека.
> Запустите с параметром --info или --debug, чтобы получить больше логов.
> Запустите с параметром --scan для получения полной информации.
> Получите дополнительную помощь на https://help.gradle.org.

СБОРКА НЕ УДАЛАСЬ за 3s
Ошибка: Задача Gradle assembleDebug завершилась с кодом выхода 1

Пробовал ли кто-нибудь добавить .arb файлы в пакет?
Мой пакет “presentation” находится внутри папки приложения. Может быть, структура моего приложения является проблемой? Пример:

  • App
    • lib
      • main.dart
    • pubspec.yaml (приложения)
    • presentation (пакет)
      • lib
        // dart файлы и папки
      • pubspec.yaml (пакета с установленными flutter_localizations + intl)

Следование документации в тестовом приложении дало работающий результат, но не с той структурой пакетов, которую я хотел использовать.

Ответ или решение

Для решения вашей проблемы с интернационализацией во Flutter при использовании пакетов, необходимо следовать определённым шагам и убедиться, что структура вашего проекта настроена правильно. Давайте рассмотрим основные моменты.

1. Структура проекта

Убедитесь, что ваша структура проекта выглядит примерно так:

App/
├── lib/
│   ├── main.dart
├── pubspec.yaml (основного приложения)
├── presentation/
│   ├── lib/
│   │   ├── ... (ваши файлы Dart)
│   │   └── l10n/ (папка для arb файлов)
│   └── pubspec.yaml (пакета)

2. Настройка pubspec.yaml вашего пакета

В pubspec.yaml вашего пакета presentation добавьте необходимые зависимости:

dependencies:
  flutter:
    sdk: flutter
  flutter_localizations:
    sdk: flutter
  intl: ^0.17.0 # Убедитесь, что версия актуальна

Также обязательно укажите конфигурацию для генерации локализаций:

flutter:
  generate: true
  # Укажите путь к вашим arb файлам
  l10n:
    arb-dir: lib/l10n
    template-arb-file: app_en.arb
    output-localization-file: app_localizations.dart

3. Создание .arb файлов

В папке lib/l10n вашего пакета создайте .arb файлы, такие как:

  • app_en.arb (английский)
  • app_ru.arb (русский)

Пример app_en.arb:

{
  "title": "Hello World",
  "@title": {
    "description": "The title of the application"
  }
}

Пример app_ru.arb:

{
  "title": "Привет, мир",
  "@title": {
    "description": "Название приложения"
  }
}

4. Генерация локализаций

После настройки вы должны выполнить команду для генерации локализаций:

flutter pub get
flutter pub run build_runner build --delete-conflicting-outputs

Это создаст файл app_localizations.dart в папке .dart_tool вашего проекта.

5. Импортирование локализаций

В вашем коде (например, в multi_provider_builder.dart) импортируйте сгенерированный файл:

import 'package:flutter_gen/gen_l10n/app_localizations.dart';

6. Проблемы с путями

Исходя из вашей ошибки, важно убедиться, что программа правильно видит путь к файлу app_localizations.dart. Ошибка, которую вы получили, указывает, что оболочка не может найти файл. Попробуйте:

  • Убедиться, что вы действительно выполняете команду сборки из корневой директории проекта.
  • Использовать абсолютные пути, если возникли вопросы с относительными.

7. Добавление локализаций в MaterialApp

В вашем main.dart важно правильно инициализировать локализацию:

import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:presentation/...'; // Ваш путь к нужному импорту

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      localizationsDelegates: [
        AppLocalizations.delegate,
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
        GlobalCupertinoLocalizations.delegate,
      ],
      supportedLocales: [
        const Locale('en', ''), // Английский
        const Locale('ru', ''), // Русский
      ],
      home: MyHomePage(),
    );
  }
}

Итог

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

Оцените материал
Добавить комментарий

Капча загружается...