我尝试使用本地化包在Flutter中将字符串本地化。问题是需要翻译的位置。它与UI无关,而是在模型的深处,我无法访问BuildContext。还有其他可能性可以继续使用翻译功能吗?
// I don't have a context variable here
MyLocalizations.of(context).trans("foo")
答案 0 :(得分:4)
是的。您不需要BuildContext来访问字符串。这是我的解决方案:
class Strings {
Strings._(Locale locale) : _localeName = locale.toString() {
current = this;
}
final String _localeName;
static Strings current;
static Future<Strings> load(Locale locale) async {
await initializeMessages(locale.toString());
final result = Strings._(locale);
return result;
}
static Strings of(BuildContext context) {
return Localizations.of<Strings>(context, Strings);
}
String get title {
return Intl.message(
'Hello World',
name: 'title',
desc: 'Title for the Demo application',
);
}
}
Future<Null> main() async {
final Locale myLocale = Locale(window.locale);
await Strings.load(myLocale);
runApp(MyApplication());
}
现在,您可以按以下方式引用字符串:
final title = Strings.current.title;
答案 1 :(得分:3)
我知道这个问题可以追溯到很早以前。但是在实现我的应用程序时遇到了这个问题,而且我看不到任何“不错”的方式来处理它。 所以这是我的方法
class LanguageService {
static String defaultLanguage = 'en';
static Map<String, Map<String, String>> _localizedValues = {
'en': {
'title': 'Storefront',
'language': 'Language',
'googleLogin': 'Login with Google'
},
'vn': {
'title': 'Cửa hàng',
'language': 'Ngôn ngữ',
'googleLogin': 'Đăng Nhập với Google'
}
};
static set language(String lang) {
defaultLanguage = lang;
}
static String get title {
return _localizedValues[defaultLanguage]['title'];
}
static String get language {
return _localizedValues[defaultLanguage]['language'];
}
static String get googleLogin {
return _localizedValues[defaultLanguage]['googleLogin'];
}
}
现在,您可以按以下方式引用字符串:
String title = LanguageService.title;
您可以找到详细的教程here
答案 2 :(得分:2)
否,没有其他方法,因为它是使用InheritedWidget
存储的,{{3}}是构建树的一部分,因此只能通过引用(BuildContext
)来访问。
您将需要将context
传递到模型中的某个位置。
答案 3 :(得分:0)
我不确定我是否做对了(从性能的角度来看),也许有人可以对此发表评论,但是一旦加载了新的语言环境,我的AppLocalization和fire事件中就会出现rx BehaviorSubject。我正在main.dart中收听它,并在收到事件时执行setState。 我检查了性能选项卡,但是在比较我的方法与通过上下文(继承的小部件)访问翻译后,并没有注意到其中的任何大变化。