- 首先需要安装Flutter i18n插件,AS中安装即可(目前此插件已经下线,可考虑使用Flutter_intl)
2.创建Flutter工程,在res->values下会自动创建一个string_en.arb的文件,这就是多语言的资源文件。可以右键新建arb文件,根据向导即可添加不同语言。
arb文件内容就是json格式。来个简单的例子:
{
"app_title": "app_title1",
"main_title": "My Main Title"
}
3.在lib->generated目录中会自动根据arb文件生成一个i18n.dart文件,不用编辑该文件,其实你编辑了也没用,修改后马上又会自动生成。
编辑arb文件后会马上重新生成i18n.dart文件。
4.添加依赖库
dependencies:
flutter:
sdk: flutter
flutter_localizations:
sdk: flutter
5.在main.dart中导入
import '../generated/i18n.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
-
在main.dart文件添加相应内容
@override
Widget build(BuildContext context) {
return MaterialApp(localizationsDelegates: [
S.delegate,
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate
],
supportedLocales: S.delegate.supportedLocales,
如果需要强制使用某种语言可以添加如下代码
//localeResolutionCallback:
//S.delegate.resolution(fallback: Locale(“zh”, “”)),
title: ‘Flutter Demo’,
theme: ThemeData(
7.如何使用:S.of(context).key即可
Text(
S.of(context).app_title,
style: TextStyle(
color: Colors.blue,
fontSize: 30,
),
)
遇到的问题
升级AS3.3后,i18n的插件似乎不起作用了。无法自动生成i18n.dart文件。报错内容如下:
kotlin.KotlinNullPointerException
at eu.long1.flutter.i18n.files.FileHelpers.getI18nFile(FileHelpers.kt:20)
at eu.long1.flutter.i18n.workers.I18nFileGenerator.generate(I18nFileGenerator.kt:54)
at eu.long1.flutter.i18n.actions.RebuildI18nFile$actionPerformed$1.run(RebuildI18nFile.kt:13)
at com.intellij.openapi.command.WriteCommandAction.lambda$runWriteCommandAction$5(WriteCommandAction.java:363)
at com.intellij.openapi.command.WriteCommandAction$BuilderImpl$1.run(WriteCommandAction.java:124)
at com.intellij.openapi.application.RunResult.run(RunResult.java:35)
at com.intellij.openapi.command.WriteCommandAction.lambda$null$1(WriteCommandAction.java:264)
at com.intellij.openapi.application.impl.ApplicationImpl.runWriteAction(ApplicationImpl.java:1057)
at com.intellij.openapi.command.WriteCommandAction.lambda$performWriteCommandAction$2(WriteCommandAction.java:263)
at com.intellij.openapi.command.WriteCommandAction.lambda$doExecuteCommand$4(WriteCommandAction.java:321)
at com.intellij.openapi.command.impl.CoreCommandProcessor.executeCommand(CoreCommandProcessor.java:220)
at com.intellij.openapi.command.impl.CoreCommandProcessor.executeCommand(CoreCommandProcessor.java:188)
at com.intellij.openapi.command.WriteCommandAction.doExecuteCommand(WriteCommandAction.java:323)
at com.intellij.openapi.command.WriteCommandAction.performWriteCommandAction(WriteCommandAction.java:262)
at com.intellij.openapi.command.WriteCommandAction.execute(WriteCommandAction.java:244)
at com.intellij.openapi.command.WriteCommandAction$BuilderImpl.run(WriteCommandAction.java:126)
at com.intellij.openapi.command.WriteCommandAction.runWriteCommandAction(WriteCommandAction.java:363)
at com.intellij.openapi.command.WriteCommandAction.runWriteCommandAction(WriteCommandAction.java:355)
at eu.long1.flutter.i18n.actions.RebuildI18nFile.actionPerformed(RebuildI18nFile.kt:13)
at com.intellij.openapi.actionSystem.ex.ActionUtil$1.run(ActionUtil.java:258)
at com.intellij.openapi.actionSystem.ex.ActionUtil.performActionDumbAware(ActionUtil.java:275)
at com.intellij.openapi.actionSystem.impl.ActionButton.actionPerformed(ActionButton.java:184)
at com.intellij.openapi.actionSystem.impl.ActionButton.performAction(ActionButton.java:148)
at com.intellij.openapi.actionSystem.impl.ActionButton.processMouseEvent(ActionButton.java:410)
at java.awt.Component.processEvent(Component.java:6313)
at java.awt.Container.processEvent(Container.java:2237)
at java.awt.Component.dispatchEventImpl(Component.java:4903)
at java.awt.Container.dispatchEventImpl(Container.java:2295)
at java.awt.Component.dispatchEvent(Component.java:4725)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4889)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4526)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4467)
at java.awt.Container.dispatchEventImpl(Container.java:2281)
at java.awt.Window.dispatchEventImpl(Window.java:2746)
at java.awt.Component.dispatchEvent(Component.java:4725)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:764)
at java.awt.EventQueue.access$500(EventQueue.java:98)
at java.awt.EventQueue$3.run(EventQueue.java:715)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:90)
at java.awt.EventQueue$4.run(EventQueue.java:737)
at java.awt.EventQueue$4.run(EventQueue.java:735)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:734)
at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:719)
at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:664)
at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:363)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
一开始就觉得是工程某些配置文件的事情。于是把之前可以正常使用的Project打开了,果然可以正常生成。看来不是插件的问题。应该是某些工程文件配置问题。于是对两个工程进行了对比。发现新建的工程的.idea目录下没有misc.xml文件。
将原来工程中的misc.xml拷贝到新工程,build,OK
又能愉快的生成i18n.dart文件了。
看来有可能是AS3.3对工程目录进行了优化(也可能是bug),造成i18n的插件无法进行文件的生成。所以报错了。
注意,拷贝完misc.xml后需要重新启动AS才能生效。