Flutter国际化-动态字符串

时间:2018-09-11 14:17:07

标签: internationalization flutter intl

我正在使用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软件包吗?

3 个答案:

答案 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)

要在翻译中使用占位符,您需要:

  • 将该占位符添加为getter参数
  • 提及在翻译中带有t前缀的占位符(即$
  • 调用$name时在args列表中添加占位符

因此,完整的示例如下:

Intl.message

但是,您可以将Flutter Intl插件用于VS Code,只需在ARB文件中定义翻译,即可为您生成所有这些getter。 在这种情况下,您只需在ARB文件中添加一个像这样的键值对:

greetingMessage(name) => Intl.message(
  "Hello $name!",
  name: 'greetingMessage',
  args: [name]
);