Android 语言国际化

安卓中,国际化十分简单。 其实就是文件夹的问题。一般我们分两种情况。

一是app根据系统语言调用对应的资源文件夹,
二是在app里面根据用户的需求来更改语言。

前者比较简单,只需求创建对应国家的strings.xml,然后发在对应的文件夹里面就可以了。

app会根据系统语言选择对应的文件夹资源。(图片资源的国际化也是一样的)

一、语言国际化:

1、创建文件:

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

2、在相应的文件中写上对应的语言

strings.xml (默认英文)

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name"> Alipay</string>
    <string name="device"> device</string>
    <string name="add"> add</string>
</resources>

strings.xml(en)

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">Alipay</string>
    <string name="device"> device</string>
    <string name="add"> add</string>
</resources>

strings.xml(zh-rCN)

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name"> 支付宝</string>
    <string name="device"> 设备</string>
    <string name="add"> 添加</string>
</resources>

**1、自动跟随系统:字符串资源的调用 **

参考:[Android]调用字符串资源的几种方法
android Java代码中引用字符资源

在 Layout XML 调用字符串资源:

<TextView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/hello" />

在 Activity 获取字符串资源:

this.getString(R.string.hello)

从 Context 获取字符串资源:

context.getString(R.string.hello)

从 Application 获取字符串资源:

application.getString(R.string.hello)

二、手动切换:

参考:android 多语言设置

/**
* 切换英文
*/
public void en(View v){
Resources resources = getResources();// 获得res资源对象
Configuration config = resources.getConfiguration();// 获得设置对象
DisplayMetrics dm = resources.getDisplayMetrics();// 获得屏幕参数:主要是分辨率,像素等。
config.locale = Locale.ENGLISH; // 英文
resources.updateConfiguration(config, dm);
finish();//如果不重启当前界面,是不会立马修改的
startActivity(new Intent(this,MainActivity.class));
}

/**
* 切换中文
*/
public void cn(View v){
Resources resources = getResources();// 获得res资源对象
Configuration config = resources.getConfiguration();// 获得设置对象
DisplayMetrics dm = resources.getDisplayMetrics();// 获得屏幕参数:主要是分辨率,像素等。
config.locale = Locale.CHINA; // 简体中文
resources.updateConfiguration(config, dm);
finish();如果不重启当前界面,是不会立马修改的
startActivity(new Intent(this,MainActivity.class));
}

额外:

Context类中:

    public final String getString(int resId) {
        return getResources().getString(resId);
    }

java引用字符资源的方法,都是getString(),内部调用了getResources().getString(R.string.xx)的方法,为什么不是直接使用R.string.xx呢?

尝试了一下setText(R.string.xx)的方法,也能获取到正确的字符串值,但是如果是setText(R.string.xx + “个”),就会出现字符就会变成一串数字。

原因在于setText()方法有有两种不同的参数int resid和CharSequence text,而R.string.xx是一个自动生成的资源ID,setText(R.string.xx + “个”)就会先将资源ID转成字符串,从而出现一串数字的情况。

二、获取系统语言:

参考:Android开发国际化

Locale locales1 = newConfig.getLocales().get(0);
String language1 = locales1.getLanguage() + "-" + locales1.getCountry();
Log.e(TAG, "onConfigurationChanged: language1===========" + language1);

Locale locale2;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    locale2 = getResources().getConfiguration().getLocales().get(0);
} else {
    locale2 = getResources().getConfiguration().locale;
}
String language2 = locale2.getLanguage() + "-" + locale2.getCountry();
Log.e(TAG, "onConfigurationChanged: language2===========" + language2);

//返回此Java虚拟机实例的默认区域设置
Locale locale3 = Locale.getDefault();
String language3 = locale3.getLanguage() + "-" + locale3.getCountry();
Log.e(TAG, "onConfigurationChanged: language3===========" + language3);

//获取用户实际设置的语言列表
//LocaleList是Locales的一个不可变列表,通常用于保持语言环境的用户首选项的有序列表。
Locale locale4 = LocaleList.getDefault().get(0);
String language4 = locale4.getLanguage() + "-" + locale4.getCountry();
Log.e(TAG, "onConfigurationChanged: language4===========" + language4);
if (locale4.getLanguage().equals("zh")) {
    //中文
} else {
    //英文
}
Locale locale = getResources().getConfiguration().locale;
String country = locale.getCountry();//区域
String language = locale.getLanguage();//语种

Log.e("111", "====country===" + country);//区域
Log.e("111", "====language===" + language); //语种

//简体中文           ====country===CN    ====language===zh
//繁体中文(澳门)    ====country===MO    ====language===zh
//繁体中文(台湾)    ====country===TW    ====language===zh
//繁体中文(香港)    ====country===HK    ====language===zh

//英文(香港)       ====country===HK    ====language===en
//英文(美国)       ====country===US    ====language===en
//英文(加拿大)     ====country===CA    ====language===en
//英文(英国)       ====country===GB    ====language===en

一般的语言包:values-语种-地区

中文(中国):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
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Android中,国际化语言动态切换是指在应用程序运行时根据用户的语言设置来自动切换应用程序的界面语言。 首先,为了实现国际化语言动态切换,需要在应用程序的资源文件中创建不同的语言文件夹。这些文件夹的命名需要遵循特定的规则,例如"values"代表默认语言,"values-en"代表英语,"values-zh"代表中文等等。在这些文件夹中,需要创建相同的资源文件,但是每个文件夹中的资源文件都应该使用相应语言进行翻译。 其次,在应用程序的代码中,可以使用系统提供的Locale类来获取用户的语言设置。通过获取到的语言设置,可以动态地加载相应的语言资源文件。一种常见的做法是使用Resource对象的updateConfiguration()方法来更新应用程序的语言配置。 最后,在界面的各个地方,需要使用相应的字符串资源代替硬编码的字符串。这样,在应用程序切换语言时,界面上显示的字符串就会自动切换为相应语言的翻译。 需要注意的是,为了能够支持动态切换语言,应用程序在启动时应该自动根据用户的语言设置来加载对应的语言资源文件。此外,切换语言后,应该重新加载当前的界面以应用新的语言设置。 总之,Android国际化语言动态切换可以帮助开发者为不同语言环境的用户提供更好的用户体验。通过适当配置资源文件和使用适当的API,开发者可以实现应用程序在运行时根据用户的语言设置来自动切换语言
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值