我希望将所有常量字符串(例如标签等)放入可以在以后翻译的地方。
Flutter是如何处理这个问题的?
我希望将所有常量字符串(例如标签等)放入可以在以后翻译的地方。
Flutter是如何处理这个问题的?
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter/foundation.dart' show SynchronousFuture;
class DemoLocalizations {
DemoLocalizations(this.locale);
final Locale locale;
static DemoLocalizations of(BuildContext context) {
return Localizations.of<DemoLocalizations>(context, DemoLocalizations);
}
static Map<String, Map<String, String>> _localizedValues = {
'en': {
'title': 'App title',
'googleLogin': 'Login with Google'
},
'es': {
'title': 'Título de App',
'googleLogin': 'Conectar con Google'
},
};
String get title {
return _localizedValues[locale.languageCode]['title'];
}
String get googleLogin {
return _localizedValues[locale.languageCode]['googleLogin'];
}
}
class DemoLocalizationsDelegate extends LocalizationsDelegate<DemoLocalizations> {
const DemoLocalizationsDelegate();
@override
bool isSupported(Locale locale) => ['en', 'es'].contains(locale.languageCode);
@override
Future<DemoLocalizations> load(Locale locale) {
// Returning a SynchronousFuture here because an async "load" operation
// isn't needed to produce an instance of DemoLocalizations.
return new SynchronousFuture<DemoLocalizations>(new DemoLocalizations(locale));
}
@override
bool shouldReload(DemoLocalizationsDelegate old) => false;
}
将Localizations.dart导入到您使用字符串的文件中。
在MaterialApp
中添加委托DemoLocalizationsDelegate
。
MaterialApp(
localizationsDelegates: [
MyLocalizationsDelegate(),
],
...
)
new Text(DemoLocalizations.of(context).title),
替换new Text("App Title"),
如果您想本地化每个新字符串,您需要将翻译后的文本添加到每种语言的映射中,然后添加String get...行。这有点麻烦,但它确实做到了您需要的。
这是一种实现方式的快速概述。您可以在Flutter文档中阅读更多信息:https://flutter.io/tutorials/internationalization/
我在 gitter 上提问,得到了以下回复:
翻译/国际化还不是我们认为“完成”的特性。 https://pub.dartlang.org/packages/intl 在 Flutter 中运作良好。我们有一个跟踪这个更广泛问题的 bug:flutter/flutter#393
更完整的国际化(i18n)和可访问性支持是 Flutter 未来几个月中需要努力的两项重大工作。我们计划完成的另一个 i18n 工作示例是为我们提供的小部件(例如教授 Material 库的 Scaffold 将 Drawer 放置在右侧,当语言环境为 RTL 时)完成从右到左(RTL)布局。RTL 文本支持目前可以使用,但没有小部件能够自动适应 RTL 布局。