Android多語系在地化(i18N)-支援7.0、繁中

Photo by VanveenJF on Unsplash

在開始前你可能會學到下述知識Context、Locale相關知識,在地化是透過Configuration類中的Locale讀取res資源資料夾進行配置的,可以藉由Configuration類中獲得設備的密度(densityDpi)、MMC、MNC及手機方向等,筆者這邊是使用Kotlin進行開發接下來就讓我們開始進入主題吧!

Locale

A Locale object represents a specific geographical, political, or cultural region. An operation that requires a Locale to perform its task is called locale-sensitive and uses the Locale to tailor information for the user. For example, displaying a number is a locale-sensitive operation — the number should be formatted according to the customs and conventions of the user’s native country, region, or culture.

可以看到上方Android Developers的解釋,簡單說來就是Locale它表示了特定的地理,政治和文化地區。並根據用戶本國,地區或文化的習慣和慣例格式化數字。
可以看到官方說明A Locale object logically consists of the fields described below. 此句下方說明了Locale組成要素有languagescriptcountry (region)variantextensions。我們這章節最多使用language以及conuntry剩下可以看Android Developers的說明或者我的參考。

  • Locale建構函數
//傳入語言,其餘country及variant皆為空值。 ex: en (英文),ja (日文)
Locale(java.lang.String)
//傳入語言及country,其餘variant為空值。 ex: zh (中文),TW (臺灣)
Locale(java.lang.String, java.lang.String)
//傳入語言、country及variant。ex: zh (中文),TW (臺灣), "polyton" (希臘語), "POSIX"
Locale(java.lang.String, java.lang.String, java.lang.String)
  • 透過Builder建構
//設定Locale組成的各個字段,這種方式要比Locale建構更為精確,但要求是傳入Locale的參數需更為準確
Locale aLocale = new Builder().setLanguage("zh").setScript("Hant").setRegion("TW").build();

到這邊理解Locale觀念後可以嘗試取得目前手機中的語言及國家了,我們使用Locale類別中的getDefault()方法,可以取得國家及語系,可以將此段複製至你程式當中,即可以從Log中觀察到目前語系及國家。

println("This is your Language: ${Locale.getDefault().language}, and country: ${Locale.getDefault().country}")

Locale String Resources

在專案創建時Android Studio就會為專案創立資源檔,可以看到res資料夾內容包含各種資源像是有圖片、顏色、佈景等。可以看到圖1資料夾分層中strings有各國語言的相對應檔案。
點擊滑鼠右鍵可以看到Reveal in Finder之後會移動到相對應的資料夾,各國資源檔資料夾是以values開頭後面夾帶語言及國家例如:values-en、values-zh-rTW。

圖1. 創建多國Strings.xml
圖2. 選擇相對應國家及語言
圖3. 輸入翻譯後的語言

實作應用程式內語言切換

在 Android 7.0 前後主要在於使用的context方法不同,以前使用updateConfiguration方法,進入後可以看到解釋如下配置上傳配置,這些都能從resource中獲得,之後看實戰練習就可以了解到。

Android 7.0 前

以後則是使用createConfigurationContext,進入後可以看到解釋如下皆是回傳context,兩者都是覆寫context想詳細了解context很推薦此篇文章解說非常詳細。

Android 7.0 後

接下來就讓我們看下source code,不夠清楚最下方則會有Github連結可以搭配使用~

主要替換儲存context皆是透過LocaleHelper並在attachBaseContext接收後覆寫,所以attachBaseContext只能在Activity實作,接下來就讓我們看下Activity需要做的事吧!

LocaleHelper

在Activity這邊可以看到主要在進行資源覆寫的地方是attachBaseContext如果想了解這類Context可以點選此篇文章解說非常詳細。剩餘的部分則是將resoursces實作出來後,由attachBaseContext進行覆寫。

Source Code: GitHub

參考

--

--

陳建維 Ben
工程師求生指南(Sofware Engineer Survival Guide)

喜愛新鮮知識充滿好奇心的Mobile工程師,3C愛好者也是書蟲。連絡信箱:tttw216@gmail.com;目前遷移至我的Blog: https://awilab.com/