以编程方式更改语言环境在某些设备中不起作用

时间:2014-04-17 11:07:50

标签: java android

我有以下代码:

/**
 * Sets a new Locale for the APP.
 * @param newLocale - Valid new locale.
 */
private static void setLocale( String newLocale )
{
    Locale locale = new Locale( newLocale );
    Locale.setDefault( locale );

    Configuration config = new Configuration();
    config.locale = locale;

    context.getResources().updateConfiguration( config, context.getResources().getDisplayMetrics() );
}

简单。

然而,当我在智能手机(4.1.1)中运行它时,它确实可以正常工作。设备更改字符串以匹配语言。

但是使用平板电脑(4.3),它并不起作用。如果我输出如下内容:

Log.d("TAG",Locale.getDefault());

Locale似乎在两台设备上都有所改变,但正如我所说,Strings并没有被翻译成正确的语言。

我做了很多调试,我发现了对象之间的区别: 查看4.1.1上的Configuration对象:

enter image description here

并查看平板电脑上的配置对象(4.3) enter image description here

正如您所看到的,唯一值得注意的差异是userSetLocale在平板电脑上设置为False。

所以我检查了Google SourceCode(https://github.com/android/platform_frameworks_base/blob/master/core/java/android/content/res/Configuration.java),并声明:

 /**
 * Locale should persist on setting.  This is hidden because it is really
 * questionable whether this is the right way to expose the functionality.
 * @hide
 */
public boolean userSetLocale;

看起来这对我有影响。因此,我无法访问此值,也无法通过getter / setter或公共访问,我使用反射来更改它。

然而,在通过反射更改之后,即使我已经看到它在内部发生了变化(反射后boolean设置为false),同样的问题仍然存在。

你们有什么提示吗?

同时我会继续测试。

感谢。 的测试:

  • Nexus 10 - 4.4.2 - 确定
  • Nexus 5 - 4.4.2 - 确定
  • Tablet 32​​0 dpi - 4.4.2 - 确定
  • SmartPhone 480 dpi - 4.3 - 确定
  • SmartPhone 160 dpi - 4.1.1 - 确定
  • 平板电脑160 dpi - 4.3 - 不行
  • SmartPhone 320 dpi - 4.1.1 - 确定

2 个答案:

答案 0 :(得分:4)

这是我用于本地化的代码。它被+ 100万人使用,从未听说过有关不更换字符串的任何投诉,所以我希望它也适用于你:

在课堂上:

Locale myLocale;

功能:

    public void setLocale(String lang) { 
        myLocale = new Locale(lang); 
        Resources res = getResources(); 
        DisplayMetrics dm = res.getDisplayMetrics(); 
        Configuration conf = res.getConfiguration(); 
        conf.locale = myLocale; 
        res.updateConfiguration(conf, dm);
        reloadUI(); // you may not need this, in my activity ui must be refreshed immediately so it has a function like this.
    }

功能调用:

//example for setting English
setLocale("en_gb");

答案 1 :(得分:1)

那么,

用户Sir SC提供了一个有效的答案。但我的代码,也工作。我们面临的问题是关于单个设备忽略此区域设置更改。所以AFAIK,它只是一个设备,它可能是由于一个有缺陷的ROM引起的,因为它是一个Genymotion仿真器。

总的来说,答案是:

  • 发布的代码OP有效且有效。来自SC爵士的代码也是如此。

干杯。