我正在使用intl包将我的应用翻译成西班牙语。
locales.dart
class AppLocale {
...
String get folder => Intl.message("Folder", name: 'folder');
...
}
messages_es.dart
class MessageLookup extends MessageLookupByLibrary {
get localeName => 'es';
final messages = _notInlinedMessages(_notInlinedMessages);
static _notInlinedMessages(_) => <String, Function> {
"folder": MessageLookupByLibrary.simpleMessage("Carpeta"),
};
}
我使用以下代码进行调用:
AppLocale.of(context).folder
工作正常。
但是,我需要创建“动态”字符串。例如:
“嗨,{$ name}”
然后,我将调用此字符串,并将此“名称”作为参数或类似的名称传递。西班牙语将其翻译为“ Hola,{$ name}”。
可以使用此intl软件包吗?
答案 0 :(得分:4)
intl
软件包的自述文件解释了该示例
https://github.com/dart-lang/intl
将消息包装在函数中的目的是允许它 具有可以在结果中使用的参数。消息字符串是 允许使用Dart字符串插值的受限形式,其中 只能使用函数的参数,并且只能简单使用 表达式。不能使用局部变量,也不能使用 大括号的表达式。只有消息字符串可以具有 插值。名称,desc,args和示例必须是文字和 不包含插值。只有args参数可以引用 变量,并且应准确列出功能参数。如果你 正在传递数字或日期,并且您希望将其格式化,则必须 函数外部的格式,并将格式化的字符串传递到 消息。
greetingMessage(name) => Intl.message( "Hello $name!", name: "greetingMessage", args: [name], desc: "Greet the user as they first open the application", examples: const {'name': "Emily"}); print(greetingMessage('Dan'));
在本节下面,有更复杂的示例被解释,它们也处理复数形式和性别。
答案 1 :(得分:1)
如果您遵循 official internationalization docs 并在 .arb
文件中指定所有短语,您可以执行如下参数:
{
"greeting": "Hi, {name}!",
"@greeting": {
"description": "Greet the user by their name.",
"placeholders": {
"name": {
"type": "String",
"example": "Jane"
}
}
}
}
当你编译你的代码时,会为你生成一个类似下面的函数,并带有一个很好的 docbloc 来支持你的 IDE 工具提示:
/// Greet the user by their name.
///
/// In en, this message translates to:
/// **'Hi, {name}!'**
String greeting(String name);
所以你可以像这样使用它:
Text(AppLocalizations.of(context)!.greeting("Koos"))
答案 2 :(得分:0)
要在翻译中使用占位符,您需要:
t
前缀的占位符(即$
)$name
时在args
列表中添加占位符因此,完整的示例如下:
Intl.message
但是,您可以将Flutter Intl插件用于VS Code,只需在ARB文件中定义翻译,即可为您生成所有这些getter。 在这种情况下,您只需在ARB文件中添加一个像这样的键值对:
greetingMessage(name) => Intl.message(
"Hello $name!",
name: 'greetingMessage',
args: [name]
);