美文网首页
国际化(多语言踩坑记录)

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

作者: 瀚海来客 | 来源:发表于2019-05-30 20:22 被阅读0次

    多语言切换中遇到的坑:

      以静态变量的方式,在 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 应用资源国际化 那么一小节插曲。

    相关文章

      网友评论

          本文标题:国际化(多语言踩坑记录)

          本文链接:https://www.haomeiwen.com/subject/yzrbtctx.html