Android自适应国际化语言

转载请标明出处:http://write.blog.csdn.net/mdeditor#!postId=52606459 文章出自:薛瑄的博客

你也可以查看我的其他同类文章,也会让你有一定的收货

前言

internationalization (国际化)简称 i18n,因为在i和n之间还有18个字符,localization(本地化 ),简称L10n。

一般用语言_地区的形式表示一种语言,如 zh_CN, zh_TW.

各国语言缩写 http://www.loc.gov/standards/iso639-2/php/code_list.php

国家和地区简写 https://www.iso.org/obp/ui/#search

官方文档的这个地址已经失效 http://www.iso.org/iso/en/prods-services/iso3166ma/02iso-3166-code-lists/list-en1.html

国家_地区语言速查表:http://www.cnblogs.com/Mien/archive/2008/08/22/1273950.html

一键实现语言国际化

在使用这个插件的使用遇到任何问题,可以在github上,或者本博客进行提问。我会第一时间帮你解决

我们要装的插件是:AndroidLocalizationer,从github上down后,把下好的zip包解压,里面有个同名的压缩包就是我们的插件包,集成到studio里面就好了,看图:

这里写图片描述

这样我们就把插件集成好了。然后找到string.xml——>右键——>

这里写图片描述

这时我们就可以勾选自己要实现的国家的语言了。(这几十种语言应该涵盖了所有的吧,猜的)

这里写图片描述

然后我们就来看下成果

这里写图片描述

看见这几面旗子是不是感觉很开心啊,然后我们来看下strings.xml的内容,果然不负我望:

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">設定</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>

个人感觉唯一不足的就是:我们改了values/string.xml里面的内容其他语言国际化语言不会自动重新编译(或clean重新编译),要是这样都实现了就更完美了

国际化

为支持多国语言,在res/中创建一个额外的values目录以连字符和ISO国家代码结尾命名,比如values-es/是为语言代码为”es”的资源文件的目录。Android会在运行时根据设备的区域设置,加载相应的资源。详见Providing Alternative Resources

自适应的知识与编程无关,关键在于配置文件的修改。自适应的内容包括:语言、屏幕、平台。今天就来说一下如何自适应国际化言。

internationalization (国际化)简称:i18n,因为在i和n之间还有18个字符。同理,localization(本地化 ),简称L10n。

操作方法:

为了支持国际化语言,我们只要在res/目录下在新建文件夹为:values-语言代号-地区代号。如values-zh-rCN表示简体中文,values-zh-rTW表示繁体等。

注:配置选项包括语言代号、地区代号。表示中文和中国的配置选项是 zh-rCN(zh表示中文,CN表示中国)。 表示英文和美国的配置选项是en-rUS(en表示英文,US表示美国)。前面的r是必须的。

有的博客,在介绍国际化时,并没有给出地区代码,例如:values-jp表示日语。那地区代码到底有什么作用呢?难道是根据不同的地区自动切换语言??知道的同学,指点我一下

举例:支持中文简体的国际化

现在新建一个Android工程Android_i18n,默认在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/strings.xml中的信息。那现在开始来设置吧。

现在来加一个中文简体的国际化:在res/目录下新建一个文件夹代表中文简体:values-zh-rCN,目录结构如下图所示:

这里写图片描述

注:如果想再加一个英语的国际化,新建的文件夹为values-en-rUS,并使用相应的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">设置</string>

</resources>

此时运行程序,效果如下:

这里写图片描述

常见问题:

问题一:

现在我并没有添加繁体中文的对应的资源,如果我将手机的语言设置为繁体中文,运行程序会是什么现象呢?

答案:如果没有定义繁体中文的资源,那默认加载的就是res/values/目录下的资源。

问题二:

现在定义一个字符串,只在res/values-zh-rCN/下定义,而不在res/values/定义,运行程序会是什么现象呢?

答案:

现在我们在activity_main.xml中添加一个按钮:

<Button 
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:text="@string/login_button"/>

第04行代码:按钮显示的名字引用了字符串login_button

此时,让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中加一行login_button的声明:(第07行代码)

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="app_name">" 安卓国际化"</string>
    <string name="hello_world">你好,世界</string>
    <string name="action_settings">设置</string>
    <string name="login_button">登陆按钮</string>

</resources>

效果:

activity_main.xml的视图如下:

这里写图片描述

运行程序,如果手机的语言设置为英文,效果如下:(非正常显示)
这里写图片描述

如果手机的语言设置为中文,效果如下:(能正常显示)
这里写图片描述

图片资源的国际化:

另外,我们不仅可以做字符资源的国际化,我们同样可以做图片资源的国际化。操作如下:

(1)在res/目录下新建一个文件夹代表中文简体的图片资源:drawable-zh-rCN。同理,在res/目录下新建一个文件夹代表日本的图片资源:drawable-jp。然后在这两个文件夹中放入不同的图片,但是要保证图片的文件名是一样的。

(2)于是,当我们在布局文件中通过R.drawable.ResId来引用图片的时候,就可以保证在不同的语言环境下,加载不同国家的图片。

国家_地区的语言缩写代码:

中文(中国):values-zh-rCN
中文(台湾):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
法文(比利时):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
荷兰文(比利时):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) {
  //调用Locale类的getAvailableLocales方法获取,该方法返回一个数组,其中包含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());
  }
 }
}

输出结果如下(有些国家可能会使用多种语言):

马来西亚=MY马来文=ms
卡塔尔=QA阿拉伯文=ar
冰岛=IS冰岛文=is
芬兰=FI芬兰文=fi
=波兰文=pl
马耳他=MT英文=en
瑞士=CH意大利文=it
比利时=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
台湾地区=TW中文=zh
苏丹=SD阿拉伯文=ar
=葡萄牙文=pt
=冰岛文=is
日本=JP日文=ja
玻利维亚=BO西班牙文=es
阿尔及利亚=DZ阿拉伯文=ar
=马来文=ms
阿根廷=AR西班牙文=es
阿拉伯联合酋长国=AE阿拉伯文=ar
加拿大=CA法文=fr
=斯洛文尼亚文=sl
=西班牙文=es
立陶宛=LT立陶宛文=lt
黑山=ME塞尔维亚文=sr
叙利亚=SY阿拉伯文=ar
俄罗斯=RU俄文=ru
比利时=BE法文=fr
西班牙=ES西班牙文=es
=保加利亚文=bg
以色列=IL希伯来文=iw
=瑞典文=sv
=英文=en
=希伯来文=iw
丹麦=DK丹麦文=da
哥斯达黎加=CR西班牙文=es
香港=HK中文=zh
=中文=zh
西班牙=ES加泰罗尼亚文=ca
泰国=TH泰文=th
乌克兰=UA乌克兰文=uk
多米尼加共和国=DO西班牙文=es
委内瑞拉=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学习—-自适应国际化语言

Android Studio一键生成快速开发实现语言国际化

有关Android国际化的一点积累

关注我的公众号,轻松了解和学习更多技术
这里写图片描述

©️2020 CSDN 皮肤主题: 撸撸猫 设计师:设计师小姐姐 返回首页