Flutter国际化注解插件localizable_annotation的使用

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

Flutter国际化注解插件localizable_annotation的使用

localizable_annotation 是一个用于本地化的注解插件,它允许自动生成本地化类。该插件由 localizable 包所依赖。

开始使用

首先,在你的项目中添加 localizable_annotation 作为依赖项:

dependencies:
  localizable_annotation: ^0.0.3

然后,你可以像下面这样注解你的翻译类:

import 'package:localizable_annotation/localizable_annotation.dart';

[@Localizable](/user/Localizable)(
  className: "AppLocalization",
)
class AppTranslations {
  // 设置本地化字符串的常量值
  // 
  // 这个值是一个Map。第一层map的键是语言代码,第二层map的键是本地化字符串的键。
  // 例如:
  // 
  // ```
  // 'en': {
  //  'title': 'Title',
  //   'description': 'Description',
  // }
  // ```
  static const Map<String, Map<String, String>> translations = {
    'en': {
      'title': 'Flutter Demo',
      'description': 'A Flutter Demo',
      'greetings': 'Hello {name}!',
    },
    'id': {
      'title': 'Demo Flutter',
      'description': 'Sebuah Demo Flutter',
      'greetings': 'Halo {name}!',
    },
  };

  // 设置默认语言代码,当当前语言不受支持时(不在`translations`中)使用此语言代码
  //
  // 这个值是一个语言代码字符串,并且必须在`translations`的第一层keys中。
  static const String defaultLocale = 'en';
}

完整示例代码

下面是一个完整的示例代码,展示了如何使用 localizable_annotation 插件来实现国际化功能:

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

// 使用 [@Localizable](/user/Localizable) 注解定义翻译类
[@Localizable](/user/Localizable)(
  className: "AppLocalization",
)
class AppTranslations {
  // 设置本地化字符串的常量值
  static const Map<String, Map<String, String>> translations = {
    'en': {
      'title': 'Flutter Demo',
      'description': 'A Flutter Demo',
      'greetings': 'Hello {name}!',
    },
    'id': {
      'title': 'Demo Flutter',
      'description': 'Sebuah Demo Flutter',
      'greetings': 'Halo {name}!',
    },
  };

  // 设置默认语言代码,当当前语言不受支持时(不在`translations`中)使用此语言代码
  static const String defaultLocale = 'en';
}

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: AppTranslations.of(context).text('title'),
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(AppTranslations.of(context).text('title')),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text(
              AppTranslations.of(context).text('description'),
            ),
            TextButton(
              onPressed: () {
                // 显示一个带有参数的本地化字符串
                showAlertDialog(context);
              },
              child: Text(AppTranslations.of(context).text('greetings', args: {'name': 'John'})),
            ),
          ],
        ),
      ),
    );
  }

  void showAlertDialog(BuildContext context) {
    // 使用带有参数的本地化字符串
    final message = AppTranslations.of(context).text('greetings', args: {'name': 'Jane'});
    showDialog(
      context: context,
      builder: (BuildContext context) {
        return AlertDialog(
          title: Text('Greeting'),
          content: Text(message),
          actions: [
            TextButton(
              child: Text('OK'),
              onPressed: () {
                Navigator.of(context).pop();
              },
            ),
          ],
        );
      },
    );
  }
}

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

1 回复

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


当然,以下是一个关于如何使用 localizable_annotation 插件来实现 Flutter 应用国际化的代码示例。这个插件通过注解和代码生成工具,可以简化国际化的实现过程。

第一步:添加依赖

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

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

dev_dependencies:
  build_runner: ^x.y.z  # 请替换为最新版本号
  localizable_generator: ^x.y.z  # 请替换为最新版本号

第二步:创建资源文件

在项目的 lib/l10n 目录下创建语言资源文件,例如 messages_en.arbmessages_zh.arb

lib/l10n/messages_en.arb

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

lib/l10n/messages_zh.arb

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

第三步:生成本地化代码

在项目的根目录下运行以下命令来生成本地化代码:

flutter pub run build_runner build

这个命令会根据你的 .arb 文件生成相应的 Dart 文件。

第四步:使用注解和生成的代码

在你的 Flutter 应用中使用注解和生成的本地化类。

lib/main.dart

import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:your_app_name/generated/l10n.dart'; // 导入生成的本地化类

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      localizationsDelegates: [
        S.delegate, // 使用生成的本地化委托
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
      ],
      supportedLocales: S.delegate.supportedLocales, // 支持的本地化语言列表
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final S localizations = S.of(context); // 获取本地化实例
    return Scaffold(
      appBar: AppBar(
        title: Text(localizations.welcome), // 使用本地化字符串
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            ScaffoldMessenger.of(context).showSnackBar(
              SnackBar(content: Text(localizations.goodbye)), // 使用本地化字符串
            );
          },
          child: Text('Show Message'),
        ),
      ),
    );
  }
}

第五步:切换语言

如果你需要实现语言切换功能,可以创建一个简单的语言选择器。

lib/language_selector.dart

import 'package:flutter/material.dart';
import 'package:your_app_name/generated/l10n.dart'; // 导入生成的本地化类

class LanguageSelector extends StatefulWidget {
  @override
  _LanguageSelectorState createState() => _LanguageSelectorState();
}

class _LanguageSelectorState extends State<LanguageSelector> {
  Locale _currentLocale;

  @override
  void initState() {
    super.initState();
    _currentLocale = Localizations.localeOf(context);
  }

  void _changeLanguage(Locale newLocale) {
    setState(() {
      _currentLocale = newLocale;
    });
    // 更新应用的语言环境
    Localizations.overrideLocaleOf(context, newLocale);
  }

  @override
  Widget build(BuildContext context) {
    final S localizations = S.of(context);
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        ListTile(
          leading: Icon(Icons.language),
          title: Text(localizations.welcome),
          subtitle: Text(_currentLocale.toString()),
          onTap: () {
            showDialog(
              context: context,
              builder: (context) {
                return AlertDialog(
                  title: Text(localizations.welcome),
                  content: SingleChildScrollView(
                    child: ListBody(
                      children: <Widget>[
                        ListTile(
                          title: Text('English'),
                          onTap: () {
                            Navigator.of(context).pop();
                            _changeLanguage(Locale('en', ''));
                          },
                        ),
                        ListTile(
                          title: Text('中文'),
                          onTap: () {
                            Navigator.of(context).pop();
                            _changeLanguage(Locale('zh', ''));
                          },
                        ),
                      ],
                    ),
                  ),
                );
              },
            );
          },
        ),
      ],
    );
  }
}

在你的 MyHomePage 或其他合适的地方添加 LanguageSelector 组件即可。

总结

通过以上步骤,你已经成功地在 Flutter 应用中使用了 localizable_annotation 插件来实现国际化。这个插件极大地简化了 .arb 文件的管理和代码生成过程,使得国际化变得更加容易和高效。

回到顶部