Flutter本地化管理插件auto_localized的使用

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

Flutter本地化管理插件 auto_localized 的使用

auto_localized 是一个简化 Flutter 本地化的插件,通过代码生成来实现。这种方法有许多优点,如运行时安全性、更好的性能等。生成器会检查翻译文件中的缺失键、空白值等,并输出易于使用的 Dart 字段或方法。

主要特性

  • 运行时验证
  • 无需 BuildContext 即可获取翻译
  • 安全参数
  • 支持的文件类型:JSON, YAML

开始使用

原生设置(iOS)

在 iOS 上,需要在 ios/Runner/Info.plist 中添加支持的语言环境:

<key>CFBundleLocalizations</key>
<array>
  <string>pl</string>
  <string>en</string>
  <string>sk</string>
</array>

pubspec.yaml 设置

添加依赖到你的 pubspec.yaml 文件中:

dependencies:
  auto_localized: ^latest_version

dev_dependencies:
  build_runner: ^latest_version
  auto_localized_generator: ^latest_version

注意:不需要手动添加 flutter_localizations,因为 auto_localized 已经为你处理了这一点。

如果翻译文件存储在 lib 目录之外(推荐),例如:

lang/
├── en.yaml
├── pl.json
└── sk.json
lib/
build.yaml
pubspec.yaml

你需要告诉 build_runner 关于这些目录的信息,通过覆盖默认的 sources。创建或更新根目录下的 build.yaml 文件并添加以下部分:

targets:
  $default:
    sources:
      - $package$
      - lib/**
      - lang/**  # <-- your translations directory 

配置

创建一个新的 Dart 文件,并用 AutoLocalized 注解它:

import 'package:auto_localized/annotations.dart';

@AutoLocalized(
  locales: [
    AutoLocalizedLocale(
      languageCode: 'pl',
      translationsFiles: ['lang/pl.json'],
    ),
    AutoLocalizedLocale(
      languageCode: 'en',
      countryCode: 'US',
      translationsFiles: ['lang/en.json'],
    ),
    AutoLocalizedLocale(
      languageCode: 'sk',
      translationsFiles: ['lang/sk.json'],
    ),
  ],
)
class $Strings {}

注意:类名必须以 $ 开头,例如上面的例子中,最终生成的类名为 Strings

生成代码

运行以下命令生成代码:

flutter pub run build_runner build --delete-conflicting-outputs

或者,如果你想在每次文件更改后自动构建:

flutter pub run build_runner watch --delete-conflicting-outputs

使用

在应用声明中添加生成的配置字段 supportedLocaleslocalizationsDelegates。如果你想在没有上下文的情况下获取翻译,需要用 AutoLocalizedApp 包裹 MaterialApp

return AutoLocalizedApp(
  child: MaterialApp(
    supportedLocales: context.supportedLocales,
    localizationsDelegates: context.localizationsDelegates,
  ),
);

你可以通过 AutoLocalizedData 类或 AutoLocalizedContextExtension 访问这些字段。

示例代码

下面是一个完整的示例,展示了如何使用 auto_localized 插件:

import 'package:auto_localized/auto_localized.dart';
import 'package:example/localization.al.dart'; // 确保这是你生成的文件路径
import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return AutoLocalizedApp(
      child: MaterialApp(
        title: 'Auto Localized Example',
        theme: ThemeData(
          primarySwatch: Colors.blue,
          visualDensity: VisualDensity.adaptivePlatformDensity,
        ),
        supportedLocales: context.supportedLocales,
        localizationsDelegates: context.localizationsDelegates,
        home: HomePage(),
      ),
    );
  }
}

class HomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(
          Strings.welcomeName.get('Marcin', ':D'),
        ),
      ),
      body: Center(
        child: Text(
          Strings.getTestMessage(),
        ),
      ),
    );
  }
}

其他功能

安全参数

你可以定义最多5个参数用于翻译字符串。例如:

{
  "welcome_message" : "Welcome {1}!, You have {2} points."
}

使用时:

Strings.welcomeMessage('Marcin', '3');

当前语言环境

你可以访问当前的语言环境:

AutoLocalization.instance.locale;

语言环境变更回调

如果你希望在语言环境变化时执行某些任务,可以使用 AutoLocalization.addOnLocaleChangeCallback

AutoLocalization.addOnLocaleChangeCallback((locale) { 
  // 执行任务
});

取消监听:

AutoLocalization.removeOnLocaleChangeCallback(onLocaleChange);

以上就是 auto_localized 插件的基本使用方法。希望对你有所帮助!


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

1 回复

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


当然,关于在Flutter项目中使用auto_localized插件进行本地化管理,以下是一个具体的代码案例,展示了如何设置和使用该插件。

首先,确保你的Flutter项目已经创建,并且pubspec.yaml文件中已经添加了auto_localized依赖:

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

然后运行flutter pub get来获取依赖。

1. 设置本地化资源

lib目录下创建一个locales文件夹,并在其中创建不同语言的JSON文件,例如en.jsonzh.json

locales/en.json

{
  "welcome_message": "Welcome to our app!"
}

locales/zh.json

{
  "welcome_message": "欢迎来到我们的应用!"
}

2. 配置auto_localized

lib目录下创建一个main.dart文件,并配置auto_localized

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return AutoLocalized(
      supportedLocales: [
        Locale('en', ''),
        Locale('zh', ''),
      ],
      pathToLocales: 'locales', // 指定JSON文件所在的目录
      fallbackLocale: Locale('en', ''), // 默认语言
      child: MaterialApp(
        title: 'Flutter Demo',
        theme: ThemeData(
          primarySwatch: Colors.blue,
        ),
        home: MyHomePage(),
      ),
    );
  }
}

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // 使用AutoLocalized.of来获取本地化的字符串
    final String welcomeMessage = AutoLocalized.of(context).translate('welcome_message');

    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Demo Home Page'),
      ),
      body: Center(
        child: Text(welcomeMessage),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          // 切换语言示例,这里切换到中文
          AutoLocalized.of(context).setLocale(Locale('zh', ''));
        },
        tooltip: 'Switch to Chinese',
        child: Icon(Icons.translate),
      ),
    );
  }
}

3. 运行应用

现在你可以运行你的Flutter应用,应用会根据设备的系统语言显示相应的本地化内容。如果你点击浮动操作按钮(FAB),应用会切换到中文显示。

注意事项

  • 确保JSON文件的键名与你在代码中使用的键名一致。
  • AutoLocalized.of(context).translate('key')用于获取本地化字符串。
  • AutoLocalized.of(context).setLocale(Locale('locale_code', ''))用于动态切换语言。

这个示例展示了如何使用auto_localized插件进行基本的本地化管理。根据你的需求,你可以进一步扩展和优化代码。

回到顶部