dependencies:
flutter:
sdk: flutter
flutter_localizations: # Add this line
sdk: flutter # Add this line
intl: ^0.17.0 # Add this line
get_it: ^7.2.0 # Add this line
flutter:
uses-material-design: true
generate: true # Add this line
flutter_intl: # Add this line
enabled: true # Add this line
class_name: I10n # Add this line
main_locale: en # Add this line
arb_dir: lib/core/localization/l10n # Add this line
output_dir: lib/core/localization/generated # Add this line
import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
AppLocalizations get tr => _tr!; // helper function to avoid typing '!' all the time
AppLocalizations? _tr; // global variable
class AppTranslations {
static init(BuildContext context) {
_tr = AppLocalizations.of(context);
}
}
9条答案
按热度按时间31moq8wy1#
如果你不想使用软件包,那么这里有一个解决方案,它对我很有效。现在,我所见过的大多数
AppLocalizations
的common implementation通常都有这两行代码:委派的实作如下所示:
请注意,委托上的load方法返回一个
Future<AppLocalizations>
。load方法通常从main调用一次,以后就不会再调用了,因此您可以通过向委托添加一个AppLocalizations
的静态示例来利用这一点。因此,现在您的委托看起来如下所示:那么,在
AppLocalizations
类上,您现在将拥有:现在,在您的translate helper方法中,您可以:
无需上下文。
o2g1uqev2#
我们可以通过使用get_it轻松地解决这个问题,在此设置之后,我们可以在任何地方使用该字符串。
1.将此安装到vscode Flutter Intl VSCode Extension
1.设置
pubspec.yaml
1.设置
main.dart
1.设置
locator.dart
1.将它与Get_it一起使用,而不使用上下文
efzxgjgh3#
有一个名为easy_localization的库可以在没有上下文的情况下进行本地化,你可以简单地使用它。库还提供了更方便的方法,可以编写更少的代码,同时仍然可以本地化应用程序的所有部分。一个示例主类:
也别忘了把本地化路径放到你的
pubspec.yamal
文件中!完成所有这些操作后,您只需在
Text
小部件中使用它,如下所示:acruukt94#
如果您知道所需的
Locale
,则可以用途:除了硬编码
Locale('en')
,您还可以实现某种解析器来找出所需的区域设置。支持的语言是AppLocalizations.supportedLocales
。vjrehmav5#
**最新版本:**当前的Flutter Intl插件使这种方法过时了,至少如果您使用支持的IDE的话。
**Previous:**从Stuck,的建议开始,这是我找到的最后一个解决方案。它没有简单的上下文查找那么便宜,所以只有在真正必要的时候才使用它,并确保你只调用它一次,并尽可能多次地使用它。但即使你根本没有上下文,这种方法也能工作,例如,你在后台服务或任何其他没有UI的程序部分。
它的使用方法与平常一样:
更新:我在评论中建议的单例可能看起来像这样:
和用法如下:
要跟踪语言更改,请从主
build()
调用此函数:v7pvogib6#
在我的例子中,我使用的是Minimal国际化版本。
将chinalloy的答案改编为Minimal internationalization version。
应用chinalloy的解决方案,但有以下区别:
从这里:
对此:
bvjveswy7#
我的2分钱投入其中,只是不要松散的解决方案:)
我完全理解Flutter本地化解决方案为什么需要BuildContext --这完全有道理。但是,如果我明确地不需要运行时语言切换,并且对应用程序重新启动感到满意呢?
这就是我想出的解决办法,似乎效果很好。
假设您已经遵循了Flutter的official localization steps,创建一个用于访问
AppLocalizations
类的全局变量。i18n.dart:
现在,在主 Package 器(
MaterialApp
下面的 Package 器)的某个地方调用为当前选择的语言环境设置本地化:它可以是主小部件的
initState()
,甚至build()
(显然,多次调用它是安全的)。现在您只需调用:
kmpatx3s8#
我已经在使用easy_localization包,所以这对我来说很容易。
我用来获取无上下文应用语言的技巧如下
像在实用程序/扩展功能中使用一样
68de4m5k9#
最好的方法是使用Flutter Intl(Flutter i18n插件),因为它是由Flutter开发者构建的。它有一个方法可以在没有上下文的情况下使用,如下所示(来自Visual Studio Marketplace details page的代码示例):
有关official plugin page和Visual Studio Marketplace details page的更多详细信息