Flutter国际化插件nat_l10n的使用

Flutter国际化插件nat_l10n的使用

标题

Native Localization (nat_l10n)

内容

This plugin helps to make use of localization utilities provided by the native platforms.

平台支持如下:

  • Android: ✔️
  • iOS: ✔️
  • MacOS: ➖️
  • Web: ➖️
  • Linux: ➖️
  • Windows: ➖️

特性

  • 收受本地化
    • 时间区条目
    • 语言条目
    • 货币条目

使用方法

一般
// 导入包
import 'package:nat_l10n/nat_l10n.dart';

// 创建实例
final NatL10n natL10n = NatL10n();
本地化时间区
// 需要:目标语言,时间区ID列表(List),可选:格式风格
List<TimeZoneInfo> localizedTimeZones = await natL10n.localizedTimeZones(
      Locale('en', 'US'), ['America/Denver', 'Europe/Berlin'], style: TimeZoneStyle.long);
});

// 返回:
// 1. {id: America/Denver, translation: Mountain Standard Time, offset: -22500}
// 2. {id: Europe/Berlin, translation: Central European Standard Time, offset: 3600}
本地化语言
// 需要:目标语言,需要本地化的语言列表(List)
List<LocaleInfo> localizedLocales = await natL10n.localizedLocales(
      Locale('en', 'US'), [Locale('de', 'DE'), Locale('ko', 'KR')]);
});

// 返回:
// 1. {localeTag: de-DE, translatedLocale: 德语 (德国), translatedLanguage: 德语, translatedRegion: 德国}
// 2. {localeTag: ko-KR, translatedLocale: 韩语 (韩国), translatedLanguage: 韩语, translatedRegion: 韩国}
按照各自语言本地化语言
// 需要:需要本地化的语言列表(List)分别对应每个目标语言
List<LocaleInfo> localizedLocales = await natL10n.respectivelyLocalizedLocales(
      [Locale('de', 'de'), Locale('ko', 'KR')]);
});
// 返回:
// 1. {localeTag: de-de, translatedLocale: 德语 (德国), translatedLanguage: 德语, translatedRegion: 德国}
// 2. {localeTag: ko-KR, translatedLocale: 韩语 (韩国), translatedLanguage: 韩语, translatedRegion: 韩国}
本地化货币
// 需要:目标语言,需要本地化的货币代码列表
List<CurrencyInfo> localizedCurrencies = await natL10n.localizedCurrencies(
    Locale('en', 'US'), ['USD', 'EUR']);
});
// 返回:
// 1. {currencyCode: USD, translated: 美元, symbol: $}
// 2. {currencyCode: EUR, translated: 欧元, symbol: €}

补充信息

1. 帮助工具

示例应用包括以下列表:

  • 时间区ID(例如:‘America/Denver’)
  • 语言(例如:'Locale(‘en’, ‘US)’)
  • ISO 4217 货币代码(例如:‘USD’)
a) Android/Kotlin

所有支持的标识符、语言和货币代码

fun main() {
    printTimeZonesIds()
    printLocales()
    printCurrencies()
}

private fun printTimeZonesIds() {
    val time Zones = TimeZone.getAvailableIDs()
    time Zones.forEach {
        println("$it")
    }
}

private fun printLocales() {
    val locales = Locale.getAvailableLocales()
    locales.forEach {
        println("$it")
    }
}

private fun printCurrencies() {
    val currencies = Currency.getAvailableCurrencies()
    currencies.forEach {
        println("$it")
    }
}
b) iOS/Swift

所有支持的标识符、语言和货币代码

import Foundation

printTimeZonesIds()
printLocales()
printCurrencies()

private func printTimeZonesIds() {
    let time Zones = TimeZone.knownTimeZoneIdentifiers
    time Zones.forEach {
        print("\($0 as String?)")
    }
}

private func printLocales() {
    let locales = Locale.availableIdentifiers
    locales.forEach {
        print("\($0 as String?)")
    }
}

private func printCurrencies() {
    let currencies = Locale.isoCurrencyCodes
    // let currencies = Locale.commonISOCurrencyCodes
    currencies.forEach {
        print("\($0 as String?)")
    }
}
2) 关于时间区ID

支持的时间区ID取决于底层平台。推荐使用“Area/Location”名称格式。

3) 关于语言
4) 关于货币
5) 关于本地化结果

结果可能因不同平台而异。不保证结果是正确的。

示例代码

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

import 'src/constants.dart';
import 'widgets/currencies_view.dart';
import 'widgets/locales_view.dart';
import 'widgets/time_zones_view.dart';

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Native Localization (Nat_l10n) Demo',
      theme: ThemeData(primarySwatch: Colors.blue, brightness: Brightness.dark),
      home: const MyHomePage(),
    );
  }
}

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

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

class _MyHomePageState extends State<MyHomePage>
    with SingleTickerProviderStateMixin {
  final NatL10n _natL10n = NatL10n();
  String _header = '';
  int _pageIndex = 0;
  late PageController _pageController;
  late TabController _tabController;

  [@override](/user/override)
  void initState() {
    super.initState();
    _pageController = PageController();
    _tabController = TabController(length: 3, vsync: this);
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: backgroundColor,
      appBar: AppBar(
        backgroundColor: foregroundColor,
        title: Text(_header),
        bottom: TabBar(
          controller: _tabController,
          onTap: (value) {
            _pageIndex = value;
            _pageController.animateToPage(_pageIndex,
                duration: animationDuration, curve: Curves.easeInOut);
          },
          indicatorColor: indicatorColor,
          tabs: const [
            Tab(text: 'TimeZones'),
            Tab(text: 'Localess'),
            Tab(text: 'Currencies'),
          ],
        ),
      ),
      body: PageView(
        controller: _pageController,
        scrollDirection: Axis.horizontal,
        onPageChanged: (value) {
          _pageIndex = value;
          _tabController.animateTo(_pageIndex,
              duration: animationDuration, curve: Curves.easeInOut);
        },
        children: [
          TimeZonessView(_natL10n, _updateHeader),
          LocalesView(_natL10n, _updateHeader),
          CurrenciesView(_natL10n, _updateHeader),
        ],
      ),
    );
  }

  void _updateHeader(String text) {
    setState(() {
      _header = text;
    });
  }
}

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

1 回复

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


当然,下面是一个关于如何在Flutter项目中使用flutter_localizationsintl包来实现国际化的代码案例,特别是关于nat_l10n(虽然nat_l10n实际上是一个自动生成国际化文件的工具,这里我们将展示其生成和使用过程)。

步骤 1: 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  flutter_localizations:
    sdk: flutter

dev_dependencies:
  build_runner: ^2.1.4
  intl: ^0.17.0

步骤 2: 创建国际化文件

在项目的根目录下,运行以下命令来生成国际化文件模板:

flutter pub run intl_translation:extract_to_arb --output-dir=lib/l10n lib/main.dart

这将在lib/l10n目录下生成一个ARB(Application Resource Bundle)文件,例如messages_en.arb,你可以根据需要编辑这个文件来添加翻译内容。

例如,messages_en.arb可能看起来像这样:

{
  "welcomeMessage": "Welcome",
  "goodbyeMessage": "Goodbye"
}

然后,为其他语言创建相应的ARB文件,例如messages_fr.arb

{
  "welcomeMessage": "Bienvenue",
  "goodbyeMessage": "Au revoir"
}

步骤 3: 生成Dart本地化文件

使用build_runner生成Dart本地化文件:

flutter pub run build_runner build

这将在lib/l10n/generated目录下生成如messages_all.dart等文件。

步骤 4: 设置MaterialApp的本地化支持

在你的main.dart文件中,设置MaterialApplocalizationsDelegatessupportedLocales

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      localizationsDelegates: [
        // 添加生成的本地化委托
        S.delegate,
        // 全局本地化委托
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
        GlobalCupertinoLocalizations.delegate,
      ],
      supportedLocales: S.delegate.supportedLocales,
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // 使用S类访问本地化字符串
    final S _localizations = S.of(context);

    return Scaffold(
      appBar: AppBar(
        title: Text(_localizations.welcomeMessage),
      ),
      body: Center(
        child: TextButton(
          onPressed: () {
            // 假设这里有一个逻辑来更改语言或显示告别信息
            ScaffoldMessenger.of(context).showSnackBar(
              SnackBar(content: Text(_localizations.goodbyeMessage)),
            );
          },
          child: Text('Show Goodbye'),
        ),
      ),
    );
  }
}

步骤 5: 运行应用并测试

现在,你可以运行你的Flutter应用,并根据需要更改设备的语言设置来测试国际化功能。

这个示例展示了如何使用flutter_localizationsintl包,以及nat_l10n的工作流程(通过intl_translation工具生成ARB文件,然后使用build_runner生成Dart代码)来实现Flutter应用的国际化。希望这对你有所帮助!

回到顶部