1. 程式人生 > >Android string.xml字串的格式化和樣式

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十進位制對應表,比如:

    @ &#064; 
    :號 &#058; 
    空格 &#160; 

    XML轉義字元

    以下為XML標誌符的數字和字串轉義符 
    "     (&#34; 或 &quot;) 
    '     (&#39; 或 &apos;) 
    &     (&#38; 或 &amp;) 
    lt(<) (&#60; 或 &lt;) 
    gt(>) (&#62; 或 &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 &lt;b>%2$d new messages&lt;/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增加國際化的資原始檔支援