Flutter 支持国际化(i18n),允许开发者为应用程序添加多种语言和区域设置。Flutter 本身并没有限制支持的语言种类,理论上你可以为应用程序添加任何语言的支持,只要你提供相应的翻译资源。
Flutter 使用 intl
包来实现国际化。以下是实现国际化的基本步骤:
intl
包: 在 pubspec.yaml
文件中添加 intl
包的依赖:
dependencies: flutter: sdk: flutter intl: ^0.17.0
2. 创建翻译文件:
创建一个 lib/l10n
目录,并在其中添加 .arb
文件(例如 intl_en.arb
、intl_es.arb
等),每个文件对应一种语言。.arb
文件是 JSON 格式的文件,用于存储翻译字符串。
例如,intl_en.arb
文件内容:
{
"title": "Hello World",
"message": "Welcome to Flutter"
}
intl_es.arb
文件内容:
{ "title": "Hola Mundo", "message": "Bienvenido a Flutter" }
3.生成 Dart 代码
使用 intl_translation
工具将 .arb
文件转换为 Dart 代码。你可以在项目根目录运行以下命令:
flutter pub run intl_translation:generate_from_arb --output-dir=lib/l10n lib/main.dart lib/l10n/intl_*.arb
4. 配置 MaterialApp
在 MaterialApp
中配置支持的语言和本地化委托:
import 'package:flutter/material.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart'; import 'l10n/messages_all.dart'; // 生成的 Dart 文件 void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( localizationsDelegates: [ GlobalMaterialLocalizations.delegate, GlobalWidgetsLocalizations.delegate, GlobalCupertinoLocalizations.delegate, // 添加自定义的本地化委托 AppLocalizations.delegate, ], supportedLocales: [ const Locale('en', ''), // English const Locale('es', ''), // Spanish // 添加更多的语言支持 ], home: MyHomePage(), ); } } class MyHomePage extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text(AppLocalizations.of(context).title), ), body: Center( child: Text(AppLocalizations.of(context).message), ), ); } }
5. 创建 AppLocalizations
类
创建一个 AppLocalizations
类来加载翻译字符串:
import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'l10n/messages_all.dart'; // 生成的 Dart 文件 class AppLocalizations { static Future<AppLocalizations> load(Locale locale) { final String name = locale.countryCode.isEmpty ? locale.languageCode : locale.toString(); final String localeName = Intl.canonicalizedLocale(name); return initializeMessages(localeName).then((_) { Intl.defaultLocale = localeName; return AppLocalizations(); }); } static AppLocalizations of(BuildContext context) { return Localizations.of<AppLocalizations>(context, AppLocalizations); } String get title { return Intl.message( 'Hello World', name: 'title', desc: 'Title for the application', ); } String get message { return Intl.message( 'Welcome to Flutter', name: 'message', desc: 'Welcome message for the application', ); } } class AppLocalizationsDelegate extends LocalizationsDelegate<AppLocalizations> { const AppLocalizationsDelegate(); @override bool isSupported(Locale locale) { return ['en', 'es'].contains(locale.languageCode); } @override Future<AppLocalizations> load(Locale locale) { return AppLocalizations.load(locale); } @override bool shouldReload(AppLocalizationsDelegate old) => false; }
如前所述,Flutter 本身并没有限制支持的语言种类。你可以为应用程序添加任何语言的支持,只要你提供相应的翻译资源。常见的语言包括但不限于:
领取专属 10元无门槛券
手把手带您无忧上云