Android 多語言入門及實戰
右鍵res,選擇 New Resource Directory
,選擇 locale
,選擇自己想要適配的語言型別

設定應用內多語言
Android 7.0以下
/** * 設定多語言 */ public void setConfiguration(LocaleList locales, Context context) { Configuration configuration = context.getResources().getConfiguration(); configuration.setLocales(locales); Resources resources = context.getResources(); DisplayMetrics dm = resources.getDisplayMetrics(); resources.updateConfiguration(configuration, dm); } 複製程式碼
Android 7.0及以上
有單一的目標語言變成了一個語言列表,系統會根據這個列表的優先順序去適配語言:
/** * 設定多語言 */ @RequiresApi(24) public void setConfiguration(LocaleList locales, Context context) { Configuration configuration = context.getResources().getConfiguration(); configuration.setLocales(locales); Resources resources = context.getResources(); DisplayMetrics dm = resources.getDisplayMetrics(); resources.updateConfiguration(configuration, dm); } 複製程式碼
7.0版本後的語言設定介面:

這樣做的好處是當應用不支援最高優先順序的語言,會讓使用者和者開發者有自己的語言顯示替代策略,而不是隻能選擇預設資原始檔下的語言。類似的轉變還有 font-family
,在下文會有提及。
獲取系統語言設定
1. Locale.getDefault()
2. context.getResources().getConfiguration().locale;
3. Resources.getSystem().getConfiguration().locale;
1和2返回的是當前 APP 的 Resource 對應的 Locale 設定,也就是的值就是系統的 多語言值,但是但我們在APP中更新過 Locale ,就再也獲取不到系統語言設定了。
3返回的是系統全域性 Resource
的 Locale,不會隨APP中的更新而修改,可以當做系統 Locale 來用。
所以如果想在APP執行期間隨時獲得系統的多語言設定,有兩種方法,在APP未更新Locale值前儲存;使用第三種方法。這個在配置多語言跟隨系統時很有用。
實戰
目前Android應用對於多語言的支援度大致分為以下幾個層次:
- 不支援多語言:無論系統設定成何種語言,APP只顯示一種語言
- APP支援多語言,但只能跟隨系統語言,不支援應用內多語言
- APP既可以選擇跟隨系統,也支援應用內多語言,但切換後需要重啟
- APP既可以選擇跟隨系統,也支援應用內多語言,切換後不需要重啟
無疑第四種情況是對多語言支援度最全面的,微信、微博等應用均是採用這種方式管理多語言。接下來就講解下這種方式的具體實現過程:
定義需要支援的多語言列表選項,因為需要展示給使用者進行選擇切換,需要在每個 values-xx
裡都放置一份:
<string name="language_auto">跟隨系統</string> <string name="language_zh_rCN">簡體中文</string> <string name="language_zh_rTW">繁體中文(臺灣)</string> <string name="language_english">English</string> 複製程式碼
類似微信,只需要把跟隨系統翻譯一遍就行了,其他的每個語言資料夾下都一樣。
然後當然就要在應用中持久化儲存當前多語言設定選項,用 SharedPreferences
再合適不過了。APP啟動時獲取這個值,再轉換成對應的 Locale值,如果選擇的是跟隨系統,則需要獲取系統的Locale值:
public Locale getSysLocale() { Locale locale; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {//7.0有多語言設定獲取頂部的語 locale = Resources.getSystem().getConfiguration().getLocales().get(0); } else { locale = Resources.getSystem().getConfiguration().locale; } return locale; } 複製程式碼
然後再更新即可。當然更新後介面上的語言不會立即生效,推薦的做法和微信一樣:
Intent intent = new Intent(SetLanguageActivity.this, MainActivity.class); int flags = Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK; intent.addFlags(flags); startActivity(intent); 複製程式碼
以清空棧的方式回到主頁, MainActivity
也會銷燬重建,這樣就完成了多語言從設定到介面更新的全過程,而不用重啟APP再生效。
RTL
RTL(right to left)佈局,是一種阿拉伯語、波斯語等情況下從右往左的閱讀方式,和我們使用的LTR佈局方向對立。當所開發的App等面向海外使用者時需要做這個適配。從Android 4.2( V 17)開始支援原生的RTL模式。這種佈局遵循了 Material Design 映象view 等設計原則:
元素 | LTR | RTL |
---|---|---|
文字 | 句子讀從左到右。 | 句子讀從右到左。 |
時間軸 | 事件進展的說明順序從左到右。 | 事件進展的說明順序從右到左。 |
影象 | 一個箭頭指向從左到右顯示前進運動:→ | 一個箭頭指向右到左表示前進運動:← |
是否啟用RTL佈局來自兩個部分,一個是判斷系統語言,還有一個就是需要在 AndroidManifest.xml
中宣告支援RTL:
android:supportsRtl="true" 複製程式碼
在寫佈局檔案的時候,就是注意把left和right相關的屬性都替換成start和end對於現有專案,也可以通過 Refactor---->Add RTL support where possible
進行快速替換。不過上面只是做了基礎的適配,那些有關左右方向的圖示也要替換,同時也需要看控制元件本身是否支援RTL,這裡就不再具體展開了。
###其他
string-array
在多語言資料夾下也可以放置字串陣列資源:
<string-array name="language_type"> <item>跟隨系統</item> <item>簡體中文</item> <item>English</item> </string-array> 複製程式碼
可以在 strings.xml
中,也可以新建 arrays.xml
單獨管理字串陣列資源,在程式碼中獲取和使用和string差不多
Resources res =getResources(); String[] languageTypes=res.getStringArray(R.array.language_type); 複製程式碼
不過我在實際使用中遇到一個問題,獲取到的字串陣列的值只受到全域性多語言設定的影響,應用內多語言設定無效。這個還需要再做進一步瞭解。
####英語設定不起作用
設定英文語言時在有些手機上不起作用 在某些手機上設定英語語言不生效,這是由於有些手機廠商的預設英語設定的是英式英語,而我們只使用了美式英語的緣故,此時處理方式為:
- 設定兩種英語的設定選項,即美式英語(
values-en-rUS
)和英式英語(values-en-rGB
); - 可將res的資料夾命名為 values-en ,不區分國家即可;
更改系統全域性語言設定
需要宣告系統許可權,普通應用無法使用:
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION"/> 複製程式碼
為多語言適配不同字型
多語言資料夾下不僅能存放 strings.xml
,還能配置不同風格,所以可以為不同的語言設定不同的字型,不過要注意有些字型有語言顯示上的限制。

<resources> <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> <item name="android:fontFamily">@font/arial</item> </style> </resources> 複製程式碼
更多地,可以為不同語言設定其他的主題風格,如背景色、轉場動畫等。
輔助工具
如果應用所要支援的語言種類很多,那麼逐條分別輸入文字是很繁瑣的一件事情,推薦幾個可以
加快效率
(偷懶)的工具
多語言文字翻譯匯入工具,解決多語種專案翻譯逐條匯入問題
Android Studio上的翻譯外掛,支援翻譯程式碼
批量翻譯並自動生成其他國家的語言資料夾,支援 104 種語言:
