MultiLanguages icon indicating copy to clipboard operation
MultiLanguages copied to clipboard

[Bug]:android15中设置印度尼西亚语无效

Open WindtalkerWu opened this issue 8 months ago • 6 comments

框架版本【必填】

9.5

问题描述【必填】

我在项目中使用的是 in 设置印度尼西亚语, 添加的语言字符串也是 res/values-in/strings.xml,但是在 android15 中设置印度尼西亚语后发现设置无效,排查一下,发现调用 MultiLanguages.getAppLanguage(Context context) 返回的 Locale.languageid

网上查了一下在 Android 语言和区域设置中,印度尼西亚语的简写可以是 inid

  1. in 是 ISO 639-1 旧标准(1989 年之前)的印度尼西亚语代码
  2. id 是 ISO 639-1 现行标准(1990 年之后)的印度尼西亚语代码

然后我使用新的 idres/values-id/strings.xml,在 Android 15 以下系统中,设置语言为 id 后, 调用MultiLanguages.getAppLanguage(Context context) 返回的 Locale.language 还是 in,而且语言变成的是英语,估计还是按照values-in 目录来查找

复现步骤【必填】

使用 MultiLanguages.setAppLanguage 设置印度尼西亚语

是否必现【必填】

项目 targetSdkVersion【必填】

35

出现问题的手机信息【必填】

google pixel6 和google pixel7

出现问题的安卓版本【必填】

android15, android14

问题信息的来源渠道【必填】

自己遇到的

是部分机型还是所有机型都会出现【必答】

所有机型

框架最新的版本是否存在这个问题【必答】

框架文档是否提及了该问题【必答】

是否已经查阅框架文档但还未能解决的【必答】

issue 列表中是否有人曾提过类似的问题【必答】

是否已经搜索过了 issue 列表但还未能解决的【必答】

是否可以通过 Demo 来复现该问题【必答】

提供报错堆栈


提供截图或视频

No response

提供解决方案

No response

WindtalkerWu avatar Apr 01 '25 08:04 WindtalkerWu

Image

你在 setAppLanguage 方法传入的参数是什么?

getActivity avatar Apr 01 '25 17:04 getActivity

Image

你提供一下这块的文档或者资料给到我

getActivity avatar Apr 01 '25 17:04 getActivity

/**
 * 设置语言
 */
fun Activity.changeLanguage(language: String = ""): Boolean {
    Log.d("changeLanguage", "Activity: $this")
    val locale: Locale = if (language == "zh-rTW") {
        Locale.TRADITIONAL_CHINESE
    }
    else {
        Locale(language)
    }

    val bSet = MultiLanguages.setAppLanguage(this, locale)
    return bSet
}

setAppLanguage时调用的是这个方法,然后传了"in"

WindtalkerWu avatar Apr 14 '25 03:04 WindtalkerWu

我是在chatGPT中询问"in"和"id"的区别

Image

https://en.wikipedia.org/wiki/List_of_ISO_639_language_codes

WindtalkerWu avatar Apr 14 '25 03:04 WindtalkerWu

我最近研究了一下这个问题,发现这个问题在 Android 14 运行不会出现,在 Android 15 运行会出现,但也仅限于 targetSdk >= 35 的时候才会,这个问题的根源是谷歌程序员在 Locale 类中强行修改了 language 字段的赋值,并且没有选项可供开发者选择,暂时的解决方案是将 in 语种资源复制一份到 id 上面,然后让后端接口配合兼容 inid 这两种语种的情况。

getActivity avatar Apr 24 '25 08:04 getActivity

补充一下受影响的语种列表

Image

getActivity avatar Jun 28 '25 08:06 getActivity