Android string.xml字串的格式化和樣式
字串資源
字串資源為您的應用提供具有可選文字樣式和格式設定的文字字串。 共有三種類型的資源可為您的應用提供字串:
String
提供單個字串的 XML 資源。
String Array
提供字串陣列的 XML 資源。
Quantity Strings (Plurals)
帶有用於多元化的不同字串的 XML 資源。
以下應用程式碼用於檢索字串:
String string = getString(R.string.hello);
使用 getString(int) 或 getText(int) 來檢索字串。getText(int) 將保留應用於字串的任何富文字樣式設定。
Quantity Strings (Plurals)
資源引用:
在 Java 中:R.plurals.plural_name
語法:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<plurals
name="plural_name">
<item
quantity=["zero" | "one" | "two" | "few" | "many" | "other"]
>text_string</item >
</plurals>
</resources>
----------
<plurals>
一個字串集合,根據事物數量提供其中的一個字串。 包含一個或多個 <item> 元素。
Java程式碼:
int count = getNumberOfsongsAvailable();
Resources res = getResources();
String songsFound = res.getQuantityString(R.plurals.numberOfSongsAvailable, count, count );
注意:
1.getQuantityString() 獲取的字串是會根據不同的系統語言得到的字串也不一樣。
2.使用數量字串來替代 if 語句似乎更為方便,但必須注意的是,某些語言(如中文)根本不做這些語法區分,因此您獲取的始終是 other 字串。
總結:Quantity Strings在英文語義下,使用於單複數區分,比如:
<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>
格式和樣式設定
在字串包含特殊字元,以及需要格式化時,需要對字串作特殊處理,否則得不到我們想要的效果。
轉義撇號和引號
1.如果字串中包含撇號 (‘),您必須用反斜槓 (\’) 將其轉義,或為字串加上雙引號 (“”)。 例如,以下是一些有效和無效的字串:
<string name="good_example">This\'ll work</string> <string name="good_example_2">"This'll also work"</string> <string name="bad_example">This doesn't work</string> <!-- Causes a compile error -->
2.如果字串中包含雙引號,您必須將其轉義(使用 \”)。 為字串加上單引號不起作用。
<string name="good_example">This is a \"good string\".</string> <string name="bad_example">This is a "bad string".</string> <!-- Quotes are stripped; displays as: This is a bad string. --> <string name="bad_example_2">'This is another "bad string".'</string> <!-- Causes a compile error -->
設定字串格式
使用 String.format(String, Object…) 設定字串格式,可以通過在字串資源中加入格式引數來實現。<string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string>
特殊字元轉義
要在string.xml 中顯示特殊符號,如@,冒號,<>,字元末尾加空格等,直接寫是無法正常顯示的。只能考慮使用ASCII碼進行顯示常見字元與ASCII十進位制對應表,比如:@號 @ :號 : 空格  
XML轉義字元
以下為XML標誌符的數字和字串轉義符 " (" 或 ") ' (' 或 ') & (& 或 &) lt(<) (< 或 <) gt(>) (> 或 >)
使用 HTML 標記設定樣式
支援的 HTML 元素包括:
<b>表示粗文字
<i>表示斜體文字
<u>表示下劃線文字<?xml version="1.0" encoding="utf-8"?> <resources> <string name="welcome">Welcome to <b>Android</b>!</string> <!-- 將帶樣式的文字資源儲存為 HTML 轉義字串--> <string name="welcome_messages">Hello, %1$s! You have <b>%2$d new messages</b>.</string> </resources>
設定字串格式,但還要呼叫 fromHtml(String) 以將 HTML 文字轉換成帶樣式文字:
Resources res = getResources(); String text = String.format(res.getString(R.string.welcome_messages), username, mailCount); CharSequence styledText = Html.fromHtml(text);
由於 fromHtml(String) 方法將設定所有 HTML 實體的格式,因此務必要使用 htmlEncode(String) 對您用於帶格式文字的字串中任何可能的 HTML 字元進行轉義。 例如,如果您向 String.format() 傳遞的字串引數可能包含“<”或“&”之類的字元,則必須在設定格式前進行轉義,這樣在通過 fromHtml(String) 傳遞帶格式字串時,字元就能以原始形式顯示出來。 例如:
String escapedUsername = TextUtil.htmlEncode(username); Resources res = getResources(); String text = String.format(res.getString(R.string.welcome_messages), escapedUsername, mailCount); CharSequence styledText = Html.fromHtml(text);
Spannable 設定樣式
Spannable 是一種文字物件,讓您可以使用顏色和字型粗細等字型屬性進行樣式設定。 您可以使用 SpannableStringBuilder 生成文字,然後對文字應用 android.text.style 包中定義的樣式。
管理本地化字串
妥善管理應用的 UI 字串非常重要,這樣您才能為使用者提供優質的體驗,並讓本地化工作事半功倍。
1. 將所有字串放入 strings.xml 中
如果生成帶有文字的圖片,也請將這些字串放入 strings.xml,並在翻譯之後重新生成圖片。
2. 遵循 Android 的 UI 字串準則
3. 為宣告的字串提供充足的上下文
在 strings.xml 檔案中宣告字串時,確保清楚說明使用該字串的上下文。 此資訊對翻譯人員來說十分重要,有助於提高翻譯質量,也有助於您始終有效地管理字串。
<!-- The action for submitting a form. This text is on a button that can fit 30 chars -->
<string name="login_submit_button">Sign in</string>
您需要提供的上下文資訊包括:
- 字串有何用途?它在何時/哪裡呈現給使用者?
- 它處於佈局中的什麼位置?例如,如果它是按鈕,那麼翻譯的靈活性就不如文字框。
4. 標記不應翻譯的訊息部分
有時候字串中包含不應被翻譯為其他語言的文字。 常見的示例包括程式碼某個值的佔位符、特殊符號或名稱。 在準備翻譯字串時,請查詢並標記應該保留原樣而不需要翻譯的文字,這樣翻譯人員就不會更改這些內容。
要標記不應翻譯的文字,請使用 <xliff:g> 佔位符標記。以下示例標記可確保文字“%1$s”在翻譯過程中不會被更改(否則這條訊息會被破壞):
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!-- Example placeholder for a special unicode symbol -->
<string name="countdown">
<xliff:g id="time" example="5 days>%1$s</xliff:g>until holiday</string>
<string name="star_rating">Check out our 5
<xliff:g id="star">\u2605</xliff:g>
</string>
<!-- Example placeholder for a for a URL -->
<string name="app_homeurl">
Visit us at <xliff:g id="application_homepage">http://my/app/home.html</xliff:g>
</string>
<!-- Example placeholder for a name -->
<string name="prod_name">
Learn more at <xliff:g id="prod_gamegroup">Game Group</xliff:g>
</string>
<!-- Example placeholder for a literal -->
<string name="promo_message">
Please use the "<xliff:g id="promotion_code">ABCDEFG</xliff:g>” to get a discount.
</string>
...
</resources>
<xliff:g>標籤介紹:
1.屬性id可以隨便命名
2.屬性值舉例說明
%n$ms:代表輸出的是字串,n代表是第幾個引數,設定m的值可以在輸出之前放置空格
%n$md:代表輸出的是整數,n代表是第幾個引數,設定m的值可以在輸出之前放置空格,也可以設為0m,在輸出之前放置m個0
%n$mf:代表輸出的是浮點數,n代表是第幾個引數,設定m的值可以控制小數位數,如m=2.2時,輸出格式為00.00
也可簡單寫成:
%d (表示整數)
%f (表示浮點數)
%s (表示字串)
最近專案使用時遇到一個很容易忽略的問題:(2018-06-05)
<string name="spo2_data_desc">血氧值:%1$s <xliff:g>(%)</xliff:g>,脈率:%2$s(bpm)</string>
<string name="spo2_data_desc" formatted="false">血氧值:%1$s (%%),脈率:%2$s(bpm)</string>
<string name="spo2_data_desc">血氧值:%1$s (%%),脈率:%2$s(bpm)</string>
formatted=”false”,導致%1$s不能格式化,使用<xliff:g>標籤時沒辦法解決“%”的轉義問題的,用%的Unicode碼也不行,只能使用“%%”轉義
參考資料:
下一篇:app增加國際化的資原始檔支援