Skip to content

BytesZero/SwitchLanguage

Repository files navigation

Android 多语言切换及适配指南

Build Status

切换语言

  • Application 配置
public class MyApplication extends Application {

    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(LocaleManager.setLocale(base));
    }

    @Override
    public void onCreate() {
        super.onCreate();
        //处理Android7(N)WebView 导致应用内语言失效的问题
        LocaleManager.destoryWebView(this);
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        LocaleManager.setLocale(this);
    }
}
  • 切换中文
LocaleManager.switchLanguage(preference.getContext(), "简体中文", "zh");
  • 切换英文
LocaleManager.switchLanguage(preference.getContext(), "English", "en");
  • 更随系统
LocaleManager.switchLanguage(preference.getContext(), "跟随系统", "auto");
  • 重启app,并启动主页
LocaleManager.restartActivity(getActivity(), MainActivity.class);

核心代码

  • 语言切换核心代码
//更新语言
Resources res = context.getResources();
Configuration config = new Configuration(res.getConfiguration());
config.setLocale(locale);
res.updateConfiguration(config, res.getDisplayMetrics());
return context;

注意事项

1、Android N(API-24) 有 WebView 的页面,切换语言不成功

  • 原因

Android N 开始系统 WebView 使用共享的同一个,所以会导致这个问题

  • 解决办法

启动 App 的时候创建 WebView 然后 destroy()一下

@Override
public void onCreate() {
    super.onCreate();
    //处理Android7(N)WebView 导致应用内语言失效的问题
    LocaleManager.destoryWebView(this);
}

2、Toolbar 或者 ActionBartitle 切换语言不起作用

默认 title 是从 AndroidManifest.xmlActivitylabel 标签里读取的,我们在代码里手动设置一下 title即可

//Toolbar
toolbar.setTitle(R.string.app_name);
//ActionBar
actionBar.setTitle(R.string.title_activity_settings);

3、保存语言设置时,连续调用了 switchLanguagerestartActivity 结果目标语言没有保存下来。

  • 原因

切换后的目标语言保存在 SharedPreferences 中,restartActivity会导致上下文丢失,所以保存失败

  • 解决方法

选择语言后调用 switchLanguage 点击保存后只调用restartActivity

上述方案有一个新问题,就是我只切换了语言,但是没有保存,按了返回键,但是已经触发了语言切换,下次启动App会看到切换后的语言,其实这个时候用户是没有切换的

  • 解决方法

在用户点击返回的时候,再次调用 switchLanguage 切换回当前语言

如果你有更好的思路和方案请提交给我哦

4、切换从右到左的语言后,布局不跟随改变

  • 原因

在较早的 Android 系统版本中不支持从右到左的布局切换,从 Android 4.1 (Jelly Bean API 17+) 以后才开始支持

  • 解决办法

在布局文件我们把之前的left替换成startright替换成end,比如 paddingLeft替换成paddingStart

5、获取字符串使用 String.format(String format, Object... args) 来创建格式化的字符串

  • 转化符说明参考表
转化符 说明 示例
%s 字符串类型 “asdf”
%c 字符类型 'm'
%b 布尔类型 true
%d 整数类型(十进制) 99
%x 整数类型(十六进制) FF
%o 整数类型(八进制) 77
%f 浮点类型 99.99
%a 十六进制浮点类型 FF.35AE
%e 指数类型 9.38e+5
%g 通用浮点类型(f和e类型中较短的)
%h 散列码
%% 百分比类型 99%
%n 换行符
%tx 日期与时间类型(x代表不同的日期与时间转换符
  • 示例
String str=null;
str=String.format("Hi,%s", "王力");
System.out.println(str);
str=String.format("Hi,%s:%s.%s", "王南","王力","王张");
System.out.println(str);
System.out.printf("字母a的大写是:%c %n", 'A');
System.out.printf("3>7的结果是:%b %n", 3>7);
System.out.printf("100的一半是:%d %n", 100/2);
System.out.printf("100的16进制数是:%x %n", 100);
System.out.printf("100的8进制数是:%o %n", 100);
System.out.printf("50元的书打8.5折扣是:%f 元%n", 50*0.85);
System.out.printf("上面价格的16进制数是:%a %n", 50*0.85);
System.out.printf("上面价格的指数表示:%e %n", 50*0.85);
System.out.printf("上面价格的指数和浮点数结果的长度较短的是:%g %n", 50*0.85);
System.out.printf("上面的折扣是%d%% %n", 85);
System.out.printf("字母A的散列码是:%h %n", 'A');

About

Android 多语言切换及适配指南

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy