右鍵res,選擇New Resource Directory
,選擇locale
,選擇本身想要適配的語言類型html
Android 7.0如下java
/** * 設置多語言 */
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及以上android
有單一的目標語言變成了一個語言列表,系統會根據這個列表的優先級去適配語言:git
/** * 設置多語言 */
@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版本後的語言設置界面: github
這樣作的好處是當應用不支持最高優先級的語言,會讓用戶和者開發者有本身的語言顯示替代策略,而不是隻能選擇默認資源文件下的語言。相似的轉變還有font-family
,在下文會有說起。數組
1.Locale.getDefault()
bash
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應用對於多語言的支持度大體分爲如下幾個層次:
無疑第四種狀況是對多語言支持度最全面的,微信、微博等應用均是採用這種方式管理多語言。接下來就講解下這種方式的具體實現過程:
定義須要支持的多語言列表選項,由於須要展現給用戶進行選擇切換,須要在每一個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(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 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
);須要聲明系統權限,普通應用沒法使用:
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION"/>
複製代碼
多語言文件夾下不只能存放strings.xml
,還能配置不一樣風格,因此能夠爲不一樣的語言設置不一樣的字體,不過要注意有些字體有語言顯示上的限制。
android8.0新增了font-family
,能夠定義一組字體及其權重
<?xml version="1.0" encoding="utf-8"?>
<font-family xmlns:android="http://schemas.android.com/apk/res/android">
<font
android:fontStyle="normal"
android:fontWeight="400"
android:font="@font/lobster_regular" />
<font
android:fontStyle="italic"
android:fontWeight="400"
android:font="@font/lobster_italic" />
</font-family>
複製代碼
而後再styles.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 種語言:
好像沒啥可說的了,祝你們新年快樂,整年無BUG!