使用本地化的資源 如何建立預設資源 把應用程式的預設文本放到下面位置和名稱的一個檔案中: res/values/strings.xml
在res/values/strings.xml中的文本字串應該使用預設的語言,這種語言是期望大多數應用程式使用者會說的語言。 必須設定的預設資源還包括其他的任何可描畫資源和布局資源,以及動畫資源。 res/drawable/(這個目錄中至少要包含一個圖形檔案http://www.mianfeiyuanma.com/ ,用於Android啟動應用的表徵圖) res/layout/(這個目錄存放定義預設布局的XML檔案) res/anim/(如果需要,可以有任意個res/anim-<qualifiers>檔案夾) res/xml/(如果需要,可以有任意個res/xml-<qualifiers>檔案夾) res/raw/(如果需要,可以有任意個res/raw-<qualifiers>檔案夾) 提示:在代碼中,檢查每個引用的Android資源。確保每個資源都有預設的資源定義,還要確保預設字串檔案的完整性,本地化字串檔案可以是全部字串的一個子集,但預設字串檔案必須要包含全部字串。 如何建立可選資源 本地化應用程式的大部分工作是給不同的語言提供可選的文本。在某些情況下,還需要提供可選的圖形、聲音、布局以及其他特定環境的資源。 應用程式能夠用不同的限定符指定許多res/<qualifiers>/目錄。使用特定語言或語言加地區的組合限定符,能夠給不同的語言環境建立可選資源。(資來源目錄的名稱必須是在“提供可選資源”文檔中介紹的命名方案,否則不會被編譯。) 例如: 假設應用程式的預設語言是英語。還假設要把應用程式中的文本本地化為法語,並且還想要應用程式適用於日語環境(除了應用程式的標題以外)。這時需要建立三個可替代的strings.xml檔案,每個檔案被儲存在指定的資來源目錄中: 1. res/values/strings.xml:包含應用程式使用的所有的英語文本,包括標題的命名文本。 2. res/values-fr/strings.xml:包含字串的所有法語文本,包含標題。 3. res/values-ja/strings.xml:包含除了標題以為的所有字串的日語文本。 如果Java代碼中應用了R.string.title資源,在運行是會發生下面的情況: 1. 如果裝置被設定成法語以外的其他任意語言,那麼Android會從res/values/strings.xml檔案中載入標題。 2. 如果裝置被設定成法語語言環境,那麼Android就會從res/values-fr/strings.xml檔案中載入標題。 要注意的是,如果裝置是日語環境,那麼Android會首先從res/vaues-ja/strings.xml檔案中尋找標題,但是因為這個檔案中沒有包含標題字串,所以Android會返回時用預設的標題,即從res/values/strings.xml檔案中載入標題資源。 Android會優先選擇哪個資源? 如果有多個資源檔跟裝置配置匹配,Android會使用下列規則來決定使用哪個資源檔。其中有的在資來源目錄名中指定了限定符,語言環境幾乎始終是要優先選擇的。 例如: 假設應用程式套件組合含了一個預設的圖形集和兩組其他圖形,每組都被最佳化用於不同的裝置: 1. res/drawable/:包含預設圖形。 2. res/drawable-small-land-stylus/:包含了用於手寫筆輸入和OVGA低密度橫向螢幕裝置的圖形。 3. res/drawable-ja/:包含了適用於日語環境的圖形。 如果應用程式運行在配置了日語環境的裝置上,那麼即使是裝置期望使用手寫筆,並且螢幕是QVGA的低密度螢幕,那麼Android也會從res/drawable-ja/目錄中載入圖形。 例外:只有MCC(移動國家代碼)和MNC(移動網路代碼)限定符的優先順序要高於語言環境。 例如: 假設下列情境: 1. 應用程式的代碼調用R.string.text_a 2. 有兩個可以利用資源: res/values-mcc404/strings.xml,註冊碼它包含了text_a在英語環境中,應用程式中的預設語言。 res/values-hi/strings.xml,它包含了text_a在印度語中的字串。 3. 應用程式運行在下列配置的裝置上: SIM卡被串連到印度的移動網路(MCC 404)。 語言環境被設定為印度語(hi)。 即使裝置被配置成印度語,Android系統也會從res/values-mcc404/strings.xml(英語資源)中載入text_a。這是因為資源選擇的過程中,MCC的優先順序要比語言的優先順序高。 選擇的過程不總是像這個例子這樣直截了當。詳細內容請閱讀“Android應用資源---訪問資源”一節中的“如何尋找和匹配最佳資源”。所有的限定符都在“Android應用資源---提供資源”一節中的表2中進行了說明。 在Java代碼中引用資源 在應用程式的Java代碼中,引用資源的文法是:R.resource_type.resource_name或android.R.resource_type.resource_name(Android系統資源)。 本地化策略 設計可以在任何語言環境中工作的應用程式 不能假設應用程式所啟動並執行裝置上的任何事情。裝置可能有你所不期望的硬體,或者設定了你計劃外或沒有測試過的語言環境。因此要進行程式設計,以便不管它在什麼樣裝置上都能正常的運行或友好的失敗。 重要:確保應用程式套件組合含所有預設資源集。 確保包括了含有應用程式需要的所有圖片和文本的res/drawable/和res/values/檔案夾(在檔案夾名稱中不帶有任何其他修飾)。 如果應用程式遇到了即使是一個預設資源錯誤,它也不會在那個不支援的裝置環境上運行。例如,res/values/strings.xml預設檔案可能缺少一個應用程式需要的字串,在應用程式運行在一個不支援的語言環境中,並且試圖載入res/values/strings.xml檔案時,使用者會看到一個錯誤訊息和一個強制關閉按鈕。項Eclipse這樣的IDE不會發現這類錯誤,在被支援語言環境的裝置或模擬器上測試時,不會發現這個問題。 設計靈活的布局 如果為了適應某種語言(如用長單詞的德語),需要重排布局,那麼可以為這種語言創鍵一個可選的布局(如,res/layout-de/main.xml)。但是,這樣做會使應用程式更難維護。更好的辦法是建立一個更靈活的單一布局。 另一種典型的情況是由於語言的差異對布局的不同需求。如,當應用程式運行在日語環境中時,需要一個包含了兩個名稱欄位的通訊錄格式,而運行在其他的一些語言中時,需要三個名稱欄位。有兩種方法可以處理這種情況: 1. 建立一個帶有三個欄位的布局,然後基於語言環境,用編程的方法啟用或禁用其中一個名稱欄位。 2. 建立一個主布局,主布局中含有包含了另一個可變欄位的子布局。第二個布局能夠針對不同的語言進行不同的配置。 避免建立多餘的資源檔和文本字串 在應用程式中不可能給每種資源都建立特定語言環境的可選資源。如,定義在res/layout/main.xml檔案中的布局可以在任何語言環境中工作,因此沒有必要給任何語言環境都建立可選的布局資源檔。 還有,可能不需要給每個字串都建立可選的文本。如,假設下列情況: 1. 應用程式的預設語言是美式英語。應用程式使用的每個字串都使用美式英語的拼字,它們被儲存在res/values/strings.xml檔案中。 2. 對於一些重要的短語,想要提供英式英語拼字。以便應用程式運行在英國的裝置上時使用這些可選資源。 要做這件事情,需要建立一個叫做res/values-en-rGB/strings.xml的小檔案,其中只包含了與在美國運行時不同的字串。其餘所有的字串,應用程式都會使用被定義在res/values/strings.xml檔案中的預設字串。 使用Android的Context對象手動的尋找裝置的語言環境 可以使用Android提供的Context對象來尋找裝置的語言環境: String locale= context.getResources().getConfiguration().locale.getDisplayName(); |