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”名称格式。
- Android文档:[Documentation Android]((https://developer.android.com/reference/java/util/TimeZone)
- Apple文档:[Documentation Apple]((https://developer.apple.com/documentation/foundation/timezone)
3) 关于语言
- Android文档:[Documentation Android]((https://developer.android.com/reference/java/util/Locale)
- Apple文档:[Documentation Apple]((https://developer.apple.com/documentation/foundation/locale)
4) 关于货币
- Android文档:[Documentation Android]((https://developer.android.com/reference/java/util/Currency)
- Apple文档:[Documentation Apple]((https://developer.apple.com/documentation/foundation/locale)
- iOS没有特定的“Currency”类。货币信息需要通过Locale类获取。
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
更多关于Flutter国际化插件nat_l10n的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个关于如何在Flutter项目中使用flutter_localizations
和intl
包来实现国际化的代码案例,特别是关于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
文件中,设置MaterialApp
的localizationsDelegates
和supportedLocales
:
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_localizations
和intl
包,以及nat_l10n
的工作流程(通过intl_translation
工具生成ARB文件,然后使用build_runner
生成Dart代码)来实现Flutter应用的国际化。希望这对你有所帮助!