在 flutter 中,字符串文本直接设置为 TextField
小部件,例如:
new Text('Hello, How are you?')
是正确的方法吗?或者我们可以将所有字符串保存在一个文件中并像这样使用它:
<string name="name_hint">Hello, How are you?</string>
可能吗 ?
原文由 Magesh Pandian 发布,翻译遵循 CC BY-SA 4.0 许可协议
在 flutter 中,字符串文本直接设置为 TextField
小部件,例如:
new Text('Hello, How are you?')
是正确的方法吗?或者我们可以将所有字符串保存在一个文件中并像这样使用它:
<string name="name_hint">Hello, How are you?</string>
可能吗 ?
原文由 Magesh Pandian 发布,翻译遵循 CC BY-SA 4.0 许可协议
对于那些不想使用任何 3rd 方插件的人,这里是你如何做到的。
strings
assets
。将您的语言文件放入其中。 assets
strings
- en.json // for english
- ru.json // for russian
en.json
中,写入您的字符串。 {
"text1": "Hello",
"text2": "World"
}
同样,在 ru.json
中,
{
"text1": "Привет",
"text2": "Мир"
}
pubspec.yaml
文件(注意空格) flutter:
uses-material-design: true
assets:
- assets/strings/en.json
- assets/strings/ru.json
flutter_localizations:
sdk: flutter
AppBar
显示翻译后的文本。 void main() {
runApp(
MaterialApp(
locale: Locale("ru"), // switch between en and ru to see effect
localizationsDelegates: [const DemoLocalizationsDelegate()],
supportedLocales: [const Locale('en', ''), const Locale('ru', '')],
home: HomePage(),
),
);
}
class HomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text(DemoLocalizations.of(context).getText("text2") ?? "Error")),
);
}
}
// this class is used for localizations
class DemoLocalizations {
static DemoLocalizations? of(BuildContext context) {
return Localizations.of<DemoLocalizations>(context, DemoLocalizations);
}
String getText(String key) => language[key];
}
late Map<String, dynamic> language;
class DemoLocalizationsDelegate extends LocalizationsDelegate<DemoLocalizations> {
const DemoLocalizationsDelegate();
@override
bool isSupported(Locale locale) => ['en', 'ru'].contains(locale.languageCode);
@override
Future<DemoLocalizations> load(Locale locale) async {
String string = await rootBundle.loadString("assets/strings/${locale.languageCode}.json");
language = json.decode(string);
return SynchronousFuture<DemoLocalizations>(DemoLocalizations());
}
@override
bool shouldReload(DemoLocalizationsDelegate old) => false;
}
原文由 CopsOnRoad 发布,翻译遵循 CC BY-SA 4.0 许可协议
3 回答873 阅读✓ 已解决
2 回答2.1k 阅读
1 回答776 阅读✓ 已解决
2 回答981 阅读✓ 已解决
4 回答1k 阅读
1 回答766 阅读✓ 已解决
1 回答714 阅读✓ 已解决
Flutter 目前没有专门的字符串类资源系统。目前,最佳做法是将您的副本文本作为静态字段保存在类中并从那里访问它们。例如:
然后在您的代码中,您可以这样访问您的字符串:
资源
19 年 5 月编辑:
现在有 这个包 允许你用你的字符串创建 json 文件。它将允许您为复数、性别和语言等创建字符串
您可以像这样为每种语言创建一个单独的 json 文件:
_stringen.json
_stringnl.json
然后使用它来访问它
它会根据您手机的默认语言知道选择哪种语言。