Android自适应国际化语言
轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://write.blog.csdn.net/mdeditor#!postId=52606459 文章出自:薛瑄的博客
你也可以查看我的其他同類文章,也會(huì)讓你有一定的收貨
前言
internationalization (國際化)簡稱 i18n,因?yàn)樵趇和n之間還有18個(gè)字符,localization(本地化 ),簡稱L10n。
一般用語言_地區(qū)的形式表示一種語言,如 zh_CN, zh_TW.
各國語言縮寫 http://www.loc.gov/standards/iso639-2/php/code_list.php
國家和地區(qū)簡寫 https://www.iso.org/obp/ui/#search
官方文檔的這個(gè)地址已經(jīng)失效 http://www.iso.org/iso/en/prods-services/iso3166ma/02iso-3166-code-lists/list-en1.html
國家_地區(qū)語言速查表:http://www.cnblogs.com/Mien/archive/2008/08/22/1273950.html
一鍵實(shí)現(xiàn)語言國際化
在使用這個(gè)插件的使用遇到任何問題,可以在github上,或者本博客進(jìn)行提問。我會(huì)第一時(shí)間幫你解決
我們要裝的插件是:AndroidLocalizationer,從github上down后,把下好的zip包解壓,里面有個(gè)同名的壓縮包就是我們的插件包,集成到studio里面就好了,看圖:
這樣我們就把插件集成好了。然后找到string.xml——>右鍵——>
這時(shí)我們就可以勾選自己要實(shí)現(xiàn)的國家的語言了。(這幾十種語言應(yīng)該涵蓋了所有的吧,猜的)
然后我們就來看下成果
看見這幾面旗子是不是感覺很開心啊,然后我們來看下strings.xml的內(nèi)容,果然不負(fù)我望:
strings.xml
<resources><string name="app_name">MyZhihuapp</string><string name="hello_world">Hello world!</string><string name="action_settings">Settings</string><string name="file_path">multidownload</string><string name="image_data">imageData</string> </resources>再看下values-ja (小日本鬼子的 ) strings.xml
<resources><string name="app_name">MyZhihuapp</string><string name="hello_world">ハローワールド!</string><string name="action_settings">設(shè)定</string><string name="file_path">multidownload</string><string name="image_data">imagedata を扱う</string> </resources>接下來看下values-ko(韓國絆子的)strings.xml
<string name="app_name">MyZhihuapp</string> <string name="hello_world">? ?? ??? ?????!</string> <string name="action_settings">??</string> <string name="file_path">multidownload</string> <string name="image_data">imageData</string>個(gè)人感覺唯一不足的就是:我們改了values/string.xml里面的內(nèi)容其他語言國際化語言不會(huì)自動(dòng)重新編譯(或clean重新編譯),要是這樣都實(shí)現(xiàn)了就更完美了
國際化
為支持多國語言,在res/中創(chuàng)建一個(gè)額外的values目錄以連字符和ISO國家代碼結(jié)尾命名,比如values-es/是為語言代碼為”es”的資源文件的目錄。Android會(huì)在運(yùn)行時(shí)根據(jù)設(shè)備的區(qū)域設(shè)置,加載相應(yīng)的資源。詳見Providing Alternative Resources
自適應(yīng)的知識(shí)與編程無關(guān),關(guān)鍵在于配置文件的修改。自適應(yīng)的內(nèi)容包括:語言、屏幕、平臺(tái)。今天就來說一下如何自適應(yīng)國際化言。
internationalization (國際化)簡稱:i18n,因?yàn)樵趇和n之間還有18個(gè)字符。同理,localization(本地化 ),簡稱L10n。
操作方法:
為了支持國際化語言,我們只要在res/目錄下在新建文件夾為:values-語言代號(hào)-地區(qū)代號(hào)。如values-zh-rCN表示簡體中文,values-zh-rTW表示繁體等。
注:配置選項(xiàng)包括語言代號(hào)、地區(qū)代號(hào)。表示中文和中國的配置選項(xiàng)是 zh-rCN(zh表示中文,CN表示中國)。 表示英文和美國的配置選項(xiàng)是en-rUS(en表示英文,US表示美國)。前面的r是必須的。
有的博客,在介紹國際化時(shí),并沒有給出地區(qū)代碼,例如:values-jp表示日語。那地區(qū)代碼到底有什么作用呢?難道是根據(jù)不同的地區(qū)自動(dòng)切換語言??知道的同學(xué),指點(diǎn)我一下
舉例:支持中文簡體的國際化
現(xiàn)在新建一個(gè)Android工程Android_i18n,默認(rèn)在res/values/strings.xml中的代碼如下:
<?xml version="1.0" encoding="utf-8"?><resources><string name="app_name">" Android_i18n"</string><string name="hello_world">Hello world!</string><string name="action_settings">Settings</string></resources>不做任何修改,直接在手機(jī)上運(yùn)行程序,默認(rèn)的效果如下:
聲明:我的手機(jī)默認(rèn)的語言是設(shè)置為中文的:
其實(shí)無論手機(jī)設(shè)置成什么語言,運(yùn)行的效果都是一樣的,因?yàn)槲覀冞€沒有進(jìn)行國際化設(shè)置。所以程序沒有別的選擇,只能顯示res/values/strings.xml中的信息。那現(xiàn)在開始來設(shè)置吧。
現(xiàn)在來加一個(gè)中文簡體的國際化:在res/目錄下新建一個(gè)文件夾代表中文簡體:values-zh-rCN,目錄結(jié)構(gòu)如下圖所示:
注:如果想再加一個(gè)英語的國際化,新建的文件夾為values-en-rUS,并使用相應(yīng)的strings.xml文件。
修改res/values-zh-rCN/strings.xml的代碼,如下:
<?xml version="1.0" encoding="utf-8"?> <resources><string name="app_name">" 安卓國際化"</string><string name="hello_world">你好,世界</string><string name="action_settings">設(shè)置</string></resources>此時(shí)運(yùn)行程序,效果如下:
常見問題:
問題一:
現(xiàn)在我并沒有添加繁體中文的對(duì)應(yīng)的資源,如果我將手機(jī)的語言設(shè)置為繁體中文,運(yùn)行程序會(huì)是什么現(xiàn)象呢?
答案:如果沒有定義繁體中文的資源,那默認(rèn)加載的就是res/values/目錄下的資源。
問題二:
現(xiàn)在定義一個(gè)字符串,只在res/values-zh-rCN/下定義,而不在res/values/定義,運(yùn)行程序會(huì)是什么現(xiàn)象呢?
答案:
現(xiàn)在我們?cè)赼ctivity_main.xml中添加一個(gè)按鈕:
<Button android:layout_width="match_parent"android:layout_height="wrap_content"android:text="@string/login_button"/>第04行代碼:按鈕顯示的名字引用了字符串login_button
此時(shí),讓res/values/strings.xml的代碼保持不變:
<?xml version="1.0" encoding="utf-8"?> <resources><string name="app_name">" Android_i18n"</string><string name="hello_world">Hello world!</string><string name="action_settings">Settings</string></resources>在res/values-zh-rCN/strings.xml中加一行l(wèi)ogin_button的聲明:(第07行代碼)
<?xml version="1.0" encoding="utf-8"?> <resources><string name="app_name">" 安卓國際化"</string><string name="hello_world">你好,世界</string><string name="action_settings">設(shè)置</string><string name="login_button">登陸按鈕</string></resources>效果:
activity_main.xml的視圖如下:
運(yùn)行程序,如果手機(jī)的語言設(shè)置為英文,效果如下:(非正常顯示)
如果手機(jī)的語言設(shè)置為中文,效果如下:(能正常顯示)
圖片資源的國際化:
另外,我們不僅可以做字符資源的國際化,我們同樣可以做圖片資源的國際化。操作如下:
(1)在res/目錄下新建一個(gè)文件夾代表中文簡體的圖片資源:drawable-zh-rCN。同理,在res/目錄下新建一個(gè)文件夾代表日本的圖片資源:drawable-jp。然后在這兩個(gè)文件夾中放入不同的圖片,但是要保證圖片的文件名是一樣的。
(2)于是,當(dāng)我們?cè)诓季治募型ㄟ^R.drawable.ResId來引用圖片的時(shí)候,就可以保證在不同的語言環(huán)境下,加載不同國家的圖片。
國家_地區(qū)的語言縮寫代碼:
中文(中國):values-zh-rCN
中文(臺(tái)灣):values-zh-rTW
中文(香港):values-zh-rHK
英語(美國):values-en-rUS
英語(英國):values-en-rGB
英文(澳大利亞):values-en-rAU
英文(加拿大):values-en-rCA
英文(愛爾蘭):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
德文(德國):values-de-rDE
德文(列支敦士登):values-de-rLI
希臘文:values-el-rGR
西班牙文(西班牙):values-es-rES
西班牙文(美國):values-es-rUS
芬蘭文(芬蘭):values-fi-rFI
法文(比利時(shí)):values-fr-rBE
法文(加拿大):values-fr-rCA
法文(瑞士):values-fr-rCH
法文(法國):values-fr-rFR
希伯來文: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
塔加洛語:values-tl-rPH
土耳其文:values–r-rTR
烏克蘭文:values-uk-rUA
越南文:values-vi-rVN
通過程序獲取JAVA所有支持的語言和國家的
程序代碼如下:
import java.util.Locale; public class Test {public static void main(String[] args) {//調(diào)用Locale類的getAvailableLocales方法獲取,該方法返回一個(gè)數(shù)組,其中包含JAVA支持的語言和國家Locale[] localeList = Locale.getAvailableLocales();//依次獲取所支持的國家和語言for (int i = 0; i < localeList.length; i++) {System.out.println(localeList[i].getDisplayCountry() + "="+ localeList[i].getCountry() + ""+ localeList[i].getDisplayLanguage() + "="+ localeList[i].getLanguage());}} }輸出結(jié)果如下(有些國家可能會(huì)使用多種語言):
馬來西亞=MY馬來文=ms 卡塔爾=QA阿拉伯文=ar 冰島=IS冰島文=is 芬蘭=FI芬蘭文=fi =波蘭文=pl 馬耳他=MT英文=en 瑞士=CH意大利文=it 比利時(shí)=BE荷蘭文=nl 沙特阿拉伯=SA阿拉伯文=ar 伊拉克=IQ阿拉伯文=ar 波多黎哥=PR西班牙文=es 智利=CL西班牙文=es =芬蘭文=fi 奧地利=AT德文=de =丹麥文=da 英國=GB英文=en 巴拿馬=PA西班牙文=es =塞爾維亞文=sr 也門=YE阿拉伯文=ar 馬其頓王國=MK馬其頓文=mk =馬其頓文=mk 加拿大=CA英文=en 越南=VN越南文=vi 荷蘭=NL荷蘭文=nl 美國=US西班牙文=es 中國=CN中文=zh 洪都拉斯=HN西班牙文=es 美國=US英文=en =法文=fr =泰文=th =阿拉伯文=ar 摩洛哥=MA阿拉伯文=ar =拉托維亞文(列托)=lv =德文=de 印度尼西亞=ID印度尼西亞文=in =克羅地亞文=hr 南非=ZA英文=en 韓國=KR朝鮮文=ko 突尼斯=TN阿拉伯文=ar =印度尼西亞文=in =日文=ja 塞爾維亞=RS塞爾維亞文=sr 白俄羅斯=BY白俄羅斯文=be 臺(tái)灣地區(qū)=TW中文=zh 蘇丹=SD阿拉伯文=ar =葡萄牙文=pt =冰島文=is 日本=JP日文=ja 玻利維亞=BO西班牙文=es 阿爾及利亞=DZ阿拉伯文=ar =馬來文=ms 阿根廷=AR西班牙文=es 阿拉伯聯(lián)合酋長國=AE阿拉伯文=ar 加拿大=CA法文=fr =斯洛文尼亞文=sl =西班牙文=es 立陶宛=LT立陶宛文=lt 黑山=ME塞爾維亞文=sr 敘利亞=SY阿拉伯文=ar 俄羅斯=RU俄文=ru 比利時(shí)=BE法文=fr 西班牙=ES西班牙文=es =保加利亞文=bg 以色列=IL希伯來文=iw =瑞典文=sv =英文=en =希伯來文=iw 丹麥=DK丹麥文=da 哥斯達(dá)黎加=CR西班牙文=es 香港=HK中文=zh =中文=zh 西班牙=ES加泰羅尼亞文=ca 泰國=TH泰文=th 烏克蘭=UA烏克蘭文=uk 多米尼加共和國=DO西班牙文=es 委內(nèi)瑞拉=VE西班牙文=es 波蘭=PL波蘭文=pl 利比亞=LY阿拉伯文=ar 約旦=JO阿拉伯文=ar =意大利文=it =烏克蘭文=uk 匈牙利=HU匈牙利文=hu =愛爾蘭文=ga 危地馬拉=GT西班牙文=es 巴拉圭=PY西班牙文=es 保加利亞=BG保加利亞文=bg 克羅地亞=HR克羅地亞文=hr 波斯尼亞和黑山共和國=BA塞爾維亞文=sr 羅馬尼亞=RO羅馬尼亞文=ro 盧森堡=LU法文=fr =挪威文=no =立陶宛文=lt 新加坡=SG英文=en 厄瓜多爾=EC西班牙文=es 波斯尼亞和黑山共和國=BA塞爾維亞文=sr 尼加拉瓜=NI西班牙文=es =斯洛伐克文=sk =俄文=ru =馬耳他文=mt 薩爾瓦多=SV西班牙文=es =荷蘭文=nl 印度=IN印地文=hi =愛沙尼亞文=et 希臘=GR希臘文=el 斯洛文尼亞=SI斯洛文尼亞文=sl 意大利=IT意大利文=it 日本=JP日文=ja 盧森堡=LU德文=de 瑞士=CH法文=fr 馬耳他=MT馬耳他文=mt 巴林=BH阿拉伯文=ar =阿爾巴尼亞文=sq =越南文=vi 黑山=ME塞爾維亞文=sr 巴西=BR葡萄牙文=pt 挪威=NO挪威文=no =希臘文=el 瑞士=CH德文=de 新加坡=SG中文=zh 科威特=KW阿拉伯文=ar 埃及=EG阿拉伯文=ar 愛爾蘭=IE愛爾蘭文=ga 秘魯=PE西班牙文=es 捷克共和國=CZ捷克文=cs 土耳其=TR土耳其文=tr =捷克文=cs 烏拉圭=UY西班牙文=es 愛爾蘭=IE英文=en 印度=IN英文=en 阿曼=OM阿拉伯文=ar 塞爾維亞及黑山=CS塞爾維亞文=sr =加泰羅尼亞文=ca =白俄羅斯文=be =塞爾維亞文=sr =朝鮮文=ko 阿爾巴尼亞=AL阿爾巴尼亞文=sq 葡萄牙=PT葡萄牙文=pt 拉脫維亞=LV拉托維亞文(列托)=lv 塞爾維亞=RS塞爾維亞文=sr 斯洛伐克=SK斯洛伐克文=sk 墨西哥=MX西班牙文=es 澳大利亞=AU英文=en 挪威=NO挪威文=no 新西蘭=NZ英文=en 瑞典=SE瑞典文=sv =羅馬尼亞文=ro 黎巴嫩=LB阿拉伯文=ar 德國=DE德文=de 泰國=TH泰文=th =土耳其文=tr 哥倫比亞=CO西班牙文=es 菲律賓=PH英文=en 愛沙尼亞=EE愛沙尼亞文=et 塞浦路斯=CY希臘文=el =匈牙利文=hu 法國=FR法文=fr參考:
Android學(xué)習(xí)—-自適應(yīng)國際化語言
Android Studio一鍵生成快速開發(fā)實(shí)現(xiàn)語言國際化
有關(guān)Android國際化的一點(diǎn)積累
關(guān)注我的公眾號(hào),輕松了解和學(xué)習(xí)更多技術(shù)
總結(jié)
以上是生活随笔為你收集整理的Android自适应国际化语言的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Protues闪退解决办法
- 下一篇: Snake算法