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

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

特性

  • 使用JSON文件来翻译您的应用程序。

开始

在你的项目中添加json_translation依赖包:

flutter pub add json_translation

使用

查看示例

按语言添加JSON文件

locales路径下为每种支持的语言添加一个JSON文件,并在pubspec.yaml中描述它。

路径必须为./locales

flutter:
  assets:
    - locales/

使用一个JSON文件/对象来表示应用本地化的键:String/值:String对。

示例项目树

JSON文件名必须与supportedLocales中描述的语言代码完全匹配。

lib/
locales/
    en.json
    fr.json

示例JSON文件

// en.json
{
	"hello-world": "Hello World."
}

// fr.json
{
	"hello-world": "Bonjour à tous."
}

示例MaterialApp

MaterialApplocalizationsDelegates中添加JsonTranslation.delegate

MaterialApp(
    localizationsDelegates: const [
        JsonTranslation.delegate,
        ...GlobalMaterialLocalizations.delegates,
    ],
    supportedLocales: const [
        Locale('en'),
        Locale('fr'),
    ],
);

示例

使用$()函数进行关键词翻译。

import 'package:json_translation/json_translation.dart';

Container(
    child: Text($("hello-world"))
)

贡献

您可以以多种方式为本项目做出贡献!您可以:


完整示例代码

以下是完整的示例代码:

import 'package:flutter/material.dart';
import 'package:json_translation/json_translation.dart';
import 'package:flutter_localizations/flutter_localizations.dart';

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

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();

  static void setLocale(BuildContext context, Locale locale) {
    _MyAppState state = context.findAncestorStateOfType<_MyAppState>()!;
    state.setLocale(locale);
  }
}

class _MyAppState extends State<MyApp> {
  // 这个小部件是您的应用程序的根节点。

  Locale _locale = const Locale.fromSubtags(languageCode: 'en');

  void setLocale(Locale locale) {
    setState(() {
      _locale = locale;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'JSON Translation Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'JSON Translation Demo'),
      localizationsDelegates: const [
        JsonTranslation.delegate,
        ...GlobalMaterialLocalizations.delegates,
      ],
      supportedLocales: const [
        Locale('en'),
        Locale('fr'),
      ],
      locale: _locale,
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key, required this.title}) : super(key: key);
  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {

    // 初始化插件
    JsonTranslation.init(context);

    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            // 显示翻译文本
            Text($("hello-world")),
          ],
        ),
      ),
      bottomNavigationBar: BottomNavigationBar(
        currentIndex: index,
        onTap: (value) {
          setState(() {
            index = value;
          });
          String lang;
          switch (index) {
            case 0:
              lang = 'en';
              break;
            case 1:
              lang = 'fr';
              break;
            default:
              lang = 'en';
          }
          MyApp.setLocale(context, Locale.fromSubtags(languageCode: lang));
        },
        items: const [
          BottomNavigationBarItem(
            icon: Text("EN"),
            label: 'English',
          ),
          BottomNavigationBarItem(
            icon: Text("FR"),
            label: 'French',
          ),
        ],
      ),
    );
  }
}

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

1 回复

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


在 Flutter 中,json_translation 是一个用于管理应用程序本地化翻译的插件。它允许你将翻译字符串存储在 JSON 文件中,并在应用程序中使用这些翻译。下面是使用 json_translation 插件的详细步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  json_translation: ^1.1.0

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

2. 创建 JSON 翻译文件

在项目的 assets 目录下创建一个 translations 文件夹,并在其中为每种语言创建一个 JSON 文件。例如:

  • assets/translations/en.json
  • assets/translations/es.json
  • assets/translations/fr.json

每个 JSON 文件应包含键值对,其中键是翻译的标识符,值是翻译的文本。例如,en.json 文件可能如下所示:

{
  "hello": "Hello",
  "goodbye": "Goodbye"
}

es.json 文件可能如下所示:

{
  "hello": "Hola",
  "goodbye": "Adiós"
}

3. 配置 pubspec.yaml

pubspec.yaml 文件中,确保你已经将 assets 文件夹包含在 flutter 部分:

flutter:
  assets:
    - assets/translations/

4. 生成翻译文件

json_translation 插件提供了一个命令行工具来生成 Dart 代码,以便在应用程序中使用翻译。

首先,确保你已经安装了 json_translation 命令行工具:

flutter pub global activate json_translation

然后在项目根目录下运行以下命令来生成 Dart 文件:

flutter pub global run json_translation:generate

这将在 lib/generated 目录下生成一个 translations.dart 文件。

5. 在应用程序中使用翻译

在生成的 translations.dart 文件中,你会看到一些生成的类和方法。你可以在应用程序中使用这些类来获取翻译。

首先,在 main.dart 文件中初始化翻译:

import 'package:flutter/material.dart';
import 'generated/translations.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Translations.load(Locale('en')); // 设置默认语言为英语
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      locale: Locale('en'), // 设置默认语言为英语
      localizationsDelegates: Translations.localizationsDelegates,
      supportedLocales: Translations.supportedLocales,
      home: MyHomePage(),
    );
  }
}

然后在你的 widget 中使用翻译:

import 'package:flutter/material.dart';
import 'generated/translations.dart';

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(Translations.of(context).hello),
      ),
      body: Center(
        child: Text(Translations.of(context).goodbye),
      ),
    );
  }
}

6. 切换语言

你可以通过调用 Translations.load(Locale('es')) 来动态切换语言。例如:

FlatButton(
  onPressed: () {
    Translations.load(Locale('es')); // 切换到西班牙语
  },
  child: Text('Switch to Spanish'),
)
回到顶部