android语言列表+波斯,Android 多语言入门及实战
右鍵res,選擇 New Resource Directory ,選擇 locale ,選擇自己想要適配的語(yǔ)言類(lèi)型
設(shè)置應(yīng)用內(nèi)多語(yǔ)言
Android 7.0以下
/**
* 設(shè)置多語(yǔ)言
*/
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);
}
復(fù)制代碼
Android 7.0及以上
有單一的目標(biāo)語(yǔ)言變成了一個(gè)語(yǔ)言列表,系統(tǒng)會(huì)根據(jù)這個(gè)列表的優(yōu)先級(jí)去適配語(yǔ)言:
/**
* 設(shè)置多語(yǔ)言
*/
@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);
}
復(fù)制代碼
7.0版本后的語(yǔ)言設(shè)置界面:
這樣做的好處是當(dāng)應(yīng)用不支持最高優(yōu)先級(jí)的語(yǔ)言,會(huì)讓用戶(hù)和者開(kāi)發(fā)者有自己的語(yǔ)言顯示替代策略,而不是只能選擇默認(rèn)資源文件下的語(yǔ)言。類(lèi)似的轉(zhuǎn)變還有 font-family ,在下文會(huì)有提及。
獲取系統(tǒng)語(yǔ)言設(shè)置
1. Locale.getDefault()
2. context.getResources().getConfiguration().locale;
3. Resources.getSystem().getConfiguration().locale;
1和2返回的是當(dāng)前 APP 的 Resource 對(duì)應(yīng)的 Locale 設(shè)置,也就是的值就是系統(tǒng)的 多語(yǔ)言值,但是但我們?cè)贏PP中更新過(guò) Locale ,就再也獲取不到系統(tǒng)語(yǔ)言設(shè)置了。
3返回的是系統(tǒng)全局 Resource 的 Locale,不會(huì)隨APP中的更新而修改,可以當(dāng)做系統(tǒng) Locale 來(lái)用。
所以如果想在APP運(yùn)行期間隨時(shí)獲得系統(tǒng)的多語(yǔ)言設(shè)置,有兩種方法,在APP未更新Locale值前保存;使用第三種方法。這個(gè)在配置多語(yǔ)言跟隨系統(tǒng)時(shí)很有用。
實(shí)戰(zhàn)
目前 Android 應(yīng)用對(duì)于多語(yǔ)言的支持度大致分為以下幾個(gè)層次:
不支持多語(yǔ)言:無(wú)論系統(tǒng)設(shè)置成何種語(yǔ)言,APP只顯示一種語(yǔ)言
APP支持多語(yǔ)言,但只能跟隨系統(tǒng)語(yǔ)言,不支持應(yīng)用內(nèi)多語(yǔ)言
APP既可以選擇跟隨系統(tǒng),也支持應(yīng)用內(nèi)多語(yǔ)言,但切換后需要重啟
APP既可以選擇跟隨系統(tǒng),也支持應(yīng)用內(nèi)多語(yǔ)言,切換后不需要重啟
無(wú)疑第四種情況是對(duì)多語(yǔ)言支持度最全面的,微信、微博等應(yīng)用均是采用這種方式管理多語(yǔ)言。接下來(lái)就講解下這種方式的具體實(shí)現(xiàn)過(guò)程:
定義需要支持的多語(yǔ)言列表選項(xiàng),因?yàn)樾枰故窘o用戶(hù)進(jìn)行選擇切換,需要在每個(gè) values-xx 里都放置一份:
跟隨系統(tǒng)
簡(jiǎn)體中文
繁體中文(臺(tái)灣)
English
復(fù)制代碼
類(lèi)似微信,只需要把跟隨系統(tǒng)翻譯一遍就行了,其他的每個(gè)語(yǔ)言文件夾下都一樣。
然后當(dāng)然就要在應(yīng)用中持久化保存當(dāng)前多語(yǔ)言設(shè)置選項(xiàng),用 SharedPreferences 再合適不過(guò)了。APP啟動(dòng)時(shí)獲取這個(gè)值,再轉(zhuǎn)換成對(duì)應(yīng)的 Locale值,如果選擇的是跟隨系統(tǒng),則需要獲取系統(tǒng)的Locale值:
public Locale getSysLocale() {
Locale locale;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {//7.0有多語(yǔ)言設(shè)置獲取頂部的語(yǔ)
locale = Resources.getSystem().getConfiguration().getLocales().get(0);
} else {
locale = Resources.getSystem().getConfiguration().locale;
}
return locale;
}
復(fù)制代碼
然后再更新即可。當(dāng)然更新后界面上的語(yǔ)言不會(huì)立即生效,推薦的做法和微信一樣:
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);
復(fù)制代碼
以清空棧的方式回到主頁(yè), MainActivity 也會(huì)銷(xiāo)毀重建,這樣就完成了多語(yǔ)言從設(shè)置到界面更新的全過(guò)程,而不用重啟APP再生效。
RTL
RTL(right to left)布局,是一種阿拉伯語(yǔ)、波斯語(yǔ)等情況下從右往左的閱讀方式,和我們使用的LTR布局方向?qū)αⅰ.?dāng)所開(kāi)發(fā)的App等面向海外用戶(hù)時(shí)需要做這個(gè)適配。從Android 4.2( V 17)開(kāi)始支持原生的RTL模式。這種布局遵循了 Material Design 鏡像view 等設(shè)計(jì)原則:
元素
LTR
RTL
文本
句子讀從左到右。
句子讀從右到左。
時(shí)間軸
事件進(jìn)展的說(shuō)明順序從左到右。
事件進(jìn)展的說(shuō)明順序從右到左。
圖像
一個(gè)箭頭指向從左到右顯示前進(jìn)運(yùn)動(dòng):→
一個(gè)箭頭指向右到左表示前進(jìn)運(yùn)動(dòng):←
是否啟用RTL布局來(lái)自?xún)蓚€(gè)部分,一個(gè)是判斷系統(tǒng)語(yǔ)言,還有一個(gè)就是需要在 AndroidManifest.xml 中聲明支持RTL:
android:supportsRtl="true"
復(fù)制代碼
在寫(xiě)布局文件的時(shí)候,就是注意把left和right相關(guān)的屬性都替換成start和end對(duì)于現(xiàn)有項(xiàng)目,也可以通過(guò) Refactor---->Add RTL support where possible 進(jìn)行快速替換。不過(guò)上面只是做了基礎(chǔ)的適配,那些有關(guān)左右方向的圖標(biāo)也要替換,同時(shí)也需要看控件本身是否支持RTL,這里就不再具體展開(kāi)了。
###其他
string-array
在多語(yǔ)言文件夾下也可以放置字符串?dāng)?shù)組資源:
跟隨系統(tǒng)
簡(jiǎn)體中文
English
復(fù)制代碼
可以在 strings.xml 中,也可以新建 arrays.xml 單獨(dú)管理字符串?dāng)?shù)組資源,在代碼中獲取和使用和string差不多
Resources res =getResources();
String[] languageTypes=res.getStringArray(R.array.language_type);
復(fù)制代碼
不過(guò)我在實(shí)際使用中遇到一個(gè)問(wèn)題,獲取到的字符串?dāng)?shù)組的值只受到全局多語(yǔ)言設(shè)置的影響,應(yīng)用內(nèi)多語(yǔ)言設(shè)置無(wú)效。這個(gè)還需要再做進(jìn)一步了解。
####英語(yǔ)設(shè)置不起作用
設(shè)置英文語(yǔ)言時(shí)在有些手機(jī)上不起作用 在某些手機(jī)上設(shè)置英語(yǔ)語(yǔ)言不生效,這是由于有些手機(jī)廠商的默認(rèn)英語(yǔ)設(shè)置的是英式英語(yǔ),而我們只使用了美式英語(yǔ)的緣故,此時(shí)處理方式為:
設(shè)置兩種英語(yǔ)的設(shè)置選項(xiàng),即美式英語(yǔ)( values-en-rUS )和英式英語(yǔ)( values-en-rGB );
可將res的文件夾命名為 values-en ,不區(qū)分國(guó)家即可;
更改系統(tǒng)全局語(yǔ)言設(shè)置
需要聲明系統(tǒng)權(quán)限,普通應(yīng)用無(wú)法使用:
復(fù)制代碼
為多語(yǔ)言適配不同字體
多語(yǔ)言文件夾下不僅能存放 strings.xml ,還能配置不同風(fēng)格,所以可以為不同的語(yǔ)言設(shè)置不同的字體,不過(guò)要注意有些字體有語(yǔ)言顯示上的限制。
@color/colorPrimary
@color/colorPrimaryDark
@color/colorAccent
@font/arial
復(fù)制代碼
更多地,可以為不同語(yǔ)言設(shè)置其他的主題風(fēng)格,如背景色、轉(zhuǎn)場(chǎng)動(dòng)畫(huà)等。
輔助工具
如果應(yīng)用所要支持的語(yǔ)言種類(lèi)很多,那么逐條分別輸入文本是很繁瑣的一件事情,推薦幾個(gè)可以
加快效率 (偷懶)的工具
多語(yǔ)言文本翻譯導(dǎo)入工具,解決多語(yǔ)種項(xiàng)目翻譯逐條導(dǎo)入問(wèn)題
Android Studio上的翻譯插件,支持翻譯代碼
批量翻譯并自動(dòng)生成其他國(guó)家的語(yǔ)言文件夾,支持 104 種語(yǔ)言:
總結(jié)
以上是生活随笔為你收集整理的android语言列表+波斯,Android 多语言入门及实战的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C语言学习及应用笔记之四:C语言vola
- 下一篇: nlp cs224n 学习笔记1 Int