【问题标题】:Flutter internationalization - Dynamic stringsFlutter 国际化 - 动态字符串
【发布时间】:2019-02-16 01:59:46
【问题描述】:

我正在使用 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}”。

可以使用这个国际包吗?

【问题讨论】:

    标签: internationalization flutter intl


    【解决方案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"))
    

    【讨论】:

    • 这应该是公认的答案
    • 我也很感兴趣placeholders 块只需要存在于一个 arb 文件中(在我的例子中是intl_en.arb)。
    【解决方案2】:

    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'));
    

    在本节下面有更复杂的例子解释,也处理复数和性别。

    【讨论】:

      【解决方案3】:

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

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

      所以一个完整的例子看起来像这样:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多