【问题标题】:Android: I18n with parametersAndroid:带参数的 I18n
【发布时间】:2012-02-18 18:24:09
【问题描述】:

我知道 Android 支持 18n 应用程序,但我可以为这样的字符串提供参数吗?在 Rails 中,我可以这样做:

en:
  hello: "Hello %{name}! You've got %{count} messages."

t("hello", name: "Klaus", count: 5)

Android 中有类似的东西还是我必须自己做?

【问题讨论】:

    标签: android internationalization


    【解决方案1】:

    你也可以这样做

    在strings.xml中可以放

    <string name="xyz">Do you really want to report [%s] as spammer?</string>
    

    然后在你的代码中放入

    String foo = getString(R.strings.xyz,"Joe Doe");
    

    Context.getString()

    【讨论】:

      【解决方案2】:

      要详细说明 Heiko 的答案,并展示您的具体示例,如果您想拥有多个字符串,则需要对它们进行编号:

      <string name="hello">Hello %1$s! You've got %2$d messages.</string>
      

      这样您可以在每次翻译中切换字符串的顺序。使用它是:

      String hello = getString(R.strings.hello, "Klaus", 5);
      

      【讨论】:

      • 根据文档,您需要编号然后才需要重新排序项目:参数索引。通常,每个格式说明符都使用格式的下一个参数。为了方便本地化,可以对参数重新排序,以便它们在输出中出现的顺序与提供它们的顺序不同。例如,“%4$s”将第四个参数 (4$) 格式化为字符串 (s)。也可以使用
      【解决方案3】:

      Phrase 似乎完全符合您的要求。 Here's a article 关于它的实现。下面是文章中的示例。

      <string name="greeting"> Hello {name}, today\'s cook yielded {yield} {unit}.</string>
      

      然后……

      // Call put(...) in any order
      CharSequence greeting = Phrase.from(context, R.string.greeting)
          .put("unit", unit)
          .put("name", name)
          .put("yield", yield)
          .format();
      

      【讨论】:

        猜你喜欢
        • 2020-05-13
        • 1970-01-01
        • 1970-01-01
        • 2013-09-20
        • 2015-11-13
        • 1970-01-01
        • 2013-05-16
        • 1970-01-01
        • 2013-09-30
        相关资源
        最近更新 更多