国际化(多语言踩坑记录)

多语言切换中遇到的坑:

  以静态变量的方式,在 Application 初始化时初始化网络请求错误提示
  语,然后再系统中切换语言后,网络请求错误提示语未更新。
  解决办法:使用时直接通过 getString() 方法获取

  App 多语言切换设置持久化后,在应用启动时,
  Application 的 onCreate() 中也进行了多语言切换。
  然后去系统设置中切换语言,App 也会随之跟随系统语言。

原因:在我们改变系统的语言时,应用的 Configuration 也随之跟随系
          统改变,而不是我们启动应用时的设置了解决办法:监听 Activity
          的生命周期, 在 Activty 的 onCreate() 中判断应用当前的语言设
          置是否与用户设置值相同,否则强制更新应用语言设置。因为
          ,当系统切换语言选项的时候,系统会重启 Activity,就如前文所
          说,我们需要重启 Activity 才能实现资源的重新加载一样。
          这里也有两种方案:

  1. 创建一个基类 BaseActivity ,在其 onCreate() 方法中做处理
      使用 ActivityLifecycleCallbacks ,在其回调 onActivityCreated() 
      中做处理, 只能针对继承自 BaseActivity 的才有效.
  2. 监听所以 Activity 的生命周期.相对而言,第二种方案更好点。
      /**
        * 判断是否与设定的语言相同.
        *
        * @param context
        * @return
        */
    public static boolean isSameWithSetting(Context context) {
    Locale current = context.getResources().getConfiguration().locale;
        return current.equals(getAppLocale(context));
    }

  public class App extends Application {
        @Override
        public void onCreate() {
              super.onCreate();
              LanguageUtil.init(this);
              //注册Activity生命周期监听回调
            registerActivityLifecycleCallbacks(callbacks);
        }
    ActivityLifecycleCallbacks callbacks = new ActivityLifecycleCallbacks() {
    @Override
    public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
        //强制修改应用语言
        if (!LanguageUtil.isSameWithSetting(activity)) {
            LanguageUtil.changeAppLanguage(activity,
                    LanguageUtil.getAppLocale(activity));
        }
    }
    //Activity 其它生命周期的回调
};
}

对于在 AndroidManifest.xml 中配置 launchMode 为 singleInstance 的Activity,使用
        Intent intent = new Intent(this, MainActivity.class);
        //开始新的activity同时移除之前所有的activity
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |      
                             Intent.FLAG_ACTIVITY_CLEAR_TASK);
        startActivity(intent);


资源文件不更新。
原因:launchMode 为 singleInstance 的 Activity 与当前应用时不在同
      一个 Task 栈解决方法:将 launchMode 改为其它
      模式或者杀掉应用重新启动资源文件夹为 values-zh-rCN时,
      将应用 Locale 设置为Locale.CHINESE 时

找不到对应的资源文件。
原因:values-zh-rCN 对应的 Locale 为 Locale.SIMPLIFIED_CHINESE  
      解决办法:将 Locale 设置为 Locale.SIMPLIFIED_CHINESE 或者
      将资源文件改为 values-zh这是踩得最惨的一个坑,浪费了大量时
      间,所以才会有开头 Android 应用资源国际化 那么一小节插曲。

你可能感兴趣的:(国际化(多语言踩坑记录))