Flutter本地化翻译加载插件translations_loader的使用

Flutter本地化翻译加载插件translations_loader的使用

简介

translations_loader 是一个简单的库,用于从资源文件夹加载翻译。该库应与 GetX 或类似的框架一起使用,因为它仅将文件加载为 <code>Map&lt;String, String&gt;</code>

支持的文件格式

  • json
  • properties

特性

  • 简化的国际化
  • 支持 jsonproperties 文件
  • 所有键从 JSON 文件转换为 object1.object2.value,以便它们与 properties 文件相同

配置步骤

首先,你需要在 pubspec.yaml 文件中配置资源文件夹:

flutter:
  uses-material-design: true

  assets:
    - assets/i18n/

在该文件夹中放置所有翻译文件。该库不使用 LocalecountryCode,仅使用 languageCode

例如:

  • en.json
{
  "app": {
    "name": "Test application",
    "version": "1",
    "bar": {
      "title": "My title"
    }
  }
}
  • hr.properties
app.name=Testna aplikacija
app.version=1
app.bar.title=Moj naslov

使用方法

要获取翻译,只需使用 TranslationsLoader 类中的静态方法 loadTranslations。例如:TranslationsLoader.loadTranslations("assets/i18n")

要将此库与 GetX 库一起使用,需要实现 Translations 类:

class ApplicationTranslations extends Translations {
  final Map<String, Map<String, String>> _translationKeys;

  ApplicationTranslations(this._translationKeys);

  [@override](/user/override)
  Map<String, Map<String, String>> get keys => _translationKeys;
}

然后可以在设置 GetMaterialApp 时使用它:

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();

  runApp(GetMaterialApp(
    translations: ApplicationTranslations(
      await TranslationsLoader.loadTranslations("assets/i18n"),
    ),
    locale: Get.deviceLocale,
    fallbackLocale: defaultLocale,
    supportedLocales: supportedLocales,
    localizationsDelegates: const [
      GlobalMaterialLocalizations.delegate,
      GlobalWidgetsLocalizations.delegate,
      GlobalCupertinoLocalizations.delegate,
    ],
    home: const MyHomePage(),
  ));
}

示例代码

以下是一个完整的示例代码:

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

const defaultLocale = Locale("en", "US");
const supportedLocales = [
  defaultLocale,
  Locale.fromSubtags(languageCode: "hr")
];

/// Class which extends Get Translations
class ApplicationTranslations extends Translations {
  final Map<String, Map<String, String>> _translationKeys;

  ApplicationTranslations(this._translationKeys);

  [@override](/user/override)
  Map<String, Map<String, String>> get keys => _translationKeys;
}

/// Main method
Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();

  runApp(GetMaterialApp(
      translations: ApplicationTranslations(
          await TranslationsLoader.loadTranslations(
              "assets/i18n")), // can add supported locales param
      locale: Get.deviceLocale,
      fallbackLocale: defaultLocale,
      supportedLocales: supportedLocales,
      localizationsDelegates: const [
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
        GlobalCupertinoLocalizations.delegate,
      ],
      home: const MyHomePage()));
}

/// Some default page
class MyHomePage extends StatelessWidget {
  const MyHomePage({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('app.bar.title'.tr),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'page.home.current_lang'.tr +
                  ': ' +
                  'lang.${Get.locale?.languageCode}'.tr,
            ),
            Card(
              child: Row(
                crossAxisAlignment: CrossAxisAlignment.center,
                mainAxisAlignment: MainAxisAlignment.center,
                children: [
                  MaterialButton(
                    child: Text('lang.en'.tr),
                    onPressed: () => {Get.updateLocale(supportedLocales[0])},
                  ),
                  MaterialButton(
                    child: Text('lang.hr'.tr),
                    onPressed: () => {Get.updateLocale(supportedLocales[1])},
                  )
                ],
              ),
            )
          ],
        ),
      ),
    );
  }
}

更多关于Flutter本地化翻译加载插件translations_loader的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter本地化翻译加载插件translations_loader的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中使用translations_loader插件进行本地化翻译加载的代码示例。这个插件可以帮助你自动化地加载和管理翻译文件。

首先,确保你已经在pubspec.yaml文件中添加了translations_loader依赖:

dependencies:
  flutter:
    sdk: flutter
  translations_loader: ^x.y.z  # 请替换为最新版本号

然后,运行flutter pub get来安装依赖。

1. 创建翻译文件

假设你有两个语言环境的翻译文件:英语(en.json)和中文(zh.json)。将这些文件放在assets/translations目录下。

assets/translations/en.json:

{
  "welcome": "Welcome",
  "goodbye": "Goodbye"
}

assets/translations/zh.json:

{
  "welcome": "欢迎",
  "goodbye": "再见"
}

2. 更新pubspec.yaml以包含翻译文件

pubspec.yaml中添加翻译文件到assets部分:

flutter:
  assets:
    - assets/translations/en.json
    - assets/translations/zh.json

3. 配置translations_loader

创建一个新的Dart文件,例如translations_config.dart,来配置translations_loader

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

class TranslationsConfig {
  static final TranslationLoader translationLoader = TranslationLoader(
    supportedLocales: [
      Locale('en', ''),
      Locale('zh', ''),
    ],
    basePath: 'assets/translations',
    fallbackLanguage: 'en', // 如果找不到特定语言的翻译,则回退到这种语言
  );
}

4. 使用翻译

现在,你可以在你的应用中加载和使用翻译。创建一个服务或帮助类来访问翻译,例如localization_service.dart

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

class LocalizationService {
  static LocalizationService? _instance;
  final BuildContext context;
  Locale? _locale;
  Map<String, String>? _localizedValues;

  LocalizationService._(this.context) {
    _locale = Localizations.localeOf(context);
    _loadTranslations();
  }

  factory LocalizationService.of(BuildContext context) {
    _instance ??= LocalizationService._(context);
    return _instance!;
  }

  void _loadTranslations() async {
    _localizedValues = await TranslationsConfig.translationLoader.load(_locale!.languageCode!);
  }

  String translate(String key) {
    return _localizedValues![key] ?? key; // 如果找不到翻译,则返回键名
  }
}

5. 在Widget中使用翻译

在你的应用中,你可以这样使用LocalizationService来获取翻译文本:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      localizationsDelegates: [
        // 添加你的localizations delegates,如果有的话
        // 通常这里会包含GlobalMaterialLocalizations.delegate等
      ],
      supportedLocales: TranslationsConfig.translationLoader.supportedLocales,
      locale: Localizations.localeOf(context),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final localizationService = LocalizationService.of(context);

    return Scaffold(
      appBar: AppBar(
        title: Text(localizationService.translate('welcome')),
      ),
      body: Center(
        child: Text(localizationService.translate('goodbye')),
      ),
    );
  }
}

这样,你就成功地配置并使用了translations_loader插件来进行Flutter应用的本地化翻译加载。这个示例展示了如何设置翻译文件、加载翻译以及在Widget中使用翻译。

回到顶部