摘要:國(guó)際化簡(jiǎn)稱因?yàn)樵诤椭g還有個(gè)字符,本地化,簡(jiǎn)稱。一鍵國(guó)際化如果需要很多語(yǔ)言的時(shí)候,手動(dòng)的切換很麻煩。二國(guó)際化實(shí)現(xiàn)實(shí)例配置資源文件,這個(gè)在前面已經(jīng)講過了。
internationalization(國(guó)際化)簡(jiǎn)稱 i18n,因?yàn)樵趇和n之間還有18個(gè)字符,localization(本地化),簡(jiǎn)稱L10n。
一.原理:Android中實(shí)現(xiàn)國(guó)際化相對(duì)來說還是簡(jiǎn)單的,因?yàn)锳ndroid有很獨(dú)特的資源管理方式。代碼可以不和資源發(fā)生關(guān)系,我們通常通過 R 文件提供的索引來間接的引用某一個(gè)資源。
把顯示的字符串都轉(zhuǎn)換成文件資源,再用代碼代碼提取,也就是把字符串存儲(chǔ)在對(duì)應(yīng)的values目錄下。
二.實(shí)現(xiàn)步驟:國(guó)際化切換可以手動(dòng)國(guó)際化,也可以一鍵國(guó)際化。
1.手動(dòng)國(guó)際化
為支持多國(guó)語(yǔ)言,在res/中創(chuàng)建一個(gè)額外的values目錄以連字符和ISO國(guó)家代碼結(jié)尾命名,比如values-es/是為語(yǔ)言代碼為"es"的區(qū)域設(shè)置的簡(jiǎn)單的資源文件的目錄。Android會(huì)在運(yùn)行時(shí)根據(jù)設(shè)備的區(qū)域設(shè)置,加載相應(yīng)的資源。
以中英文切換為例:
如果默認(rèn)是中文就不用建立相應(yīng)的values文件了,因?yàn)橄到y(tǒng)找不到對(duì)應(yīng)的資源直接會(huì)走默認(rèn)的。
(1).首先建立一個(gè)values資源文件values-en/放進(jìn)對(duì)應(yīng)的strings.xml。
添加不同區(qū)域語(yǔ)言的字符串值到相應(yīng)的文件就可以了。
(2).UI顯示字符串用代碼提取:
生成對(duì)應(yīng)的string文件不用每個(gè)都改,這樣很麻煩,教大家一個(gè)簡(jiǎn)單方法如下:
這樣直接就生成了string.xml,直接去改相應(yīng)的字符串就好了。
2.一鍵國(guó)際化
如果需要很多語(yǔ)言的時(shí)候,手動(dòng)的切換很麻煩。這時(shí)需要用到Android Studio插件:AndroidLocalizationer,它可以實(shí)現(xiàn)一鍵國(guó)際化。
使用方法:
(1).下載AndroidLocalizationer插件
下載地址:
https://github.com/westlinkin...
(2).集成到Android studio中。
集成成功之后重啟。
(3).使用
根據(jù)你的需要來選擇對(duì)應(yīng)的語(yǔ)言
結(jié)果如下:
附加:這個(gè)插件還是有些不穩(wěn)定的地方,有的Android Studio版本是不支持此插件的。
二.國(guó)際化實(shí)現(xiàn)實(shí)例
1.配置資源文件,這個(gè)在前面已經(jīng)講過了。
2.封裝一個(gè)ContextWrapper類
ContextWrapper構(gòu)造函數(shù)中必須包含一個(gè)真正的Context引用,同時(shí)ContextWrapper中提供了attachBaseContext()用于給ContextWrapper對(duì)象中指定真正的Context對(duì)象,調(diào)用ContextWrapper的方法都會(huì)被轉(zhuǎn)向其所包含的真正的Context對(duì)象。
public class MyContextWrapper extends ContextWrapper { public MyContextWrapper(Context base) { super(base); } @SuppressWarnings("deprecation") public static ContextWrapper wrap(Context context, String language) { Configuration config = context.getResources().getConfiguration(); Locale sysLocale = null; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { sysLocale = getSystemLocale(config); } else { sysLocale = getSystemLocaleLegacy(config); } if (!language.equals("") && !sysLocale.getLanguage().equals(language)) { Locale locale = new Locale(language); Locale.setDefault(locale); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { setSystemLocale(config, locale); } else { setSystemLocaleLegacy(config, locale); } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { context = context.createConfigurationContext(config); } else { context.getResources().updateConfiguration(config, context.getResources().getDisplayMetrics()); } } return new MyContextWrapper(context); } @SuppressWarnings("deprecation") public static Locale getSystemLocaleLegacy(Configuration config){ return config.locale; } @TargetApi(Build.VERSION_CODES.N) public static Locale getSystemLocale(Configuration config){ return config.getLocales().get(0); } @SuppressWarnings("deprecation") public static void setSystemLocaleLegacy(Configuration config, Locale locale){ config.locale = locale; } @TargetApi(Build.VERSION_CODES.N) public static void setSystemLocale(Configuration config, Locale locale){ config.setLocale(locale); } }
3.attachBaseContext實(shí)現(xiàn)
@Override protected void attachBaseContext(Context newBase) { //Public.Language 為 對(duì)應(yīng)的資源格式后綴,比如"zh" " super.attachBaseContext(MyContextWrapper.wrap(newBase, Public.Language)); }
如果想要整個(gè)APP都實(shí)現(xiàn)國(guó)際化,直接把a(bǔ)ttachBaseContext寫在封裝好的BaseActivity里。
4.調(diào)用
//動(dòng)態(tài)改變后綴名,可以存在本地?cái)?shù)據(jù)中,方法比較多就不細(xì)說了。Public.Language="zh"; recreate();
其中recreate();是Android3.0以后引入的。
希望大家支持下我的公眾號(hào):文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/67792.html
摘要:本國(guó)際化方案僅針對(duì)技術(shù)棧,且不會(huì)涉及服務(wù)端國(guó)際化內(nèi)容。引入多語(yǔ)言環(huán)境的數(shù)據(jù)雖然我只用到了文本翻譯的功能,以為就不需要加載這些數(shù)據(jù),但后來發(fā)現(xiàn)這是必須的步驟。 前言 最近新接了一個(gè)項(xiàng)目,從0開始做,需要做多語(yǔ)言的國(guó)際化,今天搞了一下,基本達(dá)到了想要的效果, 在這里簡(jiǎn)單分享下: showImg(https://segmentfault.com/img/bVbuiJB); 背景國(guó)際化方案國(guó)際...
摘要:本國(guó)際化方案僅針對(duì)技術(shù)棧,且不會(huì)涉及服務(wù)端國(guó)際化內(nèi)容。引入多語(yǔ)言環(huán)境的數(shù)據(jù)雖然我只用到了文本翻譯的功能,以為就不需要加載這些數(shù)據(jù),但后來發(fā)現(xiàn)這是必須的步驟。 前言 最近新接了一個(gè)項(xiàng)目,從0開始做,需要做多語(yǔ)言的國(guó)際化,今天搞了一下,基本達(dá)到了想要的效果, 在這里簡(jiǎn)單分享下: showImg(https://segmentfault.com/img/bVbuiJB); 背景國(guó)際化方案國(guó)際...
摘要:如果對(duì)您有幫助請(qǐng)動(dòng)動(dòng)鼠標(biāo)右下方給我來個(gè)贊,您的支持是我最大的動(dòng)力。安裝 npm install vue-i18n 新建一個(gè)文件夾 i18n ,內(nèi)新建 en.js zh.js index.js 三個(gè)文件 準(zhǔn)備翻譯信息 en.js export default { home: { helloworld: hello workd ! } }; zh.js export d...
閱讀 720·2023-04-25 19:53
閱讀 4343·2021-09-22 15:13
閱讀 2596·2019-08-30 10:56
閱讀 1353·2019-08-29 16:27
閱讀 2968·2019-08-29 14:00
閱讀 2446·2019-08-26 13:56
閱讀 476·2019-08-26 13:29
閱讀 1644·2019-08-26 11:31