摘要:國際化簡稱因為在和之間還有個字符,本地化,簡稱。一鍵國際化如果需要很多語言的時候,手動的切換很麻煩。二國際化實現實例配置資源文件,這個在前面已經講過了。
internationalization(國際化)簡稱 i18n,因為在i和n之間還有18個字符,localization(本地化),簡稱L10n。
一.原理:Android中實現國際化相對來說還是簡單的,因為Android有很獨特的資源管理方式。代碼可以不和資源發生關系,我們通常通過 R 文件提供的索引來間接的引用某一個資源。
把顯示的字符串都轉換成文件資源,再用代碼代碼提取,也就是把字符串存儲在對應的values目錄下。
二.實現步驟:國際化切換可以手動國際化,也可以一鍵國際化。
1.手動國際化
為支持多國語言,在res/中創建一個額外的values目錄以連字符和ISO國家代碼結尾命名,比如values-es/是為語言代碼為"es"的區域設置的簡單的資源文件的目錄。Android會在運行時根據設備的區域設置,加載相應的資源。
以中英文切換為例:
如果默認是中文就不用建立相應的values文件了,因為系統找不到對應的資源直接會走默認的。
(1).首先建立一個values資源文件values-en/放進對應的strings.xml。
添加不同區域語言的字符串值到相應的文件就可以了。
(2).UI顯示字符串用代碼提取:
生成對應的string文件不用每個都改,這樣很麻煩,教大家一個簡單方法如下:
這樣直接就生成了string.xml,直接去改相應的字符串就好了。
2.一鍵國際化
如果需要很多語言的時候,手動的切換很麻煩。這時需要用到Android Studio插件:AndroidLocalizationer,它可以實現一鍵國際化。
使用方法:
(1).下載AndroidLocalizationer插件
下載地址:
https://github.com/westlinkin...
(2).集成到Android studio中。
集成成功之后重啟。
(3).使用
根據你的需要來選擇對應的語言
結果如下:
附加:這個插件還是有些不穩定的地方,有的Android Studio版本是不支持此插件的。
二.國際化實現實例
1.配置資源文件,這個在前面已經講過了。
2.封裝一個ContextWrapper類
ContextWrapper構造函數中必須包含一個真正的Context引用,同時ContextWrapper中提供了attachBaseContext()用于給ContextWrapper對象中指定真正的Context對象,調用ContextWrapper的方法都會被轉向其所包含的真正的Context對象。
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實現
@Override protected void attachBaseContext(Context newBase) { //Public.Language 為 對應的資源格式后綴,比如"zh" " super.attachBaseContext(MyContextWrapper.wrap(newBase, Public.Language)); }
如果想要整個APP都實現國際化,直接把attachBaseContext寫在封裝好的BaseActivity里。
4.調用
//動態改變后綴名,可以存在本地數據中,方法比較多就不細說了。Public.Language="zh"; recreate();
其中recreate();是Android3.0以后引入的。
希望大家支持下我的公眾號:文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/67792.html
摘要:本國際化方案僅針對技術棧,且不會涉及服務端國際化內容。引入多語言環境的數據雖然我只用到了文本翻譯的功能,以為就不需要加載這些數據,但后來發現這是必須的步驟。 前言 最近新接了一個項目,從0開始做,需要做多語言的國際化,今天搞了一下,基本達到了想要的效果, 在這里簡單分享下: showImg(https://segmentfault.com/img/bVbuiJB); 背景國際化方案國際...
摘要:本國際化方案僅針對技術棧,且不會涉及服務端國際化內容。引入多語言環境的數據雖然我只用到了文本翻譯的功能,以為就不需要加載這些數據,但后來發現這是必須的步驟。 前言 最近新接了一個項目,從0開始做,需要做多語言的國際化,今天搞了一下,基本達到了想要的效果, 在這里簡單分享下: showImg(https://segmentfault.com/img/bVbuiJB); 背景國際化方案國際...
摘要:如果對您有幫助請動動鼠標右下方給我來個贊,您的支持是我最大的動力。安裝 npm install vue-i18n 新建一個文件夾 i18n ,內新建 en.js zh.js index.js 三個文件 準備翻譯信息 en.js export default { home: { helloworld: hello workd ! } }; zh.js export d...
閱讀 689·2023-04-25 19:53
閱讀 4262·2021-09-22 15:13
閱讀 2565·2019-08-30 10:56
閱讀 1320·2019-08-29 16:27
閱讀 2932·2019-08-29 14:00
閱讀 2407·2019-08-26 13:56
閱讀 426·2019-08-26 13:29
閱讀 1611·2019-08-26 11:31