Android為了幫助開(kāi)發(fā)者把應(yīng)用更方便發(fā)布給全球不同語(yǔ)言的人們使用,建議開(kāi)發(fā)者在進(jìn)行開(kāi)發(fā)時(shí)不要把UI呈現(xiàn)相關(guān)的文本內(nèi)容硬編碼,而是把內(nèi)容寫入到strings.xml中,這樣做更加靈活,也更方便翻譯成不同其他語(yǔ)言。下面通過(guò)一個(gè)案例來(lái)逐步介紹一下strings的用法。
基本用法
比如我想在我的應(yīng)用頁(yè)面上呈現(xiàn)一句話,叫“我想買一臺(tái)Kindle”,那就可以在strings.xml中加入如下:
<string name="buy_kindle">我想買一臺(tái)Kindle</string>
在需要使用該字符串的地方通過(guò)getString獲得后使用。
getString(R.string.buy_kindle)
添加參數(shù)
現(xiàn)在你覺(jué)得這句話把買Kindle的數(shù)量寫死了,因?yàn)槟阍诖a中不同地方都用到了這句話,但所買的Kindle數(shù)量不一樣。strings資源讓開(kāi)發(fā)者可以自主在字符串的任何位置加上參數(shù),比如要解決這個(gè)問(wèn)題,可以:
<string name="one">一</string>
<string name="buy_kindle">我想買%s臺(tái)Kindle</string>
在有參數(shù)的情況下可以通過(guò)如下方式傳入
getString(R.string.buy_kindle, getString(R.string.one))
如果你想在這句話中加入多個(gè)參數(shù),比如想說(shuō):“我想買一臺(tái)Kindle送給小明”,而送給誰(shuí)可以自定,則可以如下表達(dá)。
<string name="buy_kindle">我想買%1$s臺(tái)Kindle送給%2$s</string>
getString(R.string.buy_kindle, getString(R.string.one), getString(R.string.xiaoming))
注意在多個(gè)參數(shù)時(shí),需要給參數(shù)加入位置信息,如上的%1$s。后面加上的參數(shù)會(huì)根據(jù)位置信息對(duì)應(yīng)入號(hào)。具體做法如Java中的formatter方法一樣,請(qǐng)參考:
http://developer.android.com/reference/java/util/Formatter.html
國(guó)際化
比如想把這句話翻譯成英文,你可以新創(chuàng)建一個(gè)英文的Values resource file,如下圖方式選擇:
翻譯成如下:
<string name="buy_kindle">I want to buy %1$s Kindle</string>
從中可以發(fā)現(xiàn)Kindle這個(gè)詞并沒(méi)有翻譯,Android中對(duì)無(wú)需翻譯的詞,我們可以用<xliff:g>標(biāo)簽來(lái)標(biāo)注起來(lái),這樣我們把資源文件給他人或者使用Google Play自動(dòng)翻譯服務(wù)時(shí),對(duì)方就知道該部分無(wú)需翻譯。如下:
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="buy_kindle">我想買%s臺(tái)<xliff:g id="Kindle">Kindle</xliff:g></string>
注意使用該標(biāo)簽時(shí),先在資源之前加上命名空間:
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"。
TIPS:Google play控制臺(tái)提供APP TRANSLATION SERVICE的翻譯服務(wù)
帶數(shù)量判定的字符串
在翻譯成英語(yǔ)后,發(fā)現(xiàn)問(wèn)題來(lái)了,如果我想表示買了多臺(tái)Kindle,但在英語(yǔ)語(yǔ)法中多臺(tái)Kindle需要用復(fù)數(shù)形式Kindles,這要如何做呢?Android為這種情形提供了Plurals方法。
<plurals name="buy_kindle">
<item quantity="one">I want to buy a Kindle</item>
<item quantity="other">I want to buy some Kindles</item>
</plurals>
獲得該plurals方法如下,第二參數(shù)傳入quantity,系統(tǒng)會(huì)根據(jù)quantity來(lái)選擇對(duì)應(yīng)的顯示,該方法后也可以加入?yún)?shù):
getResources().getQuantityString(R.plurals.buy_kindle, 2)
中文部分可以改成:
<plurals name="buy_kindle">
<item quantity="one">我想買一臺(tái)<xliff:g id="Kindle">Kindle</xliff:g></item>
<item quantity="other">我想買幾臺(tái)<xliff:g id="Kindle">Kindle</xliff:g></item>
</plurals>
TIPS:關(guān)于Quantity String的更詳細(xì)說(shuō)明請(qǐng)移步:
http://developer.android.com/guide/topics/resources/string-resource.html#Plurals
加入特殊字符
有些字符是沒(méi)有辦法在strings.xml里面直接寫的,比如"<",">",但可以用它對(duì)應(yīng)的ASCII碼來(lái)替代進(jìn)行顯示,比如要表達(dá):我想買一臺(tái)Kindle<$100>,則可以:
<item quantity="one">我想買一臺(tái)<xliff:g id="Kindle">Kindle<$100></xliff:g></item>
其中“<”的ASCII是<,“>”的是>。更多特殊字符與ASCII對(duì)應(yīng)表可以查看:《常見(jiàn)字符與ASCII十進(jìn)制對(duì)應(yīng)表》
作者簡(jiǎn)介
彭濤(@彭濤me) 致力于讓技術(shù)變得簡(jiǎn)單而有趣
個(gè)人博客:http://pengtao.me, GitHub地址:https://github.com/CPPAlien