語言和語言代碼解析總覽

從 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。例如:

表 1. 沒有完全相符語言代碼時的資源解析狀況。

使用者設定 應用程式資源 資源解析
法國 預設 (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 所述的案例會有不同的解析方式:

表 2. 針對沒有完全相符語言代碼的情況,改善後的解析策略。

使用者設定 應用程式資源 資源解析
  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 現在也提供更多使用者語言選項。以下再次嘗試使用上述範例,將義大利文指定為其他使用者語言,但應用程式不提供法文支援。

表 3. 應用程式僅符合使用者次要偏好語言代碼設定時的資源解析狀況。

使用者設定 應用程式資源 資源解析
  1. 法國
  2. it_CH
預設 (en)
de_DE
es_ES
it_IT
嘗試 fr_CH => 失敗
嘗試 fr => 失敗
嘗試 fr 的子項 => 失敗
嘗試看看_CH => 失敗
嘗試 => 失敗
嘗試其中 => 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)