美文网首页知识小点Android小细节
Android 应用内语言切换

Android 应用内语言切换

作者: 王灵 | 来源:发表于2020-06-16 18:08 被阅读0次

如果是做国际类APP,那么肯定会涉及到多国语言切换的问题。本文简单的实现语言的切换。

前提条件

  • 基础类 直接复制粘贴
    LanguageUtil.kt 主要功能提供
object LanguageUtil : SPLanguageInterface {
    //    companion object {
    fun attachBaseContext(context: Context): Context {

        return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            updateResources(context, language)
        } else {
            context
        }
    }

    fun getLocaleByLanguage(language: String): Locale {
        return when (language) {
//            Locale.ENGLISH.language -> Locale.ENGLISH
//                Locale.JAPAN.language -> Locale.JAPAN
//                else -> Locale.SIMPLIFIED_CHINESE
            else -> Locale.forLanguageTag(language)
        }
    }

    @TargetApi(Build.VERSION_CODES.N)
    fun updateResources(context: Context, language: String): Context {
        var resoures = context.resources
        var configuration = resoures.configuration
        var locale = getLocaleByLanguage(language)

        configuration.setLocale(locale)
        configuration.setLocales(LocaleList(locale))
        return context.createConfigurationContext(configuration)
    }

    @SuppressWarnings("deprecation")
    fun changeAppLanguage(context: Context) {
        if (TextUtils.isEmpty(language)) {
            return
        }
        var resources = context.resources
        var configuration = resources.configuration
        var locale = getLocaleByLanguage(language)
        configuration.setLocale(locale)
        context.createConfigurationContext(configuration)
    }

    lateinit var spLanguageInterface: SPLanguageInterface
    fun init(spLanguageInterface: SPLanguageInterface) {
        this.spLanguageInterface = spLanguageInterface
    }

//    }

    override var language: String
        get() = spLanguageInterface.language
        set(value) {
            spLanguageInterface.language = value
        }

}

SPLanguageInterface.kt 需要使用SP实现的语言设置于获取方法

interface SPLanguageInterface {

    /**
     * 获取语言
     */
    /**
     * 设置语言
     */
    var language: String
}
  • 语言文件
    语言文件.png
    注意: values-en里的en最好与SP里存储一致

代码

对于Android7.0及以上版本需要重写Activity的attachBaseContext方法。建议重写BaseActivity的attachBaseContext方法。

open class LanguageActivity : AppCompatActivity() {
    override fun attachBaseContext(newBase: Context) {
        super.attachBaseContext(LanguageUtil.attachBaseContext(newBase))
    }
}

对于Android7.0之前的版本需要在Application里去调用

public class MyApplication extends Application implements SPLanguageInterface {
    public static MyApplication application;

    @Override
    public void onCreate() {
        super.onCreate();
        application = this;

        LanguageUtil.INSTANCE.init(this);//初始化LanguageUtil 需要提供SPLanguageInterface的实现类
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
            LanguageUtil.INSTANCE.changeAppLanguage(this);
        }
    }
//使用SP实现设置语言
    @Override
    public void setLanguage(String language) {
        SpUtil.Companion.getInstance(application).putString(SpUtil.LANGUAGE, language);
    }
//使用SP实现获取语言
    @Override
    public String getLanguage() {
        return SpUtil.Companion.getInstance(this).getString(SpUtil.LANGUAGE);
    }
}

注意:SPLanguageInterface接口并不是一定要在Application里实现。

至此就基本完成了,只是简单的实现。

在Activity中去切换

class WelcomeActivity : LanguageActivity(), View.OnClickListener {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_welcome)

        china.setOnClickListener(this)
        english.setOnClickListener(this)
        japanese.setOnClickListener(this)
        french.setOnClickListener(this)
    }

    override fun onClick(v: View) {
        var s = when (v.id) {

            R.id.english -> {
                Locale.ENGLISH.language
            }
            R.id.japanese -> {
                Locale.JAPAN.language
            }
            R.id.french -> {
                "fr"
            }
            else -> {
                Locale.CHINA.language
            }
        }
        var string = LanguageUtil.language//获取sp保存的语言
        if (string != s) {//当需要切换的语言与sp保存的不一样时才会切换
           LanguageUtil.language=s
//实际场景分为两种。1、应用第一次安装,在初始化界面选择语言,不需要重新启动。2、在使用过程中切换,需要重新启动程序。因为涉及到之前已经加载的页面。而且接口返回语种也需要变更。
            startActivity(Intent(this, WelcomeActivity::class.java))
            finish()
        }
    }
}

参考:https://www.jianshu.com/p/4f9db19d9383

相关文章

  • Android应用内切换语言

    首先扯点别的:这是第一次在简书上写东西,我突然明白为啥这么多人在简书上写东西了,因为没有广告啊,哈哈。 最近接触到...

  • Android 应用内语言切换

    如果是做国际类APP,那么肯定会涉及到多国语言切换的问题。本文简单的实现语言的切换。 前提条件 基础类 直接复制粘...

  • Android应用内切换语言

    一、前言: 最近接触到Android 应用内切换语言的问题,研究了两天,做个记录先。实现了中文,英文,泰语的切换。...

  • Android应用实现语言切换

    语言切换需求 应用内切换语言,支持阿拉伯语(从右到左书写,即RTL语言支持) 语言切换是切换系统语言,不只本应用 ...

  • 应用内切换语言

    思路 主要就是利用runtime hook系统的方法,宏定义为NSLocalizedString(key, com...

  • Android 应用内多语言切换

    最近公司的 App 里需要用到多语言切换,简单来说,就是如果用户没有选择语言选项时,App 默认跟随系统语言,如果...

  • android应用内多语言切换

    新年好啊,一些面向国际化的应用需要支持多语言,客户说要是增加一个语言切换的功能最好不过了,今天,它来了。 先看效果...

  • Android 应用内切换多国语言

    话不多说,先上个工具类: package com.adorone.util;import android.cont...

  • Android App 应用内多语言切换

    App用户根据自己的语言喜好,设置app语言。语言设置只针对本app,并在下次启动应用时保留前一次启动设置。 切换...

  • ios 应用内切换语言

    1.首先添加需要支持的语言,默认支持英文,再添加中文即可 2.创建文件 创建完成后,再勾选另外的语言,base暂时...

网友评论

    本文标题:Android 应用内语言切换

    本文链接:https://www.haomeiwen.com/subject/zfprxktx.html