Flutter国际化插件fluintl的使用

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

Flutter国际化插件fluintl的使用

使用方式:

  1. 创建多语言资源字符串id管理类Ids 和 多语言资源Map
/// 多语言资源id管理类.
class Ids {
  static String titleHome = 'title_home';
  static String titleSetting = 'title_setting';
  static String click_times = 'click_times';
}

/// 简单多语言资源.
Map<String, Map<String, String>> localizedSimpleValues = {
  'en': {
    Ids.titleHome: 'Home',
    Ids.titleSetting: 'Setting',
    Ids.click_times: '%\$0\$s click on %\$1\$s times',
  },
  'zh': {
    Ids.titleHome: '主页',
    Ids.titleSetting: '设置',
    Ids.click_times: '%\$0\$s点击了%\$1\$s次',
  },
};

/// 多语言资源.
Map<String, Map<String, Map<String, String>>> localizedValues = {
  'en': {
    'US': {
      Ids.titleHome: 'Home',
      Ids.titleSetting: 'Setting',
      Ids.click_times: '%\$0\$s click on %\$1\$s times',
    }
  },
  'zh': {
    'CN': {
      Ids.titleHome: '主页',
      Ids.titleSetting: '设置',
      Ids.click_times: '%\$0\$s点击了%\$1\$s次',
    },
    'HK': {
      Ids.titleHome: '主頁',
      Ids.titleSetting: '設置',
      Ids.click_times: '%\$0\$s点击了%\$1\$s次',
    },
    'TW': {
      Ids.titleHome: '主頁',
      Ids.titleSetting: '設置',
      Ids.click_times: '%\$0\$s点击了%\$1\$s次',
    }
  }
};
  1. 在MyApp initState配置多语言资源(可配置通用或简单多语言资源,二选一)
void initState() {
  super.initState();
  // setLocalizedSimpleValues(localizedSimpleValues); // 配置简单多语言资源
  setLocalizedValues(localizeddValues); // 配置多语言资源
}
  1. 在MaterialApp指定localizationsDelegates和supportedLocales:
MaterialApp(
  home: MyHomePage(),
  localizationsDelegates: [
    GlobalMaterialLocalizations.delegate,
    GlobalWidgetsLocalizations.delegate,
    CustomLocalizations.delegate // 设置本地化代理
  ],
  supportedLocales: CustomLocalizations.supportedLocales, // 设置支持本地化语言集合
);
  1. 字符串获取
IntlUtil.getString(context, Ids.titleHome);
IntlUtil.getString(context, Ids.titleHome, params: ['param1', 'param2']);
CustomLocalizations.of(context).getString(Ids.titleHome)
  1. 其他(不推荐使用)
// 在主页初始化.
class _MyHomePageState extends State<MyHomePage> {
  Widget build(BuildContext context) {
    CustomLocalizations.init(context);
    ...
  }

  // 字符串获取
  CustomLocalizations.instance.getString(Ids.titleHome)
}
  1. 应用国际化详细使用请参考 flutter_wanandroid App。

Q:Flutter国际化系统切换iOS不生效问题?

A:在Xcode项目Localizations下添加支持语言即可,原文

添加依赖

dependencies:
  flutter_localizations:
    sdk: flutter  

  fluintllt: x.x.x  # 最新版本

API

setLocalizedSimpleValues(values)                    : 配置简单多语言资源.
setLocalizedValues(values)                          : 配置多语言资源.
CustomLocalizations.delegate                        : 自定义本地化代理.
CustomLocalizations.supportedLocales                : 本地支持的语言环境.
CustomLocalizations.of(context)                     : 获取CustomLocalizations.
getString(id, {languageCode, countryCode, params})  : 通过id获取字符串, 可指定languageCode,countryCode.
IntlUtil.getString(context, id, params)             : 通过id获取字符串, 可指定languageCode,countryCode.

// 不推荐使用
CustomLocalizations.init(context)                   : 自定义本地化代理初始化.(在MyHomePage初始化)
LBaseState (extends or with LBaseState)             : 可方便简洁获取字符串
cl.getString(id).(MyHomePage不能使用)

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

1 回复

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


当然,以下是一个关于如何在Flutter项目中使用fluintl插件来实现国际化的代码示例。

1. 添加依赖

首先,在你的pubspec.yaml文件中添加fluintl依赖:

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

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

2. 创建语言文件

在你的项目根目录下创建一个assets/locales文件夹,并在其中创建不同语言的JSON文件。例如:

  • en.json (英语)
  • zh.json (中文)

en.json的内容可能如下:

{
  "welcome_message": "Welcome to our app!",
  "goodbye_message": "Goodbye!"
}

zh.json的内容可能如下:

{
  "welcome_message": "欢迎来到我们的应用!",
  "goodbye_message": "再见!"
}

3. 配置pubspec.yaml以包含语言文件

pubspec.yaml中添加语言文件到assets中:

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

4. 初始化Flutter Intl

在你的main.dart文件中初始化Fluintl

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Intl Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      localizationsDelegates: [
        FluintlDelegate(
          fallbackLocale: Locale('en', 'US'), // 默认语言
          useCountryCode: true,
        ),
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
      ],
      supportedLocales: [
        Locale('en', 'US'),
        Locale('zh', 'CN'),
      ],
      locale: Locale('en', 'US'), // 初始语言
      home: MyHomePage(),
    );
  }
}

5. 使用国际化字符串

在你的MyHomePage或其他页面中,使用Fluintl来获取国际化字符串:

import 'package:flutter/material.dart';
import 'package:fluintl/fluintl.dart';
import 'package:flutter_intl/flutter_intl.dart'; // 注意:这个导入是为了示例,实际使用fluintl不需要

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

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    final Fluintl fluintl = Fluintl.of(context);

    return Scaffold(
      appBar: AppBar(
        title: Text(fluintl.translate('welcome_message')),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(fluintl.translate('welcome_message')),
            ElevatedButton(
              onPressed: () {
                // 切换语言示例
                Navigator.push(
                  context,
                  MaterialPageRoute(
                    builder: (context) => ChangeLanguagePage(),
                  ),
                );
              },
              child: Text(fluintl.translate('goodbye_message')),
            ),
          ],
        ),
      ),
    );
  }
}

class ChangeLanguagePage extends StatefulWidget {
  @override
  _ChangeLanguagePageState createState() => _ChangeLanguagePageState();
}

class _ChangeLanguagePageState extends State<ChangeLanguagePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Change Language'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: () {
                setLocale(context, Locale('en', 'US'));
              },
              child: Text('English'),
            ),
            ElevatedButton(
              onPressed: () {
                setLocale(context, Locale('zh', 'CN'));
              },
              child: Text('中文'),
            ),
          ],
        ),
      ),
    );
  }

  void setLocale(BuildContext context, Locale newLocale) {
    _MyAppState? myAppState =
        ModalRoute.of(context)!.settings.arguments as _MyAppState?;
    myAppState?.setLocale(newLocale);
    Navigator.pop(context);
  }
}

class _MyAppState extends State<MyApp> {
  void setLocale(Locale locale) {
    setState(() {
      Locale myLocale = locale;
      print("Locale set to: ${myLocale.languageCode}_${myLocale.countryCode}");
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      locale: Locale('en', 'US'), // 初始语言,这里会被setLocale方法更新
      localizationsDelegates: [
        FluintlDelegate(
          fallbackLocale: Locale('en', 'US'),
          useCountryCode: true,
        ),
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
      ],
      supportedLocales: [
        Locale('en', 'US'),
        Locale('zh', 'CN'),
      ],
      home: MyHomePage(),
    );
  }
}

注意:在上面的ChangeLanguagePage示例中,_MyAppState的使用是为了演示如何切换语言,但在实际项目中,你可能需要更优雅地管理语言切换,例如使用Provider或Riverpod等状态管理库。

这个例子展示了如何在Flutter应用中使用fluintl插件来实现基本的国际化功能。根据你的具体需求,你可能需要进一步定制和扩展这个示例。

回到顶部