带有多个参数的Android复数字符串

19
在Android字符串中,您可以定义复数形式以处理根据提供给字符串的实际数字的不同翻译,如此处所述。 字符串还允许类似于许多语言中sprintf的指定多个位置参数。 但是,请考虑以下字符串:
<resources>
    <string name="remaining">%1$d hours and %2$d minutes remaining.</string>
</resources>

它包含两个数字,我如何在Android中将其转换为复数?所有示例都仅使用单个参数。这是否可能?

3个回答

7

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来检索这两个部分并将它们组合在一起。


2
getRelativeTimeSpanString似乎是解决我手头问题的好选择,但并不能解决我的最初问题。一个文本中包含多个数字并不罕见(“您有5封邮件和3条消息”,“还剩下5美元和83美分。”)。我不知道如何为您建议的getQuantityString版本指定XML。 - Andreas Gohr
请查看我发布的第一个链接。文档说明将使用数量来选择字符串,并使用第三个参数进行格式化。 - Blackbelt
1
抱歉,我不理解。你能否提供一个例子来扩展你的回答,其中包括a)设置4个复数形式所需的字符串的XML和b)使用邮件和消息作为输入数量调用getQuantityString的方法? - Andreas Gohr
我明白你的意思。在这种情况下,我认为你需要两个不同的复数形式。当你在同一个句子中混合使用复数和单数时,它的可扩展性不好。你还需要这个例子吗? - Blackbelt
1
我知道如何使用单个数量来完成它。谢谢。所以我想答案就是“不可能只用一个完成它”。 - Andreas Gohr

7

之前的答案使用了字符串拼接,从国际化角度来看是不正确的。原始字符串是“%1$d hours and %2$d minutes remaining.”,使用字符串拼接会强制将“remaining”翻译到末尾,这可能不适用于某些语言。

我的解决方案是:

<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中提到。

通常可以通过使用数量中立的表达方式,如“书籍:1”,来避免使用数量字符串。


2

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个(给定大小)项目


1
这并没有回答初始问题,因为它没有在一个字符串中使用多个参数。 - Andreas Gohr
我已更新答案。如果它回答了问题,请检查并点赞。 - akshay bhange
这仅支持一个参数的复数。 - Andreas Gohr
1
OP正在寻求一种解决方案,可以支持输出“已选择2项中的1项”和“已选择1项中的2项”。 - 1mike12

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接