第三部分:Android 应用程序接口指南---第三节:应用程序资源---第四章 本地化...
第4章 本地化
Android系統會在很多地區的不同設備上運行。為了能夠將應用提供給更多的用戶,你的應用應該以不同的方式處理文本、音頻文件、數字、貨幣和圖形,以適合于你應用使用的地點。
本文檔描述了本地化Android應用最好的實例。原則上允許你用Eclipse、Ant-based tools、或者其他任何搭載ADT的IED來開發Android應用。你應該已經有了一些Java的工作經驗并熟悉Android資源的加載,熟悉在XML中聲明用戶界面元素,了解一些開發的知識(如Activity的生命周期),了解國際化和本地化的基本原則。
4.1 概覽:Android的資源切換
資源包括文本的字符串、布局文件、聲音、圖片,以及其他任何你的Android應用所需的靜態數據。一個應用可以包含多套資源,每套為不同的設備設置定義。當用戶運行應用的時候,Android自動選擇并加載最適合設備的資源。
你在寫應用時:創建一組默認資源,加上在其他不同區域設置下使用的可替換資源。
用戶運行你的應用時: Android系統基于設備區域設置選擇加載哪些資源。
當你在寫應用時,你應創建應用使用到的,默認和替換用的資源。為了創建這些資源,你需要將文件放在項目的res/目錄下特定的子文件夾中。
4.1.1默認資源為什么很重要
當應用運行在你沒有定義本地文本的某個區域設置時,Android會從res/values/strings.xml中加載默認字符串。如果默認文件不存在,或者沒有你應用所需的某個字符串時,你的應用將不會運行,并顯示一個error。下述的例子將說明當默認文本文件不完全時會發生什么。
例:一個應用的Java代碼只引用了兩個字符串,text_a和 text_b。這個應用包含了一個以英文定義text_a和text_b的本地化資源文件(res/values-en/strings.xml)。另外還包含了一個定義了text_a但未定義text_b的默認資源文件(res/values/strings.xml)。
這個應用可能編譯通過。如果資源不存在,Eclipse等IDE不會提醒此錯誤。當這個應用在區域設置為英文的設備上運行時,或許也不會出現任何問題,因為 res/values-en/strings.xml 包含所有所需的字符串。但是,當這個應用在語言設置為英文以外的設備上運行是,會看見一個錯誤信息并出現一個Force Close按鈕。這個應用不會加載。為了預防這種情況,請確保res/values/strings.xml文件存在,并定義了你所需的所以字符串。這種情況適用于所有類型的資源,而不僅限于字符串:你需要創建一組包含所有你應用調用到的默認資源文件,如布局,圖片,動畫等。
4.2 用資源文件來進行本地化
4.2.1如何創建默認資源
將用于應用的默認文本放在這個文件中并置于如下路徑:
res/values/strings.xml(必須擁有此目錄)
res/values/strings.xml中的文本字符串必須使用默認語言,即為你預期你的用戶最經常說的語言。
默認資源必須同樣包括所有默認的圖片、布局,并能包含其他類型的資源,例如動畫。
res/drawable/(必須擁有此目錄,必須包含至少一個用于Google Play上應用圖標的圖形文件。)
res/layout/(必須擁有此目錄,定義默認布局的XML文件。)
res/anim/(動畫文件)
res/xml/(xml)
res/raw/(外部資源,一般這個文件夾里放入聲音)
提示:檢查你代碼中對每個Android資源的引用。確信每一個引用都有默認資源定義它。同樣保證默認字符串是完整的:一個本地化的字符串文件可以是所有字符串的子集,但是默認字符串文件必須包含所有的字符串。
4.2.2如何創建可替換的資源
應用本地化的很大一部分工作是為不同的語言提供替換用的文本。在某些情況下,你同樣需要提供替換用的圖形、聲音、布局、以及其他本地化的資源。應用可以為不同的修飾符指定很多res/<qualifiers>/文件夾。為了向不同語言提供替換用的資源,你需要使用一個指定為一種語言或者語言-區域組合的修飾符。
例: 假定你應用的默認語言是英語。同樣假定你想將你應用中所有的文本翻譯成法語,并將應用中的大部分文本(除開應用標題之外的作用東西)翻譯為日語。這樣的話,你應該建立3個可選strings.xml文件,每個都存儲在本地化資源文件夾中:
res/values/strings.xml 包含應用用到的所有字符串的英語文本,包括一個命名為title的字符串。
res/values-fr/strings.xml 包含所有字符串的法語文本,包括標題。
res/values-ja/strings.xm 包含除開標題之外,所有字符串的日語文本。
如果Java代碼提到R.string.title,如下將是在運行時會發生的事情:
如果一個設備設置為法語以外的其他任何語言,Android會從res/values/strings.xml文件中加載標題。如果設備設置為法語,Android會從res/values-fr/strings.xml文件中加載標題。
值得注意的是,如果設備設置為日語,Android會在res/values-ja/strings.xml文件中尋找標題。但是因為這個文件中沒有此字符串,Android會回到默認情況,從res/values/strings.xml文件中加載英文標題。
4.2.3哪組資源將獲得優先權?
如果多個資源文件都匹配設備的配置,Android會遵循一組規則來決定使用哪個文件。通過資源目錄名中定義的修飾符,區域設置通常總是會獲得優先權。例:假設一個應用包含了一套默認的圖像和另外兩套圖像,每一套都為不同的設備設置優化:
res/drawable/
包含默認圖像
res/drawable-small-land/
包含一個橫向的低密度QVGA屏幕設備優化的圖像。
res/drawable-ja/
包含為日語優化的圖像。
如果應用在配置為使用日語的設備上運行時,即使這個設備使用的是stylus輸入并且有一個橫向的低密度QVGA屏幕, Android也會從res/drawable-ja/中加載圖像。
例外:優先級高于區域設置的唯二修飾符是MCC和MNC(手機國家嗎和手機網絡碼)。
例: 假設你有如下情形:
◆應用代碼調用R.string.text_a
◆兩個相關資源文件可用:
res/values-mcc404/strings.xml 包含了使用應用默認語言的text_a,本例為英語。
res/values-hi/strings.xml 包含了使用印地語的text_a。
◆應用在使用如下配置的設備上運行:
SIM卡在印度連接移動電話網絡(MCC 404)。
語言設置為印地語(hi)。
即使設備配置為印地語,Android會從from res/values-mcc404/strings.xml(英文)中加載text_a。 這是因為資源選擇過程中,Android會將MCC匹配的優先級提升超過語言匹配。選擇進程并不是始終和本例中顯示的那么直接。
4.3 本地化策略
4.3.1設計你的應用能夠在任何語言設置下工作
你不能假設任何用戶只會用某種特定的設備。某些設備可能擁有你無法預測的硬件,或有可能將區域設置為一個你沒有預想過或者你無法測試的地區。所以請設計你的應用能夠正常實現功能并且與運行在什么設備無關。請保證你的應用包含了一套完整的默認資源。
請保證你的應用包含res/drawable/和res/values/文件夾(文件夾名不要加任何額外的修飾符),這些文件夾包括了你的應用所需的所有圖片和文本。 如果一個應用丟失了哪怕是一個默認資源,它都不會在設置為不支持區域的設備上運行。例如,res/values/strings.xml默認文件可能缺少一個應用需要的字符串:當應用在不支持區域上運行并試圖加載res/values/strings.xml時,用戶將會看見一個錯誤信息和一個Force Close按鈕。像Eclipse那樣的IDE不會提醒這種錯誤,并且當你在設置為受支持區域設置的設備或者仿真機上測試你的應用時不會發現這個問題。
4.3.2設計一個靈活的布局
如果你需要為一個已存在的語言(例如帶有長單詞的德語)重新設計你的布局文件,你可以為此種語言創建一個可替換的布局文件(例如res/layout-de/main.xml)。但是這會使你的應用難于維護。更好的方法是只建立一個更加靈活布局文件。
另一個典型的情況是有的語言需要在布局文件中請求其他不同的資源。例如,你可能有一個 表單,當應用在日語環境下運行時應該包括兩個字段的名字空間,但是在其他語言環境下運行需要三個字段的名字空間。這樣你可以讓主要布局文件包含其他的具有可變性的布局文件。被包含的布局文件根據不同的語言有不同的配置。
4.3.3避免創建過多的資源文件
你或許并不需要在你的應用中為每一個資源都創建一個本地化的替換資源。例如,在res/layout/main.xml文件中定義的布局應該能夠用在任何區域設置下,這樣你就不必再創建一個替換用的布局文件。同樣的,你可能不必為所有的字符串都創建替換文本。例如,如下假設:
你的應用的默認語言是美國英語。應用用到的每一個字符串都用美國英語的拼寫,定義在in res/values/strings.xml文件中你想為幾個重要的短語提供英國英語的拼寫。你想讓你的應用在英國的設備上運行時使用這些字符串。為了達到你的目的,你可以創建一個叫做res/values-en-rGB/strings.xml的小文件,僅包括應用在英國運行時需要的不同的字符串。而其他沒有定義的字符串,應用將會回到默認語言,并使用定義在res/values/strings.xm中的字符串。
4.3.4使用Android Context對象手動獲取區域設置
你可以使用Android提供的Context對象獲取區域設置:
String locale = context.getResources().getConfiguration().locale.getDisplayName();?
4.4 本地化應用測試
4.4.1在設備上測試
注意你用來測試的設備的可能與其他地區顧客使用的設備完全不同。你設備的可用區域設置可能與其他的設備不同。同樣,設備屏幕的分辨率和密度也可能不同,這可能會影響你的UI上字符串和圖片的顯示。請使用Settings應用來改變設備的區域設置(Home > Menu > Settings > Locale & text > Select locale)。
4.4.2創建和使用一個自定義區域設置
一個自定義區域設置是一個android系統鏡像并沒有明確支持的“語言/區域”組合。(在SDK 標簽中的Version Notes獲取Android平臺支持的區域設置列表)。你可以通過在模擬器上創建一個自定義區域設置,來測試你的應用是如何在自定義區域設置下工作的。有兩種方法來做到:
◆使用應用列表中提供的Custom Locale應用。(當你創建一個自定義區域設置后,長按名字以切換到此區域設置項。)
◆在adb shell中切換到一個自定義區域設置
當你將模擬器設置為一個Android系統鏡像中不存在的區域設置時,系統自身會顯示為他自己的默認語言。但是,你的應用應該完全本地化了。
4.4.3在ADB shell中改變模擬器的區域設置
1.通過使用ADB shell來改變模擬器的區域設置。
選擇你想測試的區域設置,并確定它的語言和地區碼,例如fr是法語而CA是加拿大。
2.啟動模擬器。
3.在主機命令行中運行如下命令:
adb shell
或者你有一個附屬設備,請通過添加一個-e參數來指定:
adb -e shell
4.當adb shell顯示#的時候,運行如下命令:
setprop persist.sys.language [language code];setprop persist.sys.country [country code];stop;sleep 5;start
用第一步中決定的代碼替換方括號。
?
例如,在加拿大法語環境下測試:
setprop persist.sys.language fr;setprop persist.sys.country CA;stop;sleep 5;start
這會導致模擬器重啟(這可能看起來像完全的冷重啟動,但它不是。)當桌面重新出現時,重新運行你的應用(例如,在Eclipse中點擊Run圖標),這樣你的應用會在新的區域設置下運行。
4.4.4默認資源的測試
這是測試應用是否包含了所有所需字符串資源的方法。
1.設置模擬器或者設備為你的應用所不支持的語言。例如,如果應用在res/values-fr/文件夾中有法語字符串,但res/values-es/中沒有任何西班牙語字符串,那就將模擬器的語言設置為西班牙語。(你可以使用Custom Locale應用來將模擬器設置為不支持的區域。)
2.運行應用
3.如果應用顯示了一個錯誤信息和一個Force Close按鈕,這可能表示不能加載某個字符串。請保證res/values/strings.xml文件擁有應用用到的所有字符串。
如果這個測試通過,在其他類型的設置下重復此測試。例如,如果應用擁有一個叫做res/layout-land/main.xml的布局文件,但不包含叫做res/layout-port/main.xml的文件,然后設置模擬器或者設備為portrait,試試這個應用是否能夠運行。
?
4.5 本地化清單
此清單總結了本地化Android應用的進程。并非此列表中的所有項都適用于任何應用。
4.5.1計劃和設計清單
選擇一個本地化策略。你的應用將支持那些國家以及什么語言?你應用的默認國家和語言是什么?當你的應用在給出的區域設置下沒有特定的資源時,應該有什么表現?
分辨你應用中的哪些東西是需要本地化的:
◆請考慮你應用中特定的細節-文本、圖片、聲音、音樂、數字、貨幣、日期和時間。你或許不需要◆本地化所有的東西。例如,你不必本地化用戶不會看見的文本,或者不帶傾向的圖片,或者在每個區域設置下都能傳達相同意義的圖標。
設計你的Java代碼使之無論在哪都能可以實例化資源:
◆使用R.string和strings.xml文件來取代代碼中定義的字符串或者字符串常量。
◆使用R.drawable和R.layout來取代代碼中定義的圖片或布局。
4.5.2內容清單
◆在res/values/和其他res/文件夾中創建一組完整的默認資源
◆獲得這些靜態文本的可靠翻譯,包括菜單文本、按鍵名、錯誤信息、以及幫助文本。將這些已翻譯的文本放在res/values-<qualifiers>/strings.xml文件中。
◆確信你的應用為每一個支持的區域設置正確的格式化了動態字符(例如數字和日期)。確信你的應用為每一個支持的語言擁有了正確的換行、標點、以及排列順序。
◆創建你的應用請求的其他本地化的內容;例如,為每一個語言創建所需要的聲音文件。
4.5.3測試發布清單
◆在所有支持的區域和語言設置下測試你的應用。如果有可能的話找該區域的本地人來測試你的應用并給你回復。
◆通過加載設備或模擬器不支持的區域設置來測試默認資源。
◆在橫向和豎向(landscape and portrait)模式下測試本地化的字符串。
◆標記你的應用并創建最終版本。
◆上傳你的.apk文件到Google Play,在你上傳時選擇適當的語言。
?本文來自jy02432443,是本人辛辛苦苦一個個字碼出來的,轉載請保留出處,并保留追究法律責任的權利?QQ78117253?
總結
以上是生活随笔為你收集整理的第三部分:Android 应用程序接口指南---第三节:应用程序资源---第四章 本地化...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iptables中文man文档
- 下一篇: JqueryMobile链接一个页面,而