Flutter本地化插件localized的使用

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

Flutter本地化插件localized的使用

1. 简介

localized 是一个用于Flutter应用的本地化插件,它提供了字符串扩展函数 localized 以及翻译工具,帮助开发者轻松实现多语言支持。该插件可以生成JSON格式的本地化文件,并支持通过Google、Yandex和Microsoft的API进行自动翻译。

2. 功能特性

  • 生成JSON本地化文件:提供脚本生成空的JSON文件,用于存放不同语言的字符串。
  • 字符串扩展函数 localized:通过扩展 String 类,可以直接调用 localized 方法来获取当前语言环境下的字符串。
  • 翻译工具:支持通过Google、Yandex和Microsoft的翻译API自动翻译JSON文件中的字符串。

3. 使用步骤

3.1 安装依赖

首先,在 pubspec.yaml 文件中添加 localized 依赖:

dependencies:
  localized: ^2.1.1

然后运行以下命令来获取依赖:

flutter pub get
3.2 生成本地化文件

使用以下命令生成指定语言的JSON文件(例如:德语、英语、俄语):

flutter pub run localized:main -c -l en,de,ru

如果你想将生成的文件放在自定义目录中,可以使用 -d 参数指定目录:

flutter pub run localized:main -c -l en,de,ru -d res/localizations

生成的文件结构如下:

- assets
    - i18n
        - de.json
        - en.json
        - ru.json

或者如果你指定了自定义目录:

- res
    - localizations
        - de.json
        - en.json
        - ru.json
3.3 配置 pubspec.yaml

pubspec.yaml 文件中添加生成的本地化文件路径:

flutter:
  assets:
    - assets/i18n/

或者如果你使用了自定义目录:

flutter:
  assets:
    - res/localizations/
3.4 编写代码
3.4.1 导入库

在Dart文件中导入 localized 库:

import 'package:localized/localized.dart';
3.4.2 设置支持的语言

创建一个 Locale 列表,包含你想要支持的语言:

final locales = [
  Locale('de', 'DE'),
  Locale('en', 'EN'),
  Locale('ru', 'RU'),
];
3.4.3 配置 MaterialApp

MaterialApp 中设置 supportedLocaleslocalizationsDelegates

class MyApp extends StatelessWidget {
  final locales = [
    Locale('de', 'DE'),
    Locale('en', 'EN'),
    Locale('ru', 'RU'),
  ];

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      supportedLocales: locales,
      localizationsDelegates: [
        GlobalCupertinoLocalizations.delegate,
        GlobalMaterialLocalizations.delegate,
        LocalizationService.delegate(locales: locales),
      ],
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(),
    );
  }
}
3.4.4 使用 localized 函数

在需要显示文本的地方,使用 localized 函数来获取当前语言环境下的字符串:

Text('title'.localized(context)), // 根据设备语言显示不同的标题

完整示例代码如下:

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:localized/localized.dart';

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

class MyApp extends StatelessWidget {
  final locales = [
    Locale('de', 'DE'),
    Locale('en', 'EN'),
    Locale('ru', 'RU'),
  ];

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      supportedLocales: locales,
      localizationsDelegates: [
        GlobalCupertinoLocalizations.delegate,
        GlobalMaterialLocalizations.delegate,
        LocalizationService.delegate(locales: locales),
      ],
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key}) : super(key: key);

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('title'.localized(context)), // 根据设备语言显示不同的标题
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'amount_of_clicks'.localized(context), // 根据设备语言显示不同的点击次数提示
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'increase'.localized(context), // 根据设备语言显示不同的按钮提示
        child: Icon(Icons.add),
      ), // This trailing comma makes auto-formatting nicer for build methods.
    );
  }
}

4. 自动翻译

localized 插件还支持通过API自动翻译JSON文件中的字符串。你可以选择使用Google、Yandex或Microsoft的翻译服务。

4.1 使用Google Cloud Translator
flutter pub run localized:main -t -l ru,en,de -p Google -k YOUR_GOOGLE_API_KEY -n MAXIMUM_BUFFER_NUMBER
4.2 使用Yandex Translator
flutter pub run localized:main -t -l ru,en,de -p Yandex -f YOUR_YANDEX_FOLDER_ID -n MAXIMUM_BUFFER_NUMBER -i YOUR_YANDEX_IAM_TOKEN
4.3 使用Microsoft Translator
flutter pub run localized:main -t -l ru,en,de -p Microsoft -m YOUR_MICROSOFT_KEY -r YOUR_REGION -n 100

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

1 回复

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


当然,以下是如何在Flutter项目中使用localized插件进行本地化的代码示例。localized插件并不是Flutter官方提供的插件,但假设它提供了类似的功能,我们可以基于一般的本地化流程来展示如何集成和使用一个本地化插件。

通常情况下,Flutter的本地化是通过flutter_localizations包和intl包来实现的。但为了符合你的要求,我将展示一个假设的localized插件的使用方式,这个插件可能会提供类似的功能。

1. 添加依赖

首先,在你的pubspec.yaml文件中添加localized插件的依赖(注意:这只是一个假设的插件名,实际使用时请替换为真实存在的插件名):

dependencies:
  flutter:
    sdk: flutter
  localized: ^x.y.z  # 替换为实际的版本号

2. 配置本地化资源

在项目的res目录下创建locales文件夹,并在其中为每个语言创建对应的JSON文件。例如,创建en.jsonzh.json文件:

// en.json
{
  "greeting": "Hello",
  "farewell": "Goodbye"
}

// zh.json
{
  "greeting": "你好",
  "farewell": "再见"
}

3. 初始化插件和设置语言环境

在你的main.dart文件中初始化localized插件,并设置当前语言环境:

import 'package:flutter/material.dart';
import 'package:localized/localized.dart';  // 假设的包导入路径

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // 初始化Localizations
    Localized.load(context, 'locales');  // 假设的方法调用,实际请根据插件文档调整

    // 设置语言环境,这里假设根据系统语言自动设置
    final locale = Localizations.localeOf(context);
    Localized.setLocale(locale);

    return MaterialApp(
      title: 'Flutter Localization Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
      locale: locale,
      supportedLocales: [
        Locale('en'),
        Locale('zh'),
      ],
      localizationsDelegates: [
        // 假设localized插件提供的本地化委托
        Localized.delegate,
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
      ],
      localeResolutionCallback: (locale, supportedLocales) {
        for (var supportedLocale in supportedLocales) {
          if (supportedLocale.languageCode == locale?.languageCode ||
              supportedLocale.countryCode == locale?.countryCode) {
            return supportedLocale;
          }
        }
        return supportedLocales.first;
      },
    );
  }
}

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final String greeting = Localized.of(context).get('greeting');
    final String farewell = Localized.of(context).get('farewell');

    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Localization Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(greeting),
            Text(farewell),
          ],
        ),
      ),
    );
  }
}

4. 注意事项

  • 实际插件的API可能不同:上述代码是一个假设的示例,实际使用localized插件时,请参照该插件的官方文档进行配置和使用。
  • JSON文件路径:确保JSON文件路径正确,并且插件能够正确加载这些文件。
  • 错误处理:在生产环境中,建议添加适当的错误处理逻辑,以处理加载本地化资源时可能出现的错误。

由于localized插件并非一个真实存在的插件(至少在我最后的知识更新日期之前),因此上述代码是基于假设的插件功能和一般的Flutter本地化流程编写的。实际使用时,请替换为真实存在的本地化插件,并根据其文档进行调整。

回到顶部