Android 在应用程序中更改和设置默认语言环境

Posted

技术标签:

【中文标题】Android 在应用程序中更改和设置默认语言环境【英文标题】:Android change and set default locale within the app 【发布时间】:2014-04-19 14:18:32 【问题描述】:

我正在致力于 android 应用程序的全球化。我必须提供从应用程序中选择不同语言环境的选项。我在我的活动 (HomeActivity) 中使用以下代码,我提供了更改语言环境的选项

Configuration config = new Configuration();
config.locale = selectedLocale; // set accordingly 
// eg. if Hindi then selectedLocale = new Locale("hi");
Locale.setDefault(selectedLocale); // has no effect
Resources res = getApplicationContext().getResources();
res.updateConfiguration(config, res.getDisplayMetrics());

只要没有像屏幕旋转这样的区域设置默认为 android 系统级区域设置而不是代码设置的区域设置的配置更改,此方法就可以正常工作。

Locale.setDefault(selectedLocale);

我能想到的一个解决方案是使用 SharedPreferences 持久化用户选择的语言环境,并在每个活动的 onCreate() 方法中将语言环境设置为持久化语言环境,因为每次配置更改都会一次又一次地调用 onCreate()。有没有更好的方法来做到这一点,这样我就不必在每项活动中都这样做了。

基本上我想要的是 - 一旦我在 HomeActivity 中更改/设置为某个区域设置,我希望我的应用程序中的所有活动都使用该区域设置本身,而不管任何配置更改......除非它被更改为应用的 HomeActivity 中提供更改语言环境的选项的其他语言环境。

【问题讨论】:

解决方案可以在Set Locale programmatically找到。 【参考方案1】:

虽然此答案中所述的解决方案适用于一般情况,但我发现自己添加到我的偏好屏幕:

 <activity android:name="com.example.UserPreferences"
     android:screenOrientation="landscape"
     android:configChanges="orientation|keyboardHidden|screenSize">
 </activity>

这是因为当应用程序处于横向模式并且首选项屏幕处于纵向模式时,更改区域设置并返回应用程序可能会导致问题。将两者都设置为横向模式可以防止这种情况发生。

一般解决方案

您需要在应用程序级别更改区域设置,以便其效果无处不在。

public class MyApplication extends Application

  @Override
  public void onCreate()
  
    updateLanguage(this);
    super.onCreate();
  

  public static void updateLanguage(Context ctx)
  
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(ctx);
    String lang = prefs.getString("locale_override", "");
    updateLanguage(ctx, lang);
  

  public static void updateLanguage(Context ctx, String lang)
  
    Configuration cfg = new Configuration();
    if (!TextUtils.isEmpty(lang))
      cfg.locale = new Locale(lang);
    else
      cfg.locale = Locale.getDefault();

    ctx.getResources().updateConfiguration(cfg, null);
  

然后在你的清单中你必须写:

<application android:name="com.example.MyApplication" ...>
  ...
</application>

【讨论】:

如果我使用英语。我会打电话给updateLanguage(this, "en");,对吗?或者试试updateLanguage(this, Locale.US.getDisplayLanguage()); 不适合我。 字符串“locale_override”应替换为您偏好指向该语言的任何键。 这是一个不错的解决方案。但不幸的是,它只适用于我在调试时运行 Android 4.4.2 的 Galaxy S4。正常运行时,它不会改变语言,但会在 LogCat 中产生很多额外的输出。解决方案是在我的主要活动的 onCreate 方法中调用静态方法 updateLanguage( ctx ),而不是在应用程序的 onCreate 中。但在那种情况下,我不需要派生类 Application。 请注意,updateConfiguration() 已弃用。在Set Locale programmatically 中建议了替代方案。 是否有理由将 updateConfiguration() 定义为 static ? @MikaëlMayer

以上是关于Android 在应用程序中更改和设置默认语言环境的主要内容,如果未能解决你的问题,请参考以下文章

在Android中更改区域设置后应用程序找不到资源

当我在android中更改应用程序中的语言环境时如何重新加载当前视图

Flutter Tar:无法在 android studio IOS 中设置默认语言环境

Android获取当前区域设置,而不是默认设置

在 Swift 中更改 iOS 应用程序的默认基本语言

动态更改我的应用程序上下文的语言环境