【问题标题】:Android Plural Strings with multiple Parameters具有多个参数的 Android 复数字符串
【发布时间】:2016-03-27 09:14:50
【问题描述】:

在 Android 字符串中,您可以定义复数来处理翻译,具体取决于提供给字符串的实际数字,如 here 所述。 字符串还允许指定多个位置参数,类似于 sprintf 在许多语言中所做的。

但是,请考虑以下字符串:

<resources>
    <string name="remaining">%1$d hours and %2$d minutes remaining.</string>
</resources>

它包含两个数字,我如何将其转换为 Android 中的复数?所有示例始终仅使用单个参数。这甚至可能吗?

【问题讨论】:

    标签: android internationalization translation plural


    【解决方案1】:

    上一个答案使用字符串连接,从 i18n 的角度来看这是不正确的。对于原始字符串“剩余 %1$d 小时和 %2$d 分钟”。使用字符串连接会强制将“剩余”翻译到结尾,这可能不适合某些语言。

    我的解决方案是:

    <resources>
         <string name="remaining">Time remaining: Hours:%1$d Minutes:%2$d.</string>
    </resources>
    

    或者也许以“剩余时间”为标题。

    http://developer.android.com/guide/topics/resources/string-resource.html#FormattingAndStyling中提到了这个解决方案

    通常可以通过使用来避免数量字符串 数量中性的公式,例如“Books: 1”

    【讨论】:

      【解决方案2】:

      getQuantityString 有一个重载版本,它接受一个字符串 id、数量和一个 varargs 对象,您可以使用这些对象来格式化您的字符串。尽管似乎可以使用复数,但对我来说这听起来很奇怪。您可以使用 DateUtil 中包含的辅助方法,它们已经本地化并处理单数/复数,然后使用这些辅助方法的结果完成您的字符串。例如。 getRelativeTimeSpanString

      <plurals name="number_of_emails">
          <item quantity="one">%d email</item>
          <item quantity="other">%d emails</item>
      </plurals>
      
      <plurals name="number_of_messages">
          <item quantity="one">%d message</item>
          <item quantity="other">%d messages</item>
      </plurals>
      

      然后您可以使用getQuantityString 检索这两个部分并将其合并为一个。

      【讨论】:

      • getRelativeTimeSpanString 对于我手头的问题似乎是一个不错的选择,但不能解决我最初的问题。包含多个数字的文本并不罕见(“您有 5 封邮件和 3 条消息”、“还剩 5 美元和 83 美分。”)。我不知道如何为您建议的 getQuantityString 版本指定 XML。
      • 看第一个链接,我贴的。文档说数量将用于选择字符串和第三个参数来格式化它
      • 对不起,我不明白。您能否通过以下示例扩展您的答案:a)XML 为“您有 5 封邮件和 3 条消息”所需的 4 种复数形式设置字符串,以及 b)以邮件和消息作为输入数量的 getQuantityString 调用?跨度>
      • 我明白你的意思。我认为在这种情况下你需要两个不同的复数。当您可以在同一个句子中混合使用复数和单数时,它就不能很好地扩展。你还想要这个例子吗?
      • 我知道如何用一个数量来做到这一点。谢谢你。所以我想答案很简单:“不可能一次完成”。
      【解决方案3】:

      strings.xml

      <plurals name="lbl_items_selected">
          <item quantity="one">%d item out of %d items Selected</item>
          <item quantity="other">%d items out of %d items Selected</item>
      </plurals>
      

      Kotlin 文件

      resources.getQuantityString(
          R.plurals.lbl_items_selected, //plural from strings.xml file
          size, //quantity 
          size, //var arg - first parameter
          allItemCount //var arg - second parameter
      )
      

      这将返回:

      如果 size = 1:选择 10(allItemCount) 个项目中的 1 个项目

      如果 size = 2(或更多):选择 10(allItemCount) 个项目中的 2 个(给定大小)项目

      【讨论】:

      • 这没有回答最初的问题,因为它没有在一个字符串中使用多个参数。
      • 我已经更新了答案。如果它回答了问题,请检查并投票。
      • 这仍然只支持一个参数的复数。
      • OP 正在寻求一种解决方案,可以支持输出“选择 2 项中的 1 项”和“选择 1 项中的 2 项”
      猜你喜欢
      • 2016-07-17
      • 2012-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-29
      • 1970-01-01
      • 1970-01-01
      • 2021-12-26
      相关资源
      最近更新 更多