android语言列表+波斯,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 里都放置一份:
跟隨系統
簡體中文
繁體中文(臺灣)
English
復制代碼
類似微信,只需要把跟隨系統翻譯一遍就行了,其他的每個語言文件夾下都一樣。
然后當然就要在應用中持久化保存當前多語言設置選項,用 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
在多語言文件夾下也可以放置字符串數組資源:
跟隨系統
簡體中文
English
復制代碼
可以在 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 ,不區分國家即可;
更改系統全局語言設置
需要聲明系統權限,普通應用無法使用:
復制代碼
為多語言適配不同字體
多語言文件夾下不僅能存放 strings.xml ,還能配置不同風格,所以可以為不同的語言設置不同的字體,不過要注意有些字體有語言顯示上的限制。
@color/colorPrimary
@color/colorPrimaryDark
@color/colorAccent
@font/arial
復制代碼
更多地,可以為不同語言設置其他的主題風格,如背景色、轉場動畫等。
輔助工具
如果應用所要支持的語言種類很多,那么逐條分別輸入文本是很繁瑣的一件事情,推薦幾個可以
加快效率 (偷懶)的工具
多語言文本翻譯導入工具,解決多語種項目翻譯逐條導入問題
Android Studio上的翻譯插件,支持翻譯代碼
批量翻譯并自動生成其他國家的語言文件夾,支持 104 種語言:
總結
以上是生活随笔為你收集整理的android语言列表+波斯,Android 多语言入门及实战的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言学习及应用笔记之四:C语言vola
- 下一篇: nlp cs224n 学习笔记1 Int