【问题标题】:How to change Locale? Not working on some Devices如何更改语言环境?不适用于某些设备
【发布时间】:2019-03-28 13:34:23
【问题描述】:

我正在编写支持两种语言的应用程序,我正在使用 Change app Locale 更改语言,这里是我的代码:

 Locale locale = new Locale("fa");
            Locale.setDefault(locale);
            Configuration configs = new Configuration();
            configs.locale = locale;
            getBaseContext().getResources().updateConfiguration(configs, getBaseContext().getResources().getDisplayMetrics());

还有

在清单中我设置了android:supportsRtl="true"

这些代码在许多设备中工作,但在某些设备中不工作。例如文本不是翻译而是方向改变。

测试设备:

  • 三星 J5Pro 2018 (android = 7.1): 工作
  • 像素 2 API 26:工作
  • 三星 J7 2017(android = 7):工作
  • Nexus 5 (android = 6):不工作
  • 三星 Galaxy G531 (android

【问题讨论】:

  • 它应该可以在 nexus 4 上运行,也可能你忘了打电话给recreate()
  • 我有一个在第一次显示选择语言的活动,在用户选择一种语言后,应用程序将用户定向到 MainActivity。所以我不需要recreate()@Basil Battikhi

标签: android locale multilingual


【解决方案1】:

有同样的问题。 Android Studio 将语言文件夹命名为 values-xx-rXX。 Android 6.0 及更低版本无法处理此问题,因此您必须将文件夹名称(我直接在 Windows 资源管理器中完成)重命名为 values-de。 现在它在所有设备上都适用于我

【讨论】:

    【解决方案2】:

    我找到了我的解决方案,我的问题是我在区域设置中插入了"fa",我的字符串值目录名称是values-fa-rlIR,所以名称不同所以不起作用,我想知道为什么它在某些设备上工作!

    我只是将字符串值目录名称从 values-fa-rlIR 更改为 values-fa,它运行良好。

    【讨论】:

    • 是的。将 values-fa-rlIR 更改为 values-fa 后,它的工作。干杯!
    • 你节省了我很多时间。兄弟。谢谢
    • 你能解释一下整个过程它的矿值->字符串->string.xml(默认)和我的string.xml(bn)我应该在哪里改变。如果可能,请提供帮助
    【解决方案3】:

    或者试试这个方法,我在很多应用程序中都使用过,它有效

    @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR1)
        fun fixUpLocale(ctx: Context, newLocale: Locale) {
            val res = ctx.resources
            val config = res.configuration
            val curLocale = getLocale(config)
            if (curLocale != newLocale) {
                Locale.setDefault(newLocale)
                val conf = Configuration(config)
                conf.setLocale(newLocale)
                res.updateConfiguration(conf, res.displayMetrics);
            }
        }
    
        fun getLocale(config: Configuration): Locale {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                return config.locales[0]
            } else {
                //noinspection deprecation
                return config.locale;
            }
        }
    

    【讨论】:

      【解决方案4】:
      fun changeLang(context: Context, lang_code: String): ContextWrapper {
          defaultLanguage = lang_code
          var context = context
          val sysLocale: Locale
      
          val rs = context.resources
          val config = rs.configuration
      
          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
              sysLocale = config.locales.get(0)
          } else {
              sysLocale = config.locale
          }
          if (lang_code != "" && !sysLocale.language.equals(lang_code)) {
              val locale = Locale(lang_code)
              Locale.setDefault(locale)
              if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                  config.setLocale(locale)
              } else {
                  config.locale = locale
              }
              if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
                  context = context.createConfigurationContext(config)
              } else {
                  context.resources.updateConfiguration(config, context.resources.displayMetrics)
              }
          }
      
          return ContextWrapper(context)
      }
      

      把它放在你想改变语言的每一个活动中

         override fun attachBaseContext(newBase: Context) {
          val lang_code = Shared.defaultLanguage //load it from SharedPref
          val context = Shared.changeLang(newBase, lang_code)
          super.attachBaseContext(context)
      }
      

      你可以试试这个代码,它在 Kotlin 中,更多信息你可以查看Android N change language programmatically

      我认为这是 API 问题。

      【讨论】:

      • 我在 android Marshmallow 和 prelollipop 中遇到问题,但您的代码适用于 Android N,所以帮不了我。
      • 试试这一行 context.createConfigurationContext(config)
      • 我应该在哪里使用这个?这不是更新配置。 @B.mansouri
      • 在每个活动中添加 on attachBaseContext
      • 我在空对象引用上得到 android.content.Context.getSharedPreferences(java.lang.String, int)'科特林
      猜你喜欢
      • 2016-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-04
      • 2018-11-27
      • 2018-02-19
      相关资源
      最近更新 更多