Flutter本地化翻译插件phrase的使用

Flutter本地化翻译插件Phrase的使用

1. 简介

phrase 是一个用于Flutter应用的本地化翻译插件,支持通过空中下载(OTA)更新翻译内容。它依赖于 intl 库,并且使用代码生成来处理 ARB 文件。本文将详细介绍如何安装、配置和使用 phrase 插件,以及一些自定义选项。

2. 安装

首先,确保你的项目已经添加了对 intl 库的支持。phrase 依赖于 0.18.0 版本的 intl 库,请按照官方文档中的指南为你的应用添加国际化支持。

pubspec.yaml 文件中添加 phrase 依赖:

dependencies:
  phrase: ^2.0.0
  intl: ^0.18.0
  flutter_localizations:
    sdk: flutter
  ...

flutter:
  generate: true
  ...

为了保持生成的本地化文件最新,你可以运行以下命令:

$ flutter pub run phrase

如果你使用 build_runner,可以运行以下命令来自动监控文件变化并生成代码:

$ flutter pub run build_runner watch

3. 使用

初始化 Phrase Strings

main.dart 文件中初始化 Phrase,并设置分发ID和环境ID。你需要从 Phrase 平台获取这些ID。

import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:flutter_gen/gen_l10n/phrase_localizations.dart';
import 'package:phrase/phrase.dart';

void main() {
  // 初始化 Phrase,传入分发ID和环境ID
  Phrase.setup("[DISTRIBUTION_ID]", "[ENVIRONMENT_ID]");
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      localizationsDelegates: PhraseLocalizations.localizationsDelegates,
      supportedLocales: PhraseLocalizations.supportedLocales,
    );
  }
}
访问翻译内容

你可以在应用中像以前一样访问翻译内容,但现在的翻译会定期从 Phrase 平台检查更新并在后台下载。

Text(AppLocalizations.of(context)!.helloWorld);

4. 自定义

更新行为

默认情况下,Phrase 会在每次应用启动时检查并更新翻译内容。你可以禁用此行为,并手动触发更新:

// 禁用自动更新
Phrase.setup("[DISTRIBUTION_ID]", "[ENVIRONMENT_ID]", checkForUpdates: false);

// 手动触发更新
Phrase.updateTranslations(context).then((_) => print("Done!"));
API 主机

Phrase 默认使用欧洲主机。如果你需要使用美国主机,可以在初始化时指定:

Phrase.setup("[DISTRIBUTION_ID]", "[ENVIRONMENT_ID]", host: PhraseHost.us);
自定义应用版本

SDK 会根据应用版本返回与发布约束匹配的翻译版本。如果你的应用不使用语义化版本号,可以通过手动覆盖应用版本:

Phrase.setup("[DISTRIBUTION_ID]", "[ENVIRONMENT_ID]", customAppVersion: "1.2.3");
请求超时

默认情况下,OTA 请求的超时时间为 30 秒。你可以通过配置 Phrase 的初始化参数来更改这个值:

Phrase.setup("[DISTRIBUTION_ID]", "[ENVIRONMENT_ID]", defaultTimeout: const Duration(seconds: 10));

你也可以在手动更新翻译时设置超时时间,这将覆盖初始化时设置的超时值:

Phrase.updateTranslations(context, timeout: const Duration(seconds: 10));

5. 使用键字符串字面量访问 OTA 翻译

你可以通过包含翻译键的字符串字面量来访问 OTA 翻译。例如,对于以下 ARB 文件中的翻译:

{
  "textSimple": "Simple Text"
}

你可以使用 getText 方法来获取翻译值:

Text(AppLocalizations.of(context).getText('textSimple'))

而不是直接访问属性:

Text(AppLocalizations.of(context).textSimple)
带参数的翻译

你还可以使用 getText 方法来处理带参数的翻译。例如,对于以下 ARB 文件中的翻译:

{
  "textWithDate": "Text with date: {date}",
  "@textWithDate": {
    "description": "Text with date parameter",
    "placeholders": {
      "date": {
        "type": "DateTime",
        "format": "yMd"
      }
    }
  }
}

你可以通过传递参数来获取翻译值:

Text(AppLocalizations.of(context).getText(
  'textWithDate',
  args: {'date': DateTime.utc(1996, 7, 10)},
))

注意,参数键必须与翻译占位符名称匹配,否则会导致运行时错误。

设置回退值

getText 方法还支持为未找到的键设置回退值。这对于基于其他变量的键非常有用:

Text(AppLocalizations.of(context).getText(
  myKeyVariable,
  fallbackValue: 'fallback for unknownKey',
))

6. 完整示例 Demo

以下是一个完整的示例,展示了如何在 Flutter 应用中使用 phrase 插件进行本地化翻译。

import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:flutter_gen/gen_l10n/phrase_localizations.dart';
import 'package:phrase/phrase.dart';

void main() {
  // 初始化 Phrase,传入分发ID和环境ID
  Phrase.setup("[DISTRIBUTION_ID]", "[ENVIRONMENT_ID]");

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      localizationsDelegates: PhraseLocalizations.localizationsDelegates,
      supportedLocales: PhraseLocalizations.supportedLocales,
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(AppLocalizations.of(context)!.appTitle),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              AppLocalizations.of(context)!.helloWorld,
              style: TextStyle(fontSize: 24),
            ),
            SizedBox(height: 20),
            Text(
              AppLocalizations.of(context)!.getText(
                'textWithDate',
                args: {'date': DateTime.now()},
              ),
              style: TextStyle(fontSize: 18),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () {
                // 手动触发翻译更新
                Phrase.updateTranslations(context).then((_) {
                  ScaffoldMessenger.of(context).showSnackBar(
                    SnackBar(content: Text('Translations updated!')),
                  );
                });
              },
              child: Text('Update Translations'),
            ),
          ],
        ),
      ),
    );
  }
}

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

1 回复

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


当然,以下是一个关于如何在Flutter项目中使用Phrase插件进行本地化翻译的详细代码示例。Phrase是一个流行的本地化服务平台,可以帮助你管理和翻译应用程序的内容。

1. 添加依赖

首先,你需要在你的pubspec.yaml文件中添加Phrase Flutter插件的依赖:

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

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

2. 配置Phrase

你需要在Phrase平台上创建一个项目,并获取你的项目ID和访问令牌(Access Token)。然后,在你的Flutter项目中创建一个配置文件来存储这些信息。

android/app/src/main/目录下创建一个名为assets/phrase_config.json的文件,内容如下:

{
  "projectId": "your_project_id",
  "accessToken": "your_access_token"
}

确保将your_project_idyour_access_token替换为你从Phrase平台获取的实际值。

3. 初始化Phrase

在你的Flutter应用的入口文件(通常是main.dart)中,初始化Phrase客户端:

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // 加载Phrase配置
  final config = await rootBundle.loadString('assets/phrase_config.json');
  final phraseConfig = phraseConfigFromJson(config);

  // 初始化Phrase客户端
  await PhraseFlutter.init(
    projectId: phraseConfig.projectId,
    accessToken: phraseConfig.accessToken,
    fallbackLocale: 'en',  // 设置默认语言
    downloadTranslations: true,  // 是否自动下载翻译文件
  );

  runApp(MyApp());
}

class PhraseConfig {
  final String projectId;
  final String accessToken;

  PhraseConfig({required this.projectId, required this.accessToken});

  factory PhraseConfig.fromJson(Map<String, dynamic> json) {
    return PhraseConfig(
      projectId: json['projectId'] as String,
      accessToken: json['accessToken'] as String,
    );
  }
}

PhraseConfig phraseConfigFromJson(String str) =>
    PhraseConfig.fromJson(jsonDecode(str) as Map<String, dynamic>);

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
      localizationsDelegates: [
        PhraseLocalizations.delegate,  // 添加Phrase的本地化委托
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
      ],
      supportedLocales: PhraseFlutter.allSupportedLocales,  // 使用Phrase支持的所有语言
      locale: Locale(PhraseFlutter.currentLocaleCode),  // 设置当前语言
    );
  }
}

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(PhraseFlutter.t('app_title')),  // 从Phrase获取翻译
      ),
      body: Center(
        child: Text(PhraseFlutter.t('hello_world')),  // 从Phrase获取翻译
      ),
    );
  }
}

4. 在Phrase平台管理翻译

登录到你的Phrase项目,添加你想要翻译的键(例如app_titlehello_world),并为你支持的语言提供翻译。

5. 运行应用

现在,你可以运行你的Flutter应用,并看到根据当前设备语言设置自动加载的翻译文本。

注意事项

  • 确保你已经正确配置了Phrase平台上的项目,并上传了所有必要的翻译文件。
  • 在Phrase平台上管理翻译时,确保你的键名与你在Flutter代码中使用的键名一致。
  • 当你更新翻译时,应用会在下次启动时自动下载最新的翻译文件。

以上就是在Flutter项目中使用Phrase插件进行本地化翻译的完整代码示例。希望这对你有所帮助!

回到顶部