最近一段時(shí)間在國(guó)際部門(mén)做Android開(kāi)發(fā)川尖,所以手頭的項(xiàng)目都需要去適配多語(yǔ)言溃斋。這里總結(jié)了一些多語(yǔ)言適配的經(jīng)驗(yàn)秒咨。
演示效果:(在app底部tab添加多語(yǔ)言適配)
1.在res下創(chuàng)建多語(yǔ)言資源文件:
2.選擇需要添加的語(yǔ)言
然后得到多種語(yǔ)言適配string文件:
<!-- 中文string -->
<string name="home_page">首頁(yè)</string>
<string name="q_a">問(wèn)答</string>
<string name="system">體系</string>
<string name="mine">我的</string>
<!-- 英語(yǔ)string -->
<string name="home_page">home page</string>
<string name="q_a">Q&A</string>
<string name="system">system</string>
<string name="mine">mine</string>
<!-- 阿拉伯語(yǔ)string -->
<string name="home_page">?????? ????????</string>
<string name="q_a">???? ?????</string>
<string name="system">???</string>
<string name="mine">????</string>
3.代碼設(shè)置多語(yǔ)言
import android.annotation.TargetApi
import android.content.Context
import android.os.Build
import android.os.LocaleList
import java.util.*
object LanguageHelper {
fun getAttachBaseContext(context: Context): Context {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
return setAppLanguageApi24(context)
} else {
setAppLanguage(context)
}
return context
}
/**
* 獲取當(dāng)前系統(tǒng)語(yǔ)言贪庙,如未包含則默認(rèn)英文
* Locale類(lèi)包含語(yǔ)言糯耍、國(guó)家等屬性
*/
private fun getSystemLocale(): Locale {
val systemLocale = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
LocaleList.getDefault()[0]
} else {
Locale.getDefault()
}
return when (systemLocale.language) {
Locale.CHINA.language -> {
Locale.CHINA
}
Locale.ENGLISH.language -> {
Locale.ENGLISH
}
else -> {
Locale.ENGLISH
}
}
}
/**
* 兼容 7.0 及以上
*/
@TargetApi(Build.VERSION_CODES.N)
private fun setAppLanguageApi24(context: Context): Context {
val locale = getSystemLocale()
val resource = context.resources
val configuration = resource.configuration
configuration.setLocale(locale)
configuration.setLocales(LocaleList(locale))
return context.createConfigurationContext(configuration)
}
/**
* 設(shè)置應(yīng)用語(yǔ)言
*/
private fun setAppLanguage(context: Context) {
val resources = context.resources
val displayMetrics = resources.displayMetrics
val configuration = resources.configuration
// 獲取當(dāng)前系統(tǒng)語(yǔ)言礁叔,默認(rèn)設(shè)置跟隨系統(tǒng)
val locale = getSystemLocale()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
configuration.setLocale(locale)
} else {
configuration.locale = locale
}
resources.updateConfiguration(configuration, displayMetrics)
}
}
最后牍颈,設(shè)置多語(yǔ)言,在application的onCreate方法中調(diào)用 LanguageHelper.getAttachBaseContext(this)琅关,獲取系統(tǒng)語(yǔ)言煮岁,通過(guò)Configuration來(lái)進(jìn)行設(shè)置讥蔽。
這里在實(shí)際適配阿拉伯語(yǔ)言的時(shí)候,需要注意一些問(wèn)題画机,比如阿拉伯人是從右往左的冶伞,布局需要換成從右往左,所以在寫(xiě)布局時(shí)步氏,以往用的left响禽、right相關(guān)屬性,都需要改為start荚醒、end相關(guān)的屬性來(lái)寫(xiě)芋类,布局自動(dòng)會(huì)改為從右往左。而且有的帶有方向性的圖片也要有左右兩個(gè)類(lèi)型界阁,甚至某些布局改變會(huì)出亂侯繁,需要進(jìn)行判斷當(dāng)前是否為阿拉伯語(yǔ)種宾肺,來(lái)特殊布局處理雾狈。