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

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

作者: 瀚海来客 | 来源:发表于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 应用资源国际化 那么一小节插曲。

相关文章

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

    多语言切换中遇到的坑:

  • 2020-10-19随笔 踩坑0传值

    踩坑:当值传入0时,if条件判断时候会自己转换,记录踩坑。

  • Weex入门踩坑记录

    Weex入门踩坑记录

  • Flutter 开发记录

    Flutter 开发踩坑记录(干货总结)

  • 日常bug记录

    想记录日常碰到的bug,坑踩多了,以后应该碰到坑就比较容易处理或者会少踩坑,后面会慢慢记录bug,截图bug以及最...

  • 没事请多踩踩坑!

    人生事不尽意,别人挖坑我踩坑。 请在这里留下你的踩坑记录,让别人少入坑。

  • Windows下GithubPages博客快速搭建

    Windows下开发坑总是比较多的,但是本人没Mac,只好踩一遍坑记录下。本文主要是安装过程&踩坑记录,故不对细节...

  • IOS的国际化

    久未提笔,学习过程中处处遇坑,踩过得坑分享一下,希望再遇到这些坑的猿们能直接越过.... 国际化: 一、In...

  • Retrofit Https踩坑记录

    Retrofit Https踩坑记录 前言 新司机上路,坑多,本文重点是踩坑,不详细讲retrofit用法,本文不...

  • iOS国际化

    如何设置多语言 略过,google一搜一大把,但是都大同小异,就不说了,这里记录一下在适配时踩的坑 获取文本的方法...

网友评论

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

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