当前位置: 首页 > news >正文

实现多语言适配

1.在res下创建多语言资源文件:

 2.选择需要的语言

然后得到多种语言适配string文件:

 

3.代码设置多语言

 

object LanguageHelper {

    /**
     * 获取适配的 Context
     */
    fun getAttachBaseContext(context: Context): Context {
        return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            setAppLanguageApi24(context)
        } else {
            setAppLanguage(context)
            context
        }
    }

    /**
     * 获取当前系统语言,如未包含则默认中文
     */
    private fun getSystemLocal(): Locale {
        val systemLocal = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            LocaleList.getDefault()[0]
        } else {
            Locale.getDefault()
        }
        return when (systemLocal.language) {
            Locale.CHINA.language -> Locale.CHINA // 简体中文
            Locale.TAIWAN.language -> Locale.TAIWAN // 台湾繁体
            "zh" -> when (systemLocal.country) { // 修复拼写错误
                "HK" -> Locale("zh", "HK") // 香港繁体
                else -> Locale.CHINA // 默认简体中文
            }

            Locale.ENGLISH.language -> Locale.ENGLISH // 英文
            else -> Locale.CHINA // 默认简体中文
        }
    }

    /**
     * 兼容 7.0 以上
     */
    @TargetApi(Build.VERSION_CODES.N)
    private fun setAppLanguageApi24(context: Context): Context {
        val locale = getSystemLocal()
        val configuration = context.resources.configuration
        configuration.setLocale(locale)
        configuration.setLocales(LocaleList(locale))
        return context.createConfigurationContext(configuration)
    }

    /**
     * 动态更新 Context 的资源配置
     */
    fun updateResources(context: Context, locale: Locale): Context {
        val resources = context.resources
        val configuration = resources.configuration
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            configuration.setLocale(locale)
            configuration.setLocales(LocaleList(locale))
            return context.createConfigurationContext(configuration)
        } else {
            configuration.locale = locale
            resources.updateConfiguration(configuration, resources.displayMetrics)
        }
        return context
    }

    /**
     * 设置应用语言
     */
    private fun setAppLanguage(context: Context) {
        val locale = getSystemLocal()
        updateResources(context, locale)
    }

}

4.使用示例

 1.在 Application 中使用

在 Application 类的 attachBaseContext 方法中调用 LanguageHelper.getAttachBaseContext,以确保应用启动时使用正确的语言环境。

class MyApplication : Application() {

    override fun attachBaseContext(base: Context) {
        super.attachBaseContext(LanguageHelper.getAttachBaseContext(base))
    }
}
2. 在 Activity 中动态切换语言

在设置页面中,当用户选择语言后,调用 LanguageHelper.updateResources 方法更新当前 Activity 的资源配置,并刷新界面。

class SettingsActivity : AppCompatActivity() {

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

        // 假设有一个语言选择的下拉菜单
        val languageSpinner = findViewById<Spinner>(R.id.languageSpinner)
        val languages = arrayOf("简体中文", "繁體中文(台灣)", "繁體中文(香港)", "English")
        val adapter = ArrayAdapter(this, android.R.layout.simple_spinner_item, languages)
        languageSpinner.adapter = adapter

        // 监听语言选择
        languageSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
            override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
                val selectedLanguage = languages[position]
                when (selectedLanguage) {
                    "简体中文" -> setAppLanguage(Locale.CHINA)
                    "繁體中文(台灣)" -> setAppLanguage(Locale.TAIWAN)
                    "繁體中文(香港)" -> setAppLanguage(Locale("zh", "HK"))
                    "English" -> setAppLanguage(Locale.ENGLISH)
                }
            }

            override fun onNothingSelected(parent: AdapterView<*>?) {}
        }
    }

    private fun setAppLanguage(locale: Locale) {
        // 更新应用语言
        LanguageHelper.updateResources(this, locale)
        recreate() // 刷新当前 Activity
    }
}

相关文章:

  • 在线程间共享数据_《C++并发编程》第三章笔记
  • 【Linux系统编程】基本IO函数
  • Gateway路由分发的策略
  • MoonSharp 文档五
  • 练习:关于静态路由,手工汇总,路由黑洞,缺省路由相关
  • 语音视频App协议安全实战:防御伪造/窃听/Deepfake攻击
  • 深度学习分词器char-level实战详解
  • 循环队列概念和结构
  • 决策树的核心思想
  • c语言笔记 函数参数的等价(下)
  • 华为eNSP:2.配置OSPF报文分析和验证
  • Redis 发布订阅模式详解:实现高效的消息通信
  • Redis未授权访问
  • AI-NAS:当存储遇上智能,开启数据管理新纪元
  • 【工控】线扫相机小结 第五篇
  • 开源模型时代的 AI 开发革命:Dify 技术深度解析
  • SpringMVC项目中,涉及到的各种请求
  • 店匠科技携手 PayPal 升级支付体验,助力独立站商家实现全球增长
  • 重邮数字信号处理-实验五时域采样与频域采样
  • 数据结构(蓝桥杯常考点)
  • “十五五”时期长三角需创新机制,形成高水平一体化合作路径
  • 520、521婚登预约迎高峰?上海民政:将增派力量,新人可现场办理
  • “80后”北大硕士罗婕履新甘肃宁县县委常委、组织部部长
  • 人民网:激发博物馆创新活力,让“过去”拥有“未来”
  • 美国务卿与以色列总理通话,讨论加沙局势
  • 辽宁援疆前指总指挥王敬华已任新疆塔城地委副书记