具有多个参数的Android Plural字符串

And*_*ohr 14 android translation internationalization plural

在Android中的字符串,可以定义复数处理取决于供给所描述字符串的实际数量的翻译在这里.字符串还允许指定多个位置参数,类似于sprintf许多语言中的位置参数.

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

<resources>
    <string name="remaining">%1$d hours and %2$d minutes remaining.</string>
</resources>
Run Code Online (Sandbox Code Playgroud)

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

小智 7

以前的答案使用字符串连接,从i18n的角度来看是不正确的.对于原始字符串"%1 $ d小时和剩余%2 $ d分钟".使用字符串连接会强制将"剩余"转换为可能不适合某些语言的结尾.

我的解决方案是:

<resources>
     <string name="remaining">Time remaining: Hours:%1$d Minutes:%2$d.</string>
</resources>
Run Code Online (Sandbox Code Playgroud)

或者以"剩余时间"为标题.

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

通常可以通过使用数量中性的配方来避免数量字符串,例如"Books:1"


Bla*_*elt 5

getQuantityString有一个重载版本,它带有一个String 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>
Run Code Online (Sandbox Code Playgroud)

然后你可以getQuantityString用来检索这两件并将它合二为一.

  • getRelativeTimeSpanString似乎是我手头的问题的一个很好的选择,但不会解决我的初始问题.拥有多个数字的文本并不罕见("你有5封邮件和3封邮件","剩下5美元和83美分.").我不知道如何为你建议的getQuantityString版本指定XML. (2认同)