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

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

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

简介

multi_language_json 是一个简单易用的Flutter插件,用于在Flutter应用中实现多语言支持。通过该插件,您可以轻松地为您的应用添加多种语言,并且可以根据用户的设备语言自动选择合适的语言。

示例动画

开始使用

1. 创建语言文件目录

首先,在项目的主目录下创建一个名为 lang 的文件夹,并在其中放置不同语言的 JSON 文件。每个 JSON 文件的名称应包含语言和国家代码,例如 en_US.jsonpt_BR.json

project/
├── lib/
│   └── ...
└── lang/
    ├── en_US.json
    └── pt_BR.json

2. 在 pubspec.yaml 中添加语言文件

确保在 pubspec.yaml 文件中正确引用这些语言文件:

flutter:
  assets:
    - lang/en_US.json
    - lang/pt_BR.json

3. 初始化 MultiLanguageBloc

在代码中,您需要创建一个 MultiLanguageBloc 对象,并指定初始语言、默认语言、通用路由以及支持的语言列表。

final language = MultiLanguageBloc(
  initialLanguage: 'pt_BR',
  defaultLanguage: 'pt_BR',
  commonRoute: 'common',
  supportedLanguages: ['en_US', 'pt_BR'],
);

4. 使用 MultiLanguageStart 初始化语言

在应用启动时,使用 MultiLanguageStart 小部件来初始化语言。这只需要在应用首次启动时执行一次,之后可以仅使用 MultiStreamLanguage 小部件。

[@override](/user/override)
Widget build(BuildContext context) {
  return MultiLanguageStart(
    future: language.init(),
    builder: (context) => MultiStreamLanguage(
      screenRoute: ['home'],
      builder: (context, data) => Scaffold(
        appBar: AppBar(
          title: Text(data.getValue(route: ['title'])),
        ),
        body: Center(
          child: ElevatedButton(
            child: Text(data.getValue(route: ['btn'])),
            onPressed: () => language.showAlertChangeLanguage(
              context: context,
              title: data.getValue(route: ['dialog', 'title'], inRoute: false),
              btnNegative: data.getValue(route: ['dialog', 'btn_negative'], inRoute: false),
            ),
          ),
        ),
      ),
    ),
  );
}

使用 MultiStreamLanguage 小部件

1. 设置 screenRoute

screenRoute 参数用于指定当前屏幕的语言路径。例如,如果您的 JSON 文件结构如下:

{
  "home": {
    "title": "Home",
    "btn": "Click me"
  }
}

则可以这样设置 screenRoute

screenRoute: ['home']

如果需要访问更深层次的节点,可以通过传递更多的路径元素:

screenRoute: ['home', 'nested_route']

2. 使用 getValue 方法获取文本

getValue 方法用于从指定路径获取文本。它有两个参数:routeinRouteinRoute 决定是否在当前屏幕路径内查找文本。

示例:

假设 JSON 文件结构如下:

{
  "home": {
    "title": "Home",
    "my_route": "A"
  },
  "my_route": "B"
}
  • 如果调用 data.getValue(route: ['my_route'], inRoute: true),将返回 "B"
  • 如果调用 data.getValue(route: ['my_route'], inRoute: false),将返回 "A"

3. 处理不存在的路径

如果指定的路径在当前语言中不存在,插件会尝试在默认语言中查找。如果仍然找不到,则返回 'NULL'

切换语言

为了支持语言切换功能,每个语言节点必须包含一个名为 config 的子节点,其中包含语言名称和图标信息。

{
  "config": {
    "title": "Portuguese (Brazil)",
    "icon": "path_to_flag"
  }
}

显示语言切换对话框

调用 showAlertChangeLanguage 方法显示语言切换对话框:

language.showAlertChangeLanguage(
  context: context,
  title: 'Select Language',
  btnNegative: 'Cancel'
);

编程方式切换语言

您也可以通过编程方式切换语言:

language.changeLanguage('pt_BR');

完整示例代码

以下是一个完整的示例应用,展示了如何使用 multi_language_json 插件实现多语言支持:

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

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Multi Language - Example',
      home: Home(),
      supportedLocales: [const Locale('en', 'US'), const Locale('pt', 'BR')],
    );
  }
}

class Home extends StatefulWidget {
  [@override](/user/override)
  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {
  final language = MultiLanguageBloc(
    initialLanguage: 'pt_BR',
    defaultLanguage: 'pt_BR',
    commonRoute: 'common',
    supportedLanguages: ['en_US', 'pt_BR'],
  );

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MultiLanguageStart(
      future: language.init(),
      builder: (context) => MultiStreamLanguage(
        screenRoute: ['home'],
        builder: (context, data) => Scaffold(
          appBar: AppBar(
            title: Text(data.getValue(route: ['title'])),
          ),
          body: Center(
            child: ElevatedButton(
              child: Text(data.getValue(route: ['btn'])),
              onPressed: () => language.showAlertChangeLanguage(
                context: context,
                title: data.getValue(route: ['dialog', 'title'], inRoute: false),
                btnNegative: data.getValue(route: ['dialog', 'btn_negative'], inRoute: false),
              ),
            ),
          ),
        ),
      ),
    );
  }
}

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

1 回复

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


当然,下面是一个关于如何在Flutter项目中使用multi_language_json插件来实现多语言支持的代码示例。这个插件允许你从JSON文件中加载语言资源,并轻松地在应用中进行切换。

步骤 1: 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  multi_language_json: ^latest_version  # 请替换为最新版本号

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

步骤 2: 准备语言文件

创建JSON文件来存储你的语言资源。例如,创建en.jsonzh.json文件:

assets/lang/en.json:

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

assets/lang/zh.json:

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

步骤 3: 配置pubspec.yaml中的assets

pubspec.yaml文件中添加你的语言资源文件到assets部分:

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

步骤 4: 初始化MultiLanguageJson

在你的主文件(通常是main.dart)中初始化MultiLanguageJson

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

void main() {
  // 初始化MultiLanguageJson
  MultiLanguageJson.load(
    jsonAssetPath: 'assets/lang/', // JSON文件所在的路径,不包括文件名
    defaultLanguageCode: 'en', // 默认语言代码
  ).then((_) {
    runApp(MyApp());
  });
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
      localizationsDelegates: [
        // 添加MultiLanguageJsonDelegate
        MultiLanguageJsonDelegate(),
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
      ],
      supportedLocales: [
        Locale('en', ''),
        Locale('zh', ''),
      ],
      locale: Locale(MultiLanguageJson.of(context).currentLanguageCode), // 设置当前语言
    );
  }
}

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

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(MultiLanguageJson.of(context).translate('welcome')),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(MultiLanguageJson.of(context).translate('welcome')),
            ElevatedButton(
              onPressed: () {
                // 切换语言
                MultiLanguageJson.of(context).changeLanguage('zh');
                setState(() {}); // 刷新界面
              },
              child: Text('切换到中文'),
            ),
            ElevatedButton(
              onPressed: () {
                MultiLanguageJson.of(context).changeLanguage('en');
                setState(() {}); // 刷新界面
              },
              child: Text('切换到英文'),
            ),
            Text(MultiLanguageJson.of(context).translate('goodbye')),
          ],
        ),
      ),
    );
  }
}

解释

  1. 初始化MultiLanguageJson: 在main函数中,我们使用MultiLanguageJson.load方法来加载语言资源。这个方法需要两个参数:jsonAssetPathdefaultLanguageCode

  2. 设置LocalizationsDelegates和SupportedLocales: 在MaterialApp中,我们添加了MultiLanguageJsonDelegatelocalizationsDelegates列表中,并设置了supportedLocales来包括我们支持的语言。

  3. 使用翻译文本: 使用MultiLanguageJson.of(context).translate('key')方法来获取翻译后的文本。

  4. 切换语言: 通过调用MultiLanguageJson.of(context).changeLanguage('languageCode')方法来切换语言,并使用setState(() {})来刷新界面以显示新的语言。

这样,你就成功地在Flutter应用中使用multi_language_json插件实现了多语言支持。

回到顶部