語言和語言代碼解析總覽

從 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. 沒有語言代碼完全比對的資源解析。

使用者設定 應用程式資源 資源解析
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 中所述的情況會有所不同:

表 2. 能夠以更好的方式處理沒有語言代碼完全比對情況的解析策略。

使用者設定 應用程式資源 資源解析
  1. fr_CH
預設 (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. fr_CH
  2. it_CH
預設 (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 可讓您建立多個精細的應用程式行為,並以更好的方式顯示內容。舉例來說,搜尋功能可以根據使用者的設定顯示多種語言的搜尋結果。瀏覽器應用程式可以避免翻譯以使用者已知語言顯示的網頁,而鍵盤應用程式可以自動啟用所有合適的版面配置。

格式設定工具

從 Android 6.0 (API 級別 23) 開始,對於許多常見語言而言 (en、es、ar、fr、ru),Android 僅支援一個或兩個語言代碼。由於每種語言只有少數變化版本,因此應用程式可以免去在資源檔案中以硬式編碼字串儲存某些數字或日期的程序。不過,由於 Android 現在支援更多語言代碼,因此即使是在單一語言代碼中,日期、時間、貨幣和類似資訊的格式也可能會有很大的不同。硬式編碼格式可能會混淆使用者。因此,在開發 Android 7.0 以上版本時,請務必使用格式設定工具,而不是硬式編碼數字和日期字串。

舉例來說,Android 7.0 以上版本支援 27 個阿拉伯文語言代碼。這些語言代碼可以共用大多數資源,但有些偏好使用 ASCII 數字,而其他則偏好使用原生數字。舉例來說,如果要使用數字變數建立句子 (例如「選擇一個 4 位數 PIN 碼」),請使用格式設定工具,如下所示:

 format(locale, "Choose a %d-digit PIN", 4)