Flutter多语言支持插件polyglothq的使用

发布于 1周前 作者 ionicwang 来自 Flutter

Flutter多语言支持插件polyglothq的使用

polyglothq 是一个Dart命令行工具,用于在Flutter项目中使用Polyglot。它可以从polyglothq.com获取翻译,并将其转换为适合Flutter的形式。

如何安装

你可以通过运行以下命令来安装polyglothq

dart pub global activate polyglothq

使用方法

授权Polyglot

在使用polyglothq之前,你需要使用你的Polyglot令牌进行授权。运行以下命令进行授权:

polyglothq authorize <token>

这个命令会安全地存储你的令牌,使你能够使用polyglothq并拥有必要的权限。

在项目中初始化Polyglot

要在你的项目中开始使用polyglothq,请运行以下命令(确保在包含项目的目录中运行):

polyglothq init

你将被要求从Polyglot项目列表中选择你的项目。

从Polyglot拉取翻译

运行以下命令以从Polyglot拉取翻译:

polyglothq pull

对于动态文本,可以使用以下命令:

polyglothq pull --dynamic

如果我有相同的语言但不同的国家代码怎么办?

如果遇到相同语言但不同国家代码的情况,可以在polyglot.yml文件中指定默认国家代码:

:defaultCountryCode:
  en: GB
  sw: SW

Flutter中的使用方法

在你的Flutter代码中,可以这样使用字符串:

Strings.of(context).keyName

// 带参数的情况
Strings.of(context).keyName('arg0', 'arg1', ...)

如果没有上下文访问权限,则需要先添加以下小部件:

MaterialApp(
  builder: (context, child) {
    return StringsLocaleWidget(child: child!); // 使用StringsLocaleWidget
  },
);

然后可以使用:

Strings.latest.keyName

注意:在没有上下文的情况下使用翻译是非常不推荐的,应该只在特殊情况下使用。

示例代码

以下是完整的示例代码:

import 'package:example/util/localization/strings.dart';
import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return const MaterialApp(
      title: 'Polyglot Demo',
      localizationsDelegates: AppLocalizations.localizationsDelegates,
      supportedLocales: AppLocalizations.supportedLocales,
      home: HomeScreen(),
    );
  }
}

class HomeScreen extends StatelessWidget {
  const HomeScreen({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Text(Strings.of(context).appName),
      ),
    );
  }
}

更多关于Flutter多语言支持插件polyglothq的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter多语言支持插件polyglothq的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用polyglot插件来实现多语言支持的示例代码。polyglot插件允许你轻松地在Flutter应用中实现国际化(i18n)。不过需要注意的是,polyglot插件在最新版本的Flutter社区中可能不是最推荐的方案,更现代的插件如flutter_localizationsintl通常更为常用。但为了符合你的要求,这里还是展示如何使用polyglot

首先,确保你的pubspec.yaml文件中添加了polyglot依赖:

dependencies:
  flutter:
    sdk: flutter
  polyglot: ^3.0.0  # 请根据实际需要替换为最新版本

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

接下来,我们创建一个简单的Flutter应用,展示如何使用polyglot实现多语言支持。

1. 创建一个语言文件

首先,我们创建一个JSON文件来存储翻译内容。例如,创建assets/locales/en.jsonassets/locales/zh.json

assets/locales/en.json

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

assets/locales/zh.json

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

2. 加载语言文件

在你的Flutter应用中,加载并解析这些JSON文件。首先,在pubspec.yaml中添加这些文件为资源:

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

然后,在你的主应用文件中(例如main.dart),使用polyglot加载和切换语言:

import 'package:flutter/material.dart';
import 'package:polyglot/polyglot.dart';
import 'dart:convert';
import 'package:flutter/services.dart' show rootBundle;

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
      localizationsDelegates: [
        // 注意:这里不需要为polyglot设置localizationsDelegates,因为polyglot不依赖Flutter的内置本地化系统
      ],
      supportedLocales: [
        // 同样,这里不需要设置supportedLocales
      ],
      builder: (context, child) {
        return Polyglot(
          context: context,
          onGenerateMessage: (Locale locale) async {
            Map<String, dynamic> translations;
            String langCode = locale.languageCode;
            if (langCode == 'zh') {
              translations = await rootBundle.loadString('assets/locales/zh.json');
            } else {
              translations = await rootBundle.loadString('assets/locales/en.json');
            }
            return translations;
          },
          child: child,
        );
      },
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  Locale currentLocale = Locale('en');

  void changeLanguage(Locale newLocale) {
    setState(() {
      currentLocale = newLocale;
      // 通知Polyglot当前语言环境已更改
      Polyglot.of(context).setLocale(newLocale);
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(Polyglot.of(context).text('welcome')),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              Polyglot.of(context).text('goodbye'),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () => changeLanguage(Locale('zh')),
              child: Text('切换到中文'),
            ),
            SizedBox(height: 10),
            ElevatedButton(
              onPressed: () => changeLanguage(Locale('en')),
              child: Text('切换到英文'),
            ),
          ],
        ),
      ),
    );
  }
}

3. 运行应用

现在,当你运行应用时,你应该能够看到初始的英文文本,并可以通过点击按钮在中文和英文之间切换。

注意

  • 上述代码示例使用了PolyglotonGenerateMessage回调函数来异步加载JSON翻译文件。
  • Polyglot.of(context).text('key')用于获取翻译后的文本。
  • 切换语言时,通过调用Polyglot.of(context).setLocale(newLocale)来更新当前语言环境。

尽管polyglot插件提供了一种简单的方法来实现多语言支持,但在生产环境中,更推荐使用Flutter官方推荐的flutter_localizationsintl插件,因为它们与Flutter生态系统更加集成。

回到顶部