從 Android 7.0 (API 級別 24) 開始,Android 為多語言使用者提供進階支援,使用者就能在設定中選取多個語言代碼。為提供這項功能,Android 大幅增加支援的語言代碼數量,並改變系統解析資源的方式。
本文件一開始介紹 Android 7.0 (API 級別 24) 以下版本的資源解析策略,接著闡述 Android 7.0 中更完善的資源解析策略,最後說明如何善用擴增的語言代碼數量,支援更多的多語言使用者。
解析語言資源的難題
在 Android 7.0 之前,Android 有時無法提供相符的應用程式和系統語言代碼。
舉例來說,假設您遇到以下情況:
- 應用程式的預設語言是
en_US
(美式英文),同時也在es_ES
資源檔案中提供本地化的西班牙文字串。 - 裝置設定為
es_MX
。
Java 程式碼要參照字串時,即使應用程式在 es_ES
中提供本地化的西班牙文資源,系統仍會從預設 (en_US
) 資源檔案載入字串。這是因為系統找不到完全相符的項目時,會捨棄語言代碼中的國家/地區代碼,持續尋找可用資源。最後,如果找不到相符項目,系統會改回採用預設值,也就是 en_US
。
如果使用者選擇應用程式完全不支援的語言 (例如法文),系統也會採用預設值 en_US
。例如:
使用者設定 | 應用程式資源 | 資源解析 |
---|---|---|
fr_CH |
預設值 (en) de_DE es_ES fr_FR it_IT |
嘗試 fr_CH => 失敗 嘗試 fr => 失敗 使用預設值 (en) |
在本例中,系統會顯示英文字串,但不知使用者能否理解英文。如今這種行為相當常見。
改進資源解析策略
Android 7.0 (API 級別 24) 提供更強大的資源解析能力,可自動尋找更理想的備用資源。但是,為加快解析速度並方便維護,您應將資源存放在最常用的父項方言中。舉例來說,如果之前是在 values-es-rUS
目錄中存放西班牙文資源,請移至包含拉丁美洲西班牙文的 values-b+es+419
目錄。同樣地,如果資源字串位於名為 values-en-rGB
的目錄,請將目錄重新命名為 values-b+en+001
(國際英文),因為 en-GB
字串的最常用父項是 en-001
。以下範例說明這些做法為何能提升資源解析的效能和可靠性。
資源解析範例
如果使用 Android 7.0 以上版本,表 1 所述案例會有不同的解析方式:
使用者設定 | 應用程式資源 | 資源解析 |
---|---|---|
|
預設值 (en) de_DE es_ES fr_FR it_IT |
嘗試 fr_CH => 失敗 嘗試 fr => 失敗 嘗試 fr 的子項 => fr_FR 使用 fr_FR |
現在使用者可取得法文資源,而非英文資源。此範例也說明為何在 Android 7.0 以上版本,應將法文字串存放在 fr
,而非 fr_FR
。這麼做的行動方針是比對最接近的父項方言,讓解析速度更快且更能預測。
除了這套更完善的解析邏輯,Android 現在也提供更多可選擇的使用者語言選項。以下再次嘗試使用上述範例,將義大利文指定為額外的使用者語言,但應用程式不支援法文。
使用者設定 | 應用程式資源 | 資源解析 |
---|---|---|
|
預設值 (en) de_DE es_ES it_IT |
嘗試 fr_CH => 失敗 嘗試 fr => 失敗 嘗試 fr 的子項 => 失敗 嘗試 it_CH => 失敗 嘗試 it => 失敗 嘗試 it 的子項 => it_IT 使用 it_IT |
即使應用程式並不支援法文,仍會提供使用者能理解的語言。
設計應用程式的其他語言代碼支援功能
您可以使用 Android 提供的工具更輕鬆將應用程式內容本地化,以使用者慣用的語言與他們互動。建議您使用下列技巧設定應用程式,讓應用程式能彈性因應不同的語言和格式慣例。
指定應用程式支援的語言
為確保系統能正確解析語言,請在模組層級 build.gradle
檔案中使用 resConfigs
屬性,指定應用程式支援的語言。
以下程式碼範例說明如何使用 resConfigs
指出支援的語言。在本例中,應用程式同時支援英文和西班牙文。
Groovy
android { defaultConfig { ... resConfigs "en", "es" } }
Kotlin
android { defaultConfig { ... resConfigs("en", "es") } }
LocaleList API
從 Android 7.0 (API 級別 24) 開始,Android 會公開 LocaleList.getDefault()
API,方便應用程式直接查詢使用者指定的語言清單。您可以使用這個 API 建立更精細的應用程式行為,並對內容顯示方式做出最佳調整。舉例來說,Google 搜尋可根據使用者的設定顯示多種語言的搜尋結果。瀏覽器應用程式可以避免提供使用者慣用語言的網頁翻譯內容,而鍵盤應用程式可以自動啟用所有合適的版面配置。
格式設定工具
在 Android 6.0 (API 級別 23) 以下版本,Android 對許多常見語言 (en、es、ar、fr、ru) 只支援一或兩個語言代碼。由於每種語言只有少數變化版本,應用程式不必在資源檔案中,以硬式編碼字串的形式儲存某些數字或日期。然而,Android 擴大支援更多語言代碼後,即使是在單一語言代碼中,日期、時間、貨幣和類似資訊的格式也可能有顯著差異。如果以硬式編碼設定這些格式,可能會讓使用者困惑。因此,針對 Android 7.0 以上版本開發應用程式時,請務必使用格式設定工具,不要將數字和日期字串硬式編碼。
舉例來說,Android 7.0 以上版本支援 27 個阿拉伯文語言代碼。這些語言代碼可以共用大多數資源,但部分語言代碼偏好使用 ASCII 數字,其他則偏好使用原生數字。例如要使用數字變數建立句子 (例如「選擇 4 位數 PIN 碼」) 時,請按照以下方式使用格式設定工具:
format(locale, "Choose a %d-digit PIN", 4)