Flutter应用本地化插件applocale的使用

Flutter应用本地化插件applocale的使用

applocale 是一个用于支持国际化(i18n)或不同语言的Flutter插件。通过JSON文件,它可以实现多语言支持。

使用

项目结构

项目结构应该包含一个存放语言文件的目录。例如:

my_flutter_project/
├── lib/
│   └── main.dart
└── i18n/
    ├── en.json
    └── bn.json

i18n 目录下,有两个JSON文件:en.jsonbn.json。它们分别包含了英语和孟加拉语的翻译。

lang.json 内容

en.json 文件内容如下:

{
  "title": "Awesome!",
  "hello": "Hello",
  "message": "This is English!!!",
  "subDetail": {
    "greeting": "{hello} {name}!!!",
    "runtimeText": "I have proof, you can replace {replacement}"
  }
}

bn.json 文件内容如下:

{
  "title": "অভূতপূর্ব!",
  "hello": "নমস্কার",
  "message": "ইহা বাংলা!!!",
  "subDetail": {
    "runtimeText": "আমি জানি যে {replacement}কে যে কোনও দিন চলে যেতে হবে।"
  }
}
添加语言目录作为资源

pubspec.yaml 文件中添加语言目录作为资源:

# pubspec.yaml
# 添加依赖
dependencies:
  applocale: <latest-version>

flutter:
  # 添加整个包含语言JSON文件的目录作为资源
  assets:
    - i18n/
现在的代码

下面是完整的示例代码:

import 'package:flutter/material.dart';

import 'package:applocale/applocale.dart';
import 'package:flutter_localizations/flutter_localizations.dart';

// 定义支持的语言列表
Map<String, String> get _supportedLanguages => {
      "en": "English",
      "en_us": "English(USA)",
      "bn": "Bengali",
    };
String get _defaultLanguage => "en";
List<String> get _getSupportedLanguages =>
    _supportedLanguages.entries.map((l) => l.key).toList();

void main(List<String> args) => runApp(FlutterDemoApp());

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

class _FlutterDemoApp extends State<FlutterDemoApp> {
  // 初始化 _localeDelegate
  LocaleDelegate _localeDelegate = LocaleDelegate.init(
    _getSupportedLanguages,
    // * 可选参数,如果与支持语言列表中的第一个相同
    defaultLanguage: _defaultLanguage,
  );

  [@override](/user/override)
  void initState() {
    super.initState();
  }

  [@override](/user/override)
  Widget build(BuildContext context) => MaterialApp(
        supportedLocales: _localeDelegate.supportedLocales, // 步骤 I
        localizationsDelegates: [
          _localeDelegate, // 步骤 II
          GlobalMaterialLocalizations.delegate,
          GlobalWidgetsLocalizations.delegate
        ],
        title: 'Flutter Demo',
        home: FlutterDemo(),
      );
}

class FlutterDemo extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    // 由于 LocaleDelegate 已经初始化并准备好
    var appLocale = AppLocale.of(context); // 步骤 III
    // 在某些情况下可以设置一些额外的值。这是一次性的活动
    appLocale.updateValue({'name': 'জয়ন্তী'});

    return Scaffold(
      appBar: AppBar(
        title: Text(appLocale.localValue('title')),
      ),
      body: ListView(
        children: <Widget>[
          Center(
            child: Text(appLocale.localValue('subDetail.greeting')),
          ),
          Center(
            child: Text(appLocale.localValue(
              'subDetail.runtimeText',
              {'replacement': 'Individual'}, // 运行时插值
            )),
          ),
          Center(
            child: Text(appLocale.localValue('message')),
          ),
        ],
      ),
    );
  }
}

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

1 回复

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


当然,下面是一个关于如何在Flutter应用中使用applocale插件来实现本地化的代码示例。applocale插件允许你根据用户的设备语言设置动态地更改应用的语言。

首先,确保你已经在你的pubspec.yaml文件中添加了applocale依赖:

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

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

接下来,你可以按照以下步骤在你的Flutter应用中使用applocale插件:

  1. 创建本地化资源文件

    在你的lib目录下创建一个l10n文件夹,并在其中创建不同的语言文件夹(例如en, zh),然后在每个文件夹中创建一个messages.arb文件来存储本地化字符串。

    lib/
    └── l10n/
        ├── en/
        │   └── messages.arb
        └── zh/
            └── messages.arb
    

    en/messages.arb示例:

    "welcomeMessage": "Welcome!"
    

    zh/messages.arb示例:

    "welcomeMessage": "欢迎!"
    
  2. 设置Flutter国际化

    在你的lib目录下创建一个generated文件夹(如果尚未存在),然后运行以下命令来生成国际化文件:

    flutter pub run flutter_gen:generate --localizations
    

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

  3. 在你的应用中使用applocale插件

    在你的main.dart文件中,你可以这样设置和使用applocale

    import 'package:flutter/material.dart';
    import 'package:flutter_gen/gen_l10n/l10n.dart';
    import 'package:applocale/applocale.dart';
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          localizationsDelegates: [
            AppLocalizations.delegate,
            GlobalMaterialLocalizations.delegate,
            GlobalWidgetsLocalizations.delegate,
            GlobalCupertinoLocalizations.delegate,
          ],
          supportedLocales: AppLocalizations.supportedLocales,
          locale: Locale('en'), // 初始语言设置,这里设置为英语
          title: 'Flutter App Locale Demo',
          theme: ThemeData(
            primarySwatch: Colors.blue,
          ),
          home: MyHomePage(),
        );
      }
    }
    
    class MyHomePage extends StatefulWidget {
      @override
      _MyHomePageState createState() => _MyHomePageState();
    }
    
    class _MyHomePageState extends State<MyHomePage> {
      late Locale currentLocale;
    
      @override
      void initState() {
        super.initState();
        currentLocale = Localizations.localeOf(context);
        // 监听系统语言变化
        AppLocale.addListener(() {
          setState(() {
            currentLocale = Localizations.localeOf(context);
          });
        });
      }
    
      @override
      Widget build(BuildContext context) {
        final appLocale = Localizations.localeOf(context).languageCode;
        return Scaffold(
          appBar: AppBar(
            title: Text(AppLocalizations.of(context)!.welcomeMessage),
          ),
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                Text(
                  'Current Locale: $appLocale',
                  style: TextStyle(fontSize: 20),
                ),
                ElevatedButton(
                  onPressed: () async {
                    final newLocale = await showCupertinoModalPopup<Locale>(
                      context: context,
                      builder: (context) {
                        return CupertinoActionSheet(
                          title: Text('Change Language'),
                          actions: [
                            CupertinoActionSheetAction(
                              child: Text('English'),
                              isDefaultAction: true,
                              onPressed: () {
                                Navigator.of(context).pop(Locale('en'));
                              },
                            ),
                            CupertinoActionSheetAction(
                              child: Text('中文'),
                              onPressed: () {
                                Navigator.of(context).pop(Locale('zh'));
                              },
                            ),
                          ],
                          cancelButton: CupertinoActionSheetAction(
                            child: Text('Cancel'),
                            isDestructiveAction: true,
                            onPressed: () {
                              Navigator.of(context).pop(null);
                            },
                          ),
                        );
                      },
                    );
                    if (newLocale != null) {
                      AppLocale.setLocale(newLocale);
                    }
                  },
                  child: Text('Change Language'),
                ),
              ],
            ),
          ),
        );
      }
    }
    

在这个示例中,我们创建了一个简单的Flutter应用,它展示了如何使用applocale插件来监听和更改应用的语言设置。当用户点击按钮时,会弹出一个动作表让用户选择语言,选择后应用的语言会动态更改。

注意:applocale插件的具体用法可能会随着版本的更新而变化,请参考插件的官方文档和示例代码以确保最佳实践。

回到顶部