《Android 編程權威指南》學習筆記 : 第17章 資源本地化

第17章 資源本地化

本地化是一個基於設備語言設置,爲應用提供合適資源的過程。
本章會爲CriminalIntent應用提供中文版res/values/strings.xml。
設備語言如果設置爲中文,Android就會自動找到並使用相應的中文資源

資源本地化

目標語言配置修飾符的資源子目錄(res/values-zh)

語言設置是設備配置的一部分。和處理屏幕方向、屏幕尺寸以及其他配置因素改變一樣,Android也提供了用於不同語言的配置修飾符。本地化處理因而變得簡單:
創建帶目標語言配置修飾符的資源子目錄,並放入備選資源。其餘工作可以交給Android資源系統自動處理了。

在項目工具窗口中,右鍵單擊res/values目錄,選擇New → Values resource file菜單項。

  • 文件名輸入 strings.xml,
  • Source se t選中 main,
  • Directory name設置爲 values。
  • 在Available qualifiers列表窗口,選中Locale,使用>>按鈕把它移入Chosen qualifiers窗口,

在Language列表窗口中選中zh: Chinese,此時,右邊的Specific Region Only窗口會自動選中Any Region,這就是我們想要的,無須更改。

點擊【OK】按鈕,自動生成 res/vaulses-zh/strings.xml 文件:

切換到【Project】視圖,查看真實的路徑目錄:
多了一個中文語言資源修飾符目錄 values-zh,如下所示:

當系統語言設置爲中文時,自動加載該目錄下的字符串資源

添加中文字符串資源

代碼清單:res/values-zh/strings.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">CriminalIntent</string>
    <string name="crime_title_hint">crime簡短描述</string>
    <string name="crime_title_label">標題</string>
    <string name="crime_details_label">明細</string>
    <string name="crime_solved_label">是否解決</string>
    <string name="new_crime">新增crime記錄</string>
    <string name="crime_suspect_text">嫌疑人聯繫方式</string>
    <string name="crime_report_text">抗議或投訴</string>
    <string name="crime_report">%1$s!crime發生於 %2$s. %3$s, y %4$s</string>
    <string name="crime_report_solved">問題已解決</string>
    <string name="crime_report_unsolved">問題未解決</string>
    <string name="crime_report_no_suspect">沒找到嫌疑人</string>
    <string name="crime_report_suspect">嫌疑人是 %s</string>
    <string name="crime_report_subject">crime處理情況報告</string>
    <string name="send_report">投訴方式</string>
</resources>

運行程序,將本機或模擬的系統語言設置爲中文,

注意:模擬器有時候並不帶中文語言包,即使設置系統語言爲中文,也沒有顯示中文
建議使用真機測試

CriminalIntent應用就會顯示中文,如下圖所示:

默認資源

應爲所有資源提供默認資源。沒有配置修飾符的資源就是Android的默認資源。如果無法找到匹配當前配置的資源,Android就會使用默認資源。默認資源至少能保證應用正常運行。

例外的屏幕顯示密度

Android默認資源使用規則並不適用於屏幕顯示密度。項目的drawable目錄通常按屏幕顯示密度要求,帶有-mdpi、-xxhdpi這樣的修飾符。不過,Android決定使用哪一類drawable資源並不是簡單地匹配設備的屏幕顯示密度,也不是在沒有匹配的資源時直接使用默認資源。
最終的選擇取決於對屏幕尺寸和顯示密度的綜合考慮。Android甚至可能會選擇低於或高於當前設備屏幕密度的drawable資源,然後通過縮放去適配設備。無論如何,請記住一點:不要在res/drawable/目錄下放置默認的drawable資源。

檢查資源本地化完成情況

Android Studio提供了資源翻譯編輯器這個工具。這個便利工具能集中查看資源翻譯完成情況,
要啓動資源翻譯編輯器,在項目工具窗口右鍵單擊某個語言版本的strings.xml,選擇Open Translations Editor菜單項即可

區域修飾符

修飾資源目錄也可以使用語言加區域修飾符,這樣可以讓資源使用更有針對性。例如,西班牙語可以使用-es-rES修飾符,其中,r代表區域,ES是西班牙語的ISO 3166-1-alpha-2標準碼。配置修飾符不區分大小寫。但最好遵守Android命名約定:語言代碼小寫,區域代碼大寫,但前面加個小寫的r。
注意,語言區域修飾符,比如-es-rES,看上去像兩個不同的修飾符的合體,實際並非如此。這是因爲,區域本身不能單獨用作修飾符。

在運行Nougat之前的系統版本的設備上,如果找不到匹配的資源,應用就會使用無任何修飾符的默認資源。
Nougat及其之後的系統版本已優化locale支持,支持更多locale以及支持同一設備選擇多個locale。因此,爲了讓應用顯示更準確的語言,系統使用了更智能化的資源匹配
如果找不到精準匹配,也找不到僅針對語言的匹配,系統就會去匹配有同樣語言而區域不同的資源。

資源應儘可能通用,最好是使用僅限語言的修飾目錄,儘量少用區域修飾。就上例來說,與其維護三類不同區域西班牙語的資源,不如只提供values-es版資源。這樣,不僅方便開發維護,也方便適配不同版本的系統(Nougat之前及之後的系統版本)。另外,上述結論也適用於values目錄裏的其他備選資源。
總之,我們應該使用通用目錄提供共享資源,那些需要定製化的資源就放在帶有更具體修飾符的目錄裏吧。

配置修飾符

目前爲止,我們已見過好幾個配置修飾符,它們都用於提供可選資源,比如:

  • 語言(values-zh)、
  • 屏幕方向(layout-land)
  • 屏幕顯示密度(drawable-mdpi)

不是所有配置修飾符都能在早期版本Android系統獲得支持。系統知道這一點,所以會給Android 1.0之後出現的修飾符加上平臺版本修飾符。例如,圓形屏幕修飾符自API 23級別引入,用到它時,系統會自動加上v23。因此,如果爲新設備引入資源修飾符,根本不用擔心在舊系統中會遇到問題。

可用資源優先級排定


代碼清單:res/values-w600dp/strings.xml

<resources>
  <string name="crime_title_hint">
      Enter a meaningful, memorable title for the crime.
  </string>
</resources>

有三個版本的crime_title_hint資源:

  • res/values/strings.xml文件中的默認版本、
  • res/values-zh/strings.xml文件中的中文備選版本,
  • 以及res/values-w600dp/strings.xml文件中的寬屏備選版本

在設備語言設置爲簡體中文的前提下,運行CriminalIntent應用,然後旋轉設備至橫屏模式。因爲中文備選版本的資源優先級最高,所以我們看到的是來自values-zh/strings.xml文件的字符串資源。

也可以將設備語言重新設置爲英語,然後再次運行應用,確認寬屏模式的字符串資源使用符合預期,如下圖所示:

多重配置修飾符

以在同一資源目錄上使用多個配置修飾符。這需要各配置修飾符按照優先級別順序排列。因此,values-zh-w600dp是一個有效的資源目錄名,values-w600dp-zh目錄名則無效。(在新建資源文件對話框中,工具會自動配置正確的目錄名。)
爲CriminalIntent應用準備寬屏模式的中文字符串資源。創建的資源目錄名應爲values-zh-w600dp。
打開values-zh-w600dp/strings.xml文件,爲crime_title_hint添加中文字符串資源。

<resources>
    <string name="crime_title_hint">
        請輸入簡短、好記的crime描述
    </string>
</resources>

在設備語言已設置爲簡體中文的前提下,運行CriminalIntent應用,確認能看到新的備選資源,

測試備選資源

開發應用時,爲了查看佈局以及其他資源的使用效果,一定要針對不同設備配置做好測試。在虛擬設備或實體設備上測試都行,還可以使用圖形佈局工具測試。
圖形佈局工具有很多選項,用以預覽佈局在不同配置下的顯示效果。這些選項有屏幕尺寸、設備類型、API級別以及設備語言等。
要查看這些選項,可在圖形佈局工具中打開res/layout/fragment_crime.xml文件,如下圖所示的工具欄上的一些選項設置。

深入學習:確定設備屏幕尺寸

Android提供了三個修飾符,用於測試設備尺寸。下表列出了這些新修飾符。

假設要指定一個佈局僅在屏幕至少300dp寬時使用。據此,你可以使用一個可用的寬度修飾符,把佈局文件放在res/layout-w300dp(w代表寬度。同理,h代表高度)這樣的目錄中。
然而,由於設備旋轉,高度和寬度會交換過來。爲檢測某個特殊的屏幕尺寸,可以使用sw(最小寬度)。這樣,就可以指定屏幕的最小尺寸了。由於設備會旋轉,這個最小尺寸可以是高度,也可以是寬度。如果屏幕尺寸是1024 × 800,那麼sw就是800;如果屏幕尺寸是800 × 1024,那麼sw還是800。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章