成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Android-國(guó)際化(多語(yǔ)言)切換詳解及實(shí)例

jimhs / 1938人閱讀

摘要:國(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ān)文章

  • React項(xiàng)目國(guó)際化(antd)多語(yǔ)開發(fā)

    摘要:本國(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ó)際...

    tracymac7 評(píng)論0 收藏0
  • React項(xiàng)目國(guó)際化(antd)多語(yǔ)開發(fā)

    摘要:本國(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ó)際...

    wushuiyong 評(píng)論0 收藏0
  • vue 國(guó)際化i18n 多語(yǔ)切換

    摘要:如果對(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...

    tuomao 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

jimhs

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<