2018-11-11 13:59:08 ifu25 阅读数 180

大家都知道 android 支持多语言的方式是在资源文件中根据语言配置不同的资源,如strings.xml可以配置zhen等来支持不同的语言,然后 android 会根据手机系统的语言自动调用不同的资源。
然而有时我们需要在不改变手机系统语言设置的情况下动态切换 app 的语言。

动态切换应用运行时语言

  //设置应用语言类型
 Configuration config = res.getConfiguration();
 DisplayMetrics dm = res.getDisplayMetrics();
 if (lang.equals("zh")) {
     config.locale = Locale.SIMPLIFIED_CHINESE;
 } else {
     config.locale = Locale.ENGLISH;
 }
 res.updateConfiguration(config, dm);

github 演示:https://github.com/ifu25/AndroidMultiLangDemo
多语言切换

2019-08-04 21:28:35 jklwan 阅读数 119

如果Android应用需要做本地化,都要用到多语言来适配,例如手机设置成英文后,App内文字变成英文。

App提供资源可以参考官方文档https://developer.android.com/guide/topics/resources/providing-resources#AlternativeResources,App提供各种适配的资源,包括但不限定于:语言和区域,屏幕尺寸,屏幕像素密度。做多语言功能,提供values资源即可。例如中文:values-zh;中文简体:values-zh-rCH;中文繁体:values-zh-rTW;App查找资源可以参考文档https://developer.android.com/guide/topics/resources/providing-resources#BestMatch,而对于语言的资源匹配可以参考这个https://developer.android.com/guide/topics/resources/multilingual-support,7.0之前和之后有些许区别。

这样设置基本实现了多语言,但是如果需要App内切换语言的功能的话需要设计应用内切换语言的代码。主要代码是更新Application和Activity的Resources的语言设置,在Application中的onCreate中更新Resources,在Activity中则需要在attachBaseContext中进行操作,在7.0之后有些许变化,

7.0之前只更新Resources即可,代码如下

    private void setConfiguration(Context context) {
        Resources resources = context.getResources();
        Locale targetLocale = getLocale();
        Configuration configuration = resources.getConfiguration();
        configuration.locale = targetLocale;
        resources.updateConfiguration(configuration, resources.getDisplayMetrics());//语言更换生效的代码!
    }

7.0之后需要使用createConfigurationContext新建一个Context返回,代码如下

    private Context updateResources(Context context) {
        Resources resources = context.getResources();
        Locale locale = getLocale();
        Configuration configuration = resources.getConfiguration();
        configuration.setLocale(locale);
        return context.createConfigurationContext(configuration);
    }

getLocale就是获取当前选择的语言。如果是跟随系统则需要获取系统设置的语言,代码如下

    private static Locale getSystemLocale() {
        Locale locale;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //7.0有多语言设置获取顶部的语言
            locale = Resources.getSystem().getConfiguration().getLocales().get(0);
        } else {
            locale = Resources.getSystem().getConfiguration().locale;
        }
        return locale;
    }

每次选择后需要重建Activity,并更新Application的Resources,这时可以选择重建所有的Activity,或者返回MainActivity,只重建MainActivity。

另外:如果在项目中配置了resConfigs,则需要添加自己多语言的配置,例如resConfigs("zh-rCN","zh-rTW","en")

具体Demo可以参考https://github.com/jklwan/NoteApplication/blob/master/app/src/main/java/com/chends/note/utils/LanguageUtil.java

2019-05-24 15:59:26 y1015156849 阅读数 154

1.多国语言切换

demo https://github.com/1015156849/KotlinExpandTools (Kotlin) demo代码已添加 语言配置

想试一下可以直接拷贝languageExpand.kt 和 SharedPreferenceExpand.kt 到项目里,参考demo用法。

具体更新页面 可以不完全采用 recreate(),具体想要什么效果自己处理也可以的。用我这个不需要你额外继承什么类,开箱即用

 

2.针对国内和国外 配置多渠道打包

因为业务上需要 googe的包和国内的包可能存在app名字或者图标不一样,我们一个个去改难免太费劲。这里提供一段自己项目的样板代码,自己拿过去针对的改就可以

 

在app的gradle文件里加上flavorDimensions ""

接着,这段别扔到 android{} 外面了

 

然后到 manifest 里改一下

2016-05-18 15:37:09 yangjingxi0910 阅读数 352

Android开发App,有时候需要在国际市场上发布,这就需要多语言的配置实现,很简单,就是按照Android提供的规范配置语言包。App运行时会根据当前设备语言,选择对应的语言包。

/values-zh 中文
/values-zh-rCN 中文-中国(中文简体)
/values-zh-rTW 中文-台湾(中文繁体)

/values-en 英文

  • 其中values保持不变;
  • 后缀的zh表示语言;
  • 后缀的rCN、rTW其中‘r’是一个标记,表示后面跟着的CN、TW是国家或地区标志。
  • 例如Android studio新添加中文包如下
  • android多国语言文件夹文件汇总如下:

    维吾尔文(中国):values-ug-rCN

    中文(中国):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




2011-08-04 16:54:56 dfh00l 阅读数 862

设置->语言和键盘->选择语言 的列表主要从framework/framework-res.apk读取.在AssetManager.cpp和reourceType.cpp里可以看到相关代码。

1)bool AssetManager::addDefaultAssets()

2)  bool AssetManager::addAssetPath(const String8& path, void** cookie)

添加

编译APK的时候,哪些内容要打到APK资源包里由 add-assets-to-package 里的aapt参数 $(addprefix -c , $(PRODUCT_AAPT_CONFIG))来控制;一般的设置位置是:

PRODUCT_LOCALES := \
ldpi \
hdpi \
mdpi \
en_US \
en_GB \
en_CA \

试过只编译 framework-res.apk,push到手机,重启后就可以看到语言列表有变化,但比framework-res.apk里指定的多了两种语言(未做进一步分析),全部工程重新编译后,设置里的语言列表和PRODUCT_LOCALES一致

Android 多语言支持

阅读数 419

没有更多推荐了,返回首页