如何使用intl包为Flutter应用添加印度区域语言支持?
使用intl包为Flutter应用添加印度区域语言支持的完整步骤
一、先理清ARB文件的命名规则
intl包对ARB文件的命名遵循**语言代码(可选加区域代码)**的规范,针对你需要的印度语言:
- 印地语:语言代码是
hi,通用印地语可命名为app_hi.arb;特指印度地区的印地语可命名为app_hi_IN.arb - 古吉拉特语:语言代码
gu,对应app_gu.arb或app_gu_IN.arb - 泰米尔语:语言代码
ta,对应app_ta.arb或app_ta_IN.arb
注:如果该语言没有明显区域差异,用
app_{语言代码}.arb即可;若需区分不同区域的变体,再加下划线分隔的区域代码(比如IN代表印度)。每个ARB文件内必须包含@@locale字段,值要和文件名的语言/区域代码一致,例如app_hi_IN.arb里的@@locale为hi_IN。
二、具体实现步骤
1. 配置依赖包
确保你的pubspec.yaml中包含以下依赖:
dependencies: flutter: sdk: flutter flutter_localizations: sdk: flutter intl: ^0.18.1 dev_dependencies: intl_generator: ^0.18.1 build_runner: ^2.4.4
执行flutter pub get安装依赖。
2. 创建ARB翻译文件
在项目根目录下新建lib/l10n文件夹,然后创建基准文件和各语言的翻译文件:
- 基准英文文件
app_en.arb:
{ "@@locale": "en", "helloWorld": "Hello World", "welcomeMessage": "Welcome to our app" }
- 印地语文件
app_hi.arb:
{ "@@locale": "hi", "helloWorld": "नमस्ते दुनिया", "welcomeMessage": "हमारे ऐप में आपका स्वागत है" }
- 古吉拉特语文件
app_gu.arb:
{ "@@locale": "gu", "helloWorld": "નમસ્તે દુનિયા", "welcomeMessage": "અમારા એપમાં આપનું સ્વાગત છે" }
- 泰米尔语文件
app_ta.arb:
{ "@@locale": "ta", "helloWorld": "வணக்கம் உலகம்", "welcomeMessage": "எங்கள் பயன்பாட்டிற்கு வரவேற்கிறோம்" }
3. 生成本地化代码
在终端运行以下命令,自动生成对应的本地化类和消息文件:
flutter pub run build_runner build
执行完成后,lib/generated目录下会生成messages_all.dart、messages_en.dart等自动代码文件,请勿手动修改这些文件。
4. 配置应用的本地化支持
修改main.dart,添加本地化委托和支持的语言列表:
import 'package:flutter/material.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:intl/intl.dart'; import 'generated/messages_all.dart'; class AppLocalizations { static Future<AppLocalizations> load(Locale locale) { final localeName = Intl.canonicalizedLocale( locale.countryCode == null ? locale.languageCode : locale.toString() ); return initializeMessages(localeName).then((_) { Intl.defaultLocale = localeName; return AppLocalizations(); }); } static AppLocalizations of(BuildContext context) { return Localizations.of<AppLocalizations>(context, AppLocalizations)!; } String get helloWorld => Intl.message( 'Hello World', name: 'helloWorld', desc: 'Basic greeting', ); String get welcomeMessage => Intl.message( 'Welcome to our app', name: 'welcomeMessage', desc: 'App welcome text', ); } class AppLocalizationsDelegate extends LocalizationsDelegate<AppLocalizations> { const AppLocalizationsDelegate(); @override bool isSupported(Locale locale) => ['en', 'hi', 'gu', 'ta'].contains(locale.languageCode); @override Future<AppLocalizations> load(Locale locale) => AppLocalizations.load(locale); @override bool shouldReload(AppLocalizationsDelegate old) => false; } void main() => runApp(const MyApp()); class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( title: 'Localization Demo', localizationsDelegates: const [ AppLocalizationsDelegate(), GlobalMaterialLocalizations.delegate, GlobalWidgetsLocalizations.delegate, GlobalCupertinoLocalizations.delegate, ], supportedLocales: const [ Locale('en'), Locale('hi'), Locale('gu'), Locale('ta'), ], home: const HomePage(), ); } } class HomePage extends StatelessWidget { const HomePage({super.key}); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text(AppLocalizations.of(context).helloWorld)), body: Center(child: Text(AppLocalizations.of(context).welcomeMessage)), ); } }
5. 测试本地化效果
可以通过两种方式测试:
- 切换设备的系统语言到目标语言,重启应用即可看到对应翻译
- 在
MaterialApp中手动指定locale参数,比如locale: const Locale('hi'),运行后直接查看印地语界面
三、常见注意事项
- 所有ARB文件中的键名(如
helloWorld)必须完全一致,否则生成代码时会报错 - 每次修改ARB文件后,都需要重新运行
flutter pub run build_runner build更新生成的代码 - 如果需要支持带区域代码的语言变体,比如
hi_IN,只需在supportedLocales中添加const Locale('hi', 'IN'),并创建对应的app_hi_IN.arb文件即可
内容的提问来源于stack exchange,提问作者ankushlokhande
相关产品推荐
相关产品推荐

