我想开始将所有常量字符串(如标签等)放入可以在以后翻译的地方。
如何处理Flutter?
答案 0 :(得分:3)
我问了gitter,我得到了以下内容:
翻译/国际化不是我们考虑的功能"已完成" 然而。 https://pub.dartlang.org/packages/intl在Flutter中有效。我们有 一般来说跟踪这个错误:flutter / flutter#393
更完整的国际化(i18n)和可访问性支持 在接下来的几个月里,这是Flutter面前的两大工作。 我们计划的另一个i18n工作的例子正在完成 我们提供的小部件的从右到左(RTL)布局(例如教学) 材质库的脚手架将抽屉放在左侧 语言环境是RTL语言)。 RTL Text支持今天有效,但是 没有任何小部件是开箱即用的RTL布局 时刻。
答案 1 :(得分:2)
创建Localizations.dart文件
将以下代码添加到该文件中:
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 导入您使用字符串的文件中。
用new Text("App Title"),
new Text(DemoLocalizations.of(context).title),
醇>
对于要本地化的每个新字符串,您需要将翻译后的文本添加到每种语言的地图中,然后添加String get ...行。 这有点麻烦,但它可以满足您的需求。
这是对其中一种方式的快速概述。 您可以在Flutter文档中详细了解它:https://flutter.io/tutorials/internationalization/