Android 應(yīng)用內(nèi)多語(yǔ)言切換

最近公司的 App 里需要用到多語(yǔ)言切換西篓,簡(jiǎn)單來(lái)說(shuō)憋活,就是如果用戶沒(méi)有選擇語(yǔ)言選項(xiàng)時(shí),App 默認(rèn)跟隨系統(tǒng)語(yǔ)言寸爆,如果用戶在 App 內(nèi)進(jìn)行了語(yǔ)言設(shè)置盐欺,那么就使用用戶設(shè)置的語(yǔ)言冗美。當(dāng)然,你會(huì)發(fā)現(xiàn)节预,App 的語(yǔ)言切換也會(huì)導(dǎo)致加載的其它資源文件進(jìn)行切換

上述內(nèi)容大概可以分為以下幾塊:

  1. 獲取系統(tǒng)默認(rèn)的語(yǔ)言和地區(qū)(注意地區(qū)属韧,后面會(huì)講述這里的坑)
  2. 更改 App 的語(yǔ)言

Android 應(yīng)用資源國(guó)際化

在正式開(kāi)始之前,先來(lái)講解一下 Android 應(yīng)用資源國(guó)際化的知識(shí)糠赦。對(duì)于資源文件的國(guó)際化拙泽,我們一般是在 Android src/main/res/ 目錄下,建立對(duì)應(yīng)語(yǔ)言文件夾泼疑,格式一般為:values-語(yǔ)言代號(hào)-地區(qū)代號(hào)荷荤,默認(rèn)的資源是不包含語(yǔ)言代號(hào)和地區(qū)代號(hào)的。一般情況下氓辣,應(yīng)用資源是沒(méi)有做任何適配的袱蚓,所以不管如何切換語(yǔ)言和地區(qū)設(shè)置喇潘,應(yīng)用顯示的資源都不會(huì)發(fā)生任何改變。

配置選項(xiàng)包括語(yǔ)言代號(hào)地區(qū)代號(hào)絮吵。表示中文和中國(guó)的配置選項(xiàng)是 zh-rCN(zh表示中文忱屑,CN表示中國(guó))。表示英文和美國(guó)的配置選項(xiàng)是 en-rUS(en表示英文伴嗡,US表示美國(guó))瘪校。同一語(yǔ)言代號(hào)可以有多個(gè)地區(qū)代號(hào)名段,用 r 表示區(qū)分。

常見(jiàn)的國(guó)際化資源表示形式:

中文(中國(guó)):values-zh-rCN

中文(臺(tái)灣):values-zh-rTW

中文(香港):values-zh-rHK

維吾爾文(中國(guó)):values-ug-rCN

英語(yǔ)(美國(guó)):values-en-rUS

英語(yǔ)(英國(guó)):values-en-rGB

英文(澳大利亞):values-en-rAU

英文(加拿大):values-en-rCA

英文(愛(ài)爾蘭):values-en-rIE

英文(印度):values-en-rIN

英文(新西蘭):values-en-rNZ

英文(新加坡):values-en-rSG

英文(南非):values-en-rZA

阿拉伯文(埃及):values-ar-rEG

阿拉伯文(以色列):values-ar-rIL

保加利亞文:  values-bg-rBG

加泰羅尼亞文:values-ca-rES

捷克文:values-cs-rCZ

丹麥文:values-da-rDK

德文(奧地利):values-de-rAT

德文(瑞士):values-de-rCH

德文(德國(guó)):values-de-rDE

德文(列支敦士登):values-de-rLI

希臘文:values-el-rGR

西班牙文(西班牙):values-es-rES

西班牙文(美國(guó)):values-es-rUS

芬蘭文(芬蘭):values-fi-rFI

法文(比利時(shí)):values-fr-rBE

法文(加拿大):values-fr-rCA

法文(瑞士):values-fr-rCH

法文(法國(guó)):values-fr-rFR

希伯來(lái)文:values-iw-rIL

印地文:values-hi-rIN

克羅里亞文:values-hr-rHR

匈牙利文:values-hu-rHU

印度尼西亞文:values-in-rID

意大利文(瑞士):values-it-rCH

意大利文(意大利):values-it-rIT

日文:values-ja-rJP

韓文:values-ko-rKR

立陶宛文:valueslt-rLT

拉脫維亞文:values-lv-rLV

挪威博克馬爾文:values-nb-rNO

荷蘭文(比利時(shí)):values-nl-BE

荷蘭文(荷蘭):values-nl-rNL

波蘭文:values-pl-rPL

葡萄牙文(巴西):values-pt-rBR

葡萄牙文(葡萄牙):values-pt-rPT

羅馬尼亞文:values-ro-rRO

俄文:values-ru-rRU

斯洛伐克文:values-sk-rSK

斯洛文尼亞文:values-sl-rSI

塞爾維亞文:values-sr-rRS

瑞典文:values-sv-rSE

泰文:values-th-rTH

塔加洛語(yǔ):values-tl-rPH

土耳其文:values–r-rTR

烏克蘭文:values-uk-rUA

越南文:values-vi-rVN

獲取系統(tǒng)默認(rèn)的語(yǔ)言和地區(qū)

總的來(lái)說(shuō),獲取語(yǔ)言和地區(qū)有三種方法:

  1. 通過(guò) Java 自帶的接口來(lái)實(shí)現(xiàn)窃蹋,即:

    Locale locale = Locale.getLocale();
    String language = locale.getLanguage();
    String country = locale.getCountry();
    
  2. 通過(guò) Configuration 來(lái)獲取

    //方法1,該方法已廢棄碎乃,如果在 API >= 17 的版本上使用 方法2
    Locale locale = context.getResources().getConfiguration().locale;
    //方法2惠奸,在 API >= 17 的版本上可以使用
    Locale locale = context.getResources().getConfiguration().getLocales().get(0);
    String language = locale.getLanguage();
    String country = locale.getCountry();
    

    其中佛南, context.getResources() 也可以用 Resources.getSystem() 來(lái)代替嵌言,前者獲取的是應(yīng)用內(nèi)部的語(yǔ)言和地區(qū)設(shè)置摧茴,后者獲取的是系統(tǒng)的語(yǔ)言地區(qū)設(shè)置,默認(rèn)情況下娃豹,前者跟隨系統(tǒng)設(shè)置购裙。

更改 App 的語(yǔ)言設(shè)置

通過(guò)上述分析,我們已經(jīng)知道怎么獲取系統(tǒng)和應(yīng)用的語(yǔ)言地區(qū)設(shè)置了躯畴。接下來(lái)薇芝,我們來(lái)講一下如何實(shí)現(xiàn) Android App 的多語(yǔ)言切換夯到。在前面我們已經(jīng)使用到了 Configuration ,這個(gè)類保存了 Android 應(yīng)用的所有設(shè)備信息峭状,詳見(jiàn) Configuration逼争。要實(shí)現(xiàn)應(yīng)用的多語(yǔ)言切換誓焦,我們所要做的就是更新 Configuration 中關(guān)于語(yǔ)言地區(qū)的屬性着帽。

Resources resources = context.getResources();
DisplayMetrics metrics = resources.getDisplayMetrics();
Configuration configuration = resources.getConfiguration();
//API >= 17 可以使用
configuration.setLocale(locale);
//該方法已經(jīng)廢棄仍翰,官方建議使用 Context.createConfigurationContext(Configuration)
resources.updateConfiguration(configuration, metrics);

資源目錄結(jié)構(gòu)大致如下:

│   └── res
│       ├── drawable
│       ├── drawable-xhdpi
│       │   └── icon_test.png
│       ├── drawable-zh-rCN-xhdpi//圖標(biāo)適配
│       │   └── icon_test.png
│       ├── layout
│       │   └── activity_main.xml
│       ├── mipmap-hdpi
│       │   └── ic_launcher.png
│       ├── mipmap-mdpi
│       │   └── ic_launcher.png
│       ├── mipmap-xhdpi
│       │   └── ic_launcher.png
│       ├── mipmap-xxhdpi
│       │   └── ic_launcher.png
│       ├── mipmap-xxxhdpi
│       │   └── ic_launcher.png
│       ├── values
│       │   ├── colors.xml
│       │   ├── strings.xml
│       │   └── styles.xml
│       ├── values-en-rWW
│       │   └── strings.xml
│       ├── values-ja-rJP
│       │   └── strings.xml
│       ├── values-ko-rKR
│       │   └── strings.xml
│       └── values-zh-rCN
│           └── strings.xml

重新加載資源

看到這里予借,你是不是覺(jué)得就結(jié)束了频蛔?不,當(dāng)然不是瀑粥,更新 Configuration 之后三圆,如果不重啟 Activity舟肉,應(yīng)用的資源就不會(huì)被重新加載。

Intent intent = new Intent(this, MainActivity.class);
//開(kāi)始新的activity同時(shí)移除之前所有的activity
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);

持久化存儲(chǔ)設(shè)置

經(jīng)過(guò)上述步驟割按,我們已經(jīng)可以看到應(yīng)用顯示的資源發(fā)生了改變磷籍,但是當(dāng)應(yīng)用被殺掉重啟后院领,之前所有的設(shè)置都已經(jīng)失效,應(yīng)用的語(yǔ)言地區(qū)又變成了系統(tǒng)默認(rèn)的丈氓,這是因?yàn)槲覀儗?duì)應(yīng)用所做的變更只是保存在內(nèi)存中强法,當(dāng)應(yīng)用被殺掉饮怯,在內(nèi)存中的數(shù)據(jù)也隨之被釋放,再次啟動(dòng)應(yīng)用的時(shí)候库倘,應(yīng)用讀取的是系統(tǒng)的 Configuration ,語(yǔ)言地區(qū)也隨之變成系統(tǒng)默認(rèn)的杆勇。

當(dāng)應(yīng)用需要保存用戶更改的操作饱亿,就需要對(duì)用戶的選擇進(jìn)行持久化路捧,并在應(yīng)用重啟的時(shí)候传黄,從配置中讀取并應(yīng)用該配置。

public class MyApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        //一般在 Application 的 onCreate() 方法中更新 Configuration
        LanguageUtil.changeAppLanguage(this, Locale.SIMPLIFIED_CHINESE, true);
    }
}

LanguageUtil.java

/**
* 更改應(yīng)用語(yǔ)言
*
* @param context
* @param locale 語(yǔ)言地區(qū)
* @param persistence 是否持久化
*/
public static void changeAppLanguage(Context context, Locale locale,
                                    boolean persistence) {
   Resources resources = context.getResources();
   DisplayMetrics metrics = resources.getDisplayMetrics();
   Configuration configuration = resources.getConfiguration();
   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
       configuration.setLocale(locale);
   } else {
       configuration.locale = locale;
   }
   resources.updateConfiguration(configuration, metrics);
   if (persistence) {
       saveLanguageSetting(context, locale);
   }
}

private static void saveLanguageSetting(Context context, Locale locale) {
   String name = context.getPackageName() + "_" + LANGUAGE;
   SharedPreferences preferences =
           context.getSharedPreferences(name, Context.MODE_PRIVATE);
   preferences.edit().putString(LANGUAGE, locale.getLanguage()).apply();
   preferences.edit().putString(COUNTRY, locale.getCountry()).apply();
}

這樣,Android 應(yīng)用內(nèi)多語(yǔ)言切換基本完工凡伊。接下來(lái)窒舟,分享一下我在多語(yǔ)言切換過(guò)程中遇到的坑。

多語(yǔ)言切換中遇到的坑

  1. 以靜態(tài)變量的方式银还,在 Application 初始化時(shí)初始化網(wǎng)絡(luò)請(qǐng)求錯(cuò)誤提示語(yǔ)蛹疯,然后再系統(tǒng)中切換語(yǔ)言后热监,網(wǎng)絡(luò)請(qǐng)求錯(cuò)誤提示語(yǔ)未更新。

    解決辦法:使用時(shí)直接通過(guò) getString() 方法獲取

  2. App 多語(yǔ)言切換設(shè)置持久化后列吼,在應(yīng)用啟動(dòng)時(shí)寞钥, Application 的 onCreate() 中也進(jìn)行了多語(yǔ)言切換盈简。然后去系統(tǒng)設(shè)置中切換語(yǔ)言太示,App 也會(huì)隨之跟隨系統(tǒng)語(yǔ)言类缤。

    原因:在我們改變系統(tǒng)的語(yǔ)言時(shí)邻吭,應(yīng)用的 Configuration 也隨之跟隨系統(tǒng)改變囱晴,而不是我們啟動(dòng)應(yīng)用時(shí)的設(shè)置了

    解決辦法:監(jiān)聽(tīng) Activity 的生命周期,在 Activty 的 onCreate() 中判斷應(yīng)用當(dāng)前的語(yǔ)言設(shè)置是否與用戶設(shè)置值相同驮瞧,否則強(qiáng)制更新應(yīng)用語(yǔ)言設(shè)置枯芬。因?yàn)椋?dāng)系統(tǒng)切換語(yǔ)言選項(xiàng)的時(shí)候狂魔,系統(tǒng)會(huì)重啟 Activity最楷,就如前文所說(shuō)待错,我們需要重啟 Activity 才能實(shí)現(xiàn)資源的重新加載一樣。這里也有兩種方案:

    1. 創(chuàng)建一個(gè)基類 BaseActivity 蚯撩,在其 onCreate() 方法中做處理
    2. 使用 ActivityLifecycleCallbacks 胎挎,在其回調(diào) onActivityCreated() 中做處理

    對(duì)比一下忆家,上述兩種方案,第一種只能針對(duì)繼承自 BaseActivity 的才有效揭芍,第二種則是監(jiān)聽(tīng)所以 Activity 的生命周期称杨。所以相對(duì)而言,第二種方案更好點(diǎn)悬而。

    //判斷是否與設(shè)定的語(yǔ)言相同.  
    public static boolean isSameWithSetting(Context context) {
       Locale current = context.getResources().getConfiguration().locale;
       return current.equals(getAppLocale(context));
    }
    
    public class App extends Application {
    
        @Override
        public void onCreate() {
            super.onCreate();
            LanguageUtil.init(this);
            //注冊(cè)Activity生命周期監(jiān)聽(tīng)回調(diào)
            registerActivityLifecycleCallbacks(callbacks);
        }
    
        ActivityLifecycleCallbacks callbacks = new ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
                //強(qiáng)制修改應(yīng)用語(yǔ)言
                if (!LanguageUtil.isSameWithSetting(activity)) {
                    LanguageUtil.changeAppLanguage(activity,
                            LanguageUtil.getAppLocale(activity));
                }
            }
            //Activity 其它生命周期的回調(diào)
        };
    }
    
  3. 對(duì)于在 AndroidManifest.xml 中配置 launchModesingleInstance 的 Activity笨奠,使用

    Intent intent = new Intent(this, MainActivity.class);
    //開(kāi)始新的activity同時(shí)移除之前所有的activity
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
    startActivity(intent);
    

    資源文件不更新唤殴。

    原因:launchModesingleInstance 的 Activity 與當(dāng)前應(yīng)用時(shí)不在同一個(gè) Task 棧

    解決方法:將 launchMode 改為其它模式或者殺掉應(yīng)用重新啟動(dòng)

  4. 資源文件夾為 values-zh-rCN時(shí)朵逝,將應(yīng)用 Locale 設(shè)置為 Locale.CHINESE 時(shí),找不到對(duì)應(yīng)的資源文件页响。

    原因:values-zh-rCN 對(duì)應(yīng)的 Locale 為 Locale.SIMPLIFIED_CHINESE

    解決辦法:將 Locale 設(shè)置為 Locale.SIMPLIFIED_CHINESE 或者將資源文件改為 values-zh
    這是踩得最慘的一個(gè)坑,浪費(fèi)了大量時(shí)間栈拖,所以才會(huì)有開(kāi)頭 Android 應(yīng)用資源國(guó)際化 那么一小節(jié)插曲涩哟。

  5. 這是在 華為 Nexus 6P 上測(cè)出來(lái)的一個(gè)問(wèn)題,6P 上多語(yǔ)言的選項(xiàng)有點(diǎn)詭異:簡(jiǎn)體中文(中文)潜腻、簡(jiǎn)體中文(香港)器仗、繁體中文(香港)精钮、簡(jiǎn)體中文(澳門)、繁體中文(臺(tái)灣)忽你、簡(jiǎn)體中文(新加坡)臂容,其中有幾個(gè)簡(jiǎn)體中文的選項(xiàng)在以前的 Android 版本中是沒(méi)有的,而且簡(jiǎn)體中文(香港)和繁體中文(香港)的語(yǔ)言地區(qū)都是"zh-HK"糟秘,后面在調(diào)試中發(fā)現(xiàn)蚌堵,Locale 對(duì)象中發(fā)現(xiàn)了 script 屬性,簡(jiǎn)體中文對(duì)應(yīng)Hans督赤,繁體中文對(duì)應(yīng)Hant泻蚊,其余語(yǔ)言默認(rèn)為空

    /**
    * 是否用中文
    *
    * @return true是中文
    */
    public static boolean isChinese() {
        String language = Locale.getDefault().getLanguage();
        boolean isZh = Locale.SIMPLIFIED_CHINESE.getLanguage().equals(language);
        //API 21以上性雄,在Nexus出現(xiàn)繁體中文(香港)和簡(jiǎn)體中文(香港)
        //通過(guò)Locale.getScript()區(qū)分
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
         String script = Locale.getDefault().getScript();
         //Hans表示簡(jiǎn)體中文秒旋,Hant表示繁體中文
         return isZh && "Hans".equals(script);
        } else {
         String country = Locale.getDefault().getCountry();
         return isZh && Locale.SIMPLIFIED_CHINESE.getCountry().equals(country);
        }
    }
    

代碼已上傳 Git,歡迎大家 Star 和 Fork煤蚌。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末尉桩,一起剝皮案震驚了整個(gè)濱河市贪庙,隨后出現(xiàn)的幾起案子止邮,更是在濱河造成了極大的恐慌,老刑警劉巖析恋,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件助隧,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡巍实,警方通過(guò)查閱死者的電腦和手機(jī)哩牍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門膝昆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)荚孵,“玉大人,你說(shuō)我怎么就攤上這事骄呼∨忻唬” “怎么了澄峰?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵摊阀,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng)跃捣,這世上最難降的妖魔是什么疚漆? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任娶聘,我火速辦了婚禮,結(jié)果婚禮上铆农,老公的妹妹穿的比我還像新娘墩剖。我一直安慰自己,他們只是感情好郊霎,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布书劝。 她就那樣靜靜地躺著土至,像睡著了一般。 火紅的嫁衣襯著肌膚如雪洞斯。 梳的紋絲不亂的頭發(fā)上烙如,一...
    開(kāi)封第一講書(shū)人閱讀 50,050評(píng)論 1 291
  • 那天亚铁,我揣著相機(jī)與錄音螟加,去河邊找鬼。 笑死然爆,一個(gè)胖子當(dāng)著我的面吹牛曾雕,可吹牛的內(nèi)容都是我干的助被。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼丰滑!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起哄芜,我...
    開(kāi)封第一講書(shū)人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤认臊,失蹤者是張志新(化名)和其女友劉穎锄奢,沒(méi)想到半個(gè)月后拘央,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拆又,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年帖族,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了挡爵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茶鹃。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡闭翩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出丈屹,到底是詐尸還是另有隱情伶棒,我是刑警寧澤肤无,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布宛渐,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏窥翩。R本人自食惡果不足惜业岁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望寇蚊。 院中可真熱鬧笔时,春花似錦、人聲如沸仗岸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)扒怖。三九已至较锡,卻和暖如春盗痒,著一層夾襖步出監(jiān)牢的瞬間蚂蕴,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工俯邓, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留骡楼,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓看成,卻偏偏與公主長(zhǎng)得像君编,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子川慌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,862評(píng)論 25 707
  • 這里的多語(yǔ)言切換專指應(yīng)用內(nèi)的多語(yǔ)言切換梦重,不涉及直接通過(guò)應(yīng)用修改系統(tǒng)語(yǔ)言設(shè)置的功能兑燥。比如微信里面的 我 -> 設(shè)置 ...
    apkcore閱讀 4,942評(píng)論 0 3
  • 引言 事情是這樣的,我們接到一個(gè)需求琴拧,是要為我們的應(yīng)用做多語(yǔ)言版本并且提供多語(yǔ)言切換降瞳。事后證明,這個(gè)事情還真的是很...
    luminos閱讀 4,935評(píng)論 2 6
  • 本文出自 “阿敏其人” 簡(jiǎn)書(shū)博客蚓胸,轉(zhuǎn)載或引用請(qǐng)注明出處挣饥。 前言: 我們知道,Android的國(guó)際化需要在value...
    阿敏其人閱讀 5,212評(píng)論 1 12
  • 也沒(méi)有什么好說(shuō)的沛膳,反正開(kāi)學(xué)嘛也已經(jīng)有兩個(gè)禮拜了扔枫。也不知道自己最近學(xué)得了多少?锹安?短荐?又懂得多少呢倚舀??忍宋? 時(shí)間在慢慢流逝...
    sayuuuuuu閱讀 122評(píng)論 0 0