2015-12-21 33 views
11

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

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

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

它包含两个数字,我将如何改变这个在Android的复数?所有示例只能使用单个参数。这甚至有可能吗?

回答

3

getQuantityString有一个重载的版本,它需要一个字符串id,数量和可用于格式化字符串的对象的varargs。尽管似乎可以使用复数形式,但对我而言,这听起来很奇怪。您可以使用DateUtil中包含的帮助程序方法,这些方法已经本地化并负责单数/复数,然后用这些帮助程序的结果填写字符串。例如。 getRelativeTimeSpanString

<plurals name="numberOfEmails"> 
    <item quantity="one">%d email</item> 
    <item quantity="other">%d emails</item> 
</plurals> 

<plurals name="numberOfMessages"> 
    <item quantity="one">%d message</item> 
    <item quantity="other">%d messages</item> 
</plurals> 

,然后你可以使用getQuantityString检索两个部分,并在一个结合起来。

+2

getRelativeTimeSpanString似乎是我手边的问题的一个好选择,但并不能解决我最初的问题。有多个号码的文本并不罕见(“你有5封邮件和3封邮件”,“还有5美元,剩下83美分。”)。我没有看到如何为您建议的getQuantityString版本指定XML。 –

+0

看看我发布的第一个链接。文件说,数量将用于选择字符串和第三个参数来格式化 – Blackbelt

+1

对不起,我不明白。你可以用a)XML的例子来扩展你的答案,为“你有5封邮件和3封邮件”所需的4个复数形式设置一个字符串,以及b)用邮件和消息作为输入数量来调用getQuantityString? –

-6

那么这是一种可能的工作方式。在活动

<resources> 
    <plurals name="remaining"> 
     <item quantity="one">%1$d hours and</item> 
     <item quantity="other">%2$d minutes remaining.</item> 
    </plurals> 
</resources> 

然后:在值/ strings.xml中像这样创建一个复数标签

Resources res = getResources(); 
String myString = res.getQuantityString(R.plurals.remaining, count, count); 

我希望它能帮助!

+2

它不回答这个问题.. 。 – user2878850

+4

建议的解决方案根本无法工作。每次调用getQuantityString(...)时,只会选择其中一个文本。 –

5

上一个答案使用字符串连接,从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

它通常可以通过使用 量中性配方,以避免数量串提到,如“书:1”