{"id":23897946,"url":"https://github.com/byteszero/switchlanguage","last_synced_at":"2025-04-10T17:05:14.731Z","repository":{"id":85309117,"uuid":"92938229","full_name":"BytesZero/SwitchLanguage","owner":"BytesZero","description":"Android 多语言切换及适配指南","archived":false,"fork":false,"pushed_at":"2018-08-03T07:10:17.000Z","size":194,"stargazers_count":20,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-03-24T14:46:14.130Z","etag":null,"topics":["android","demo","language","multilanguage-support"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/BytesZero.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2017-05-31T11:13:26.000Z","updated_at":"2025-02-08T07:14:44.000Z","dependencies_parsed_at":null,"dependency_job_id":"8cecf70e-98b7-46e1-8eed-7ca1b5049d3c","html_url":"https://github.com/BytesZero/SwitchLanguage","commit_stats":null,"previous_names":["byteszero/switchlanguage"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BytesZero%2FSwitchLanguage","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BytesZero%2FSwitchLanguage/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BytesZero%2FSwitchLanguage/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BytesZero%2FSwitchLanguage/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/BytesZero","download_url":"https://codeload.github.com/BytesZero/SwitchLanguage/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248260170,"owners_count":21074207,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","demo","language","multilanguage-support"],"created_at":"2025-01-04T17:19:14.847Z","updated_at":"2025-04-10T17:05:14.681Z","avatar_url":"https://github.com/BytesZero.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Android 多语言切换及适配指南\n\n[![Build Status](https://travis-ci.org/yy1300326388/SwitchLanguage.svg?branch=master)](https://travis-ci.org/yy1300326388/SwitchLanguage)\n\n### 切换语言\n\n- Application 配置\n\n```java\npublic class MyApplication extends Application {\n\n    @Override\n    protected void attachBaseContext(Context base) {\n        super.attachBaseContext(LocaleManager.setLocale(base));\n    }\n\n    @Override\n    public void onCreate() {\n        super.onCreate();\n        //处理Android7（N）WebView 导致应用内语言失效的问题\n        LocaleManager.destoryWebView(this);\n    }\n\n    @Override\n    public void onConfigurationChanged(Configuration newConfig) {\n        super.onConfigurationChanged(newConfig);\n        LocaleManager.setLocale(this);\n    }\n}\n```\n\n- 切换中文\n\n```java\n\nLocaleManager.switchLanguage(preference.getContext(), \"简体中文\", \"zh\");\n```\n\n- 切换英文\n\n```java\n\nLocaleManager.switchLanguage(preference.getContext(), \"English\", \"en\");\n```\n\n- 更随系统\n\n```java\n\nLocaleManager.switchLanguage(preference.getContext(), \"跟随系统\", \"auto\");\n```\n\n- 重启app，并启动主页\n\n```java\nLocaleManager.restartActivity(getActivity(), MainActivity.class);\n```\n\n\n\n### 核心代码\n\n- 语言切换核心代码\n\n``` java\n//更新语言\nResources res = context.getResources();\nConfiguration config = new Configuration(res.getConfiguration());\nconfig.setLocale(locale);\nres.updateConfiguration(config, res.getDisplayMetrics());\nreturn context;\n```\n\n### 注意事项\n\n#### 1、Android N(API-24) 有 WebView 的页面，切换语言不成功\n\n- 原因\n\nAndroid N 开始系统 WebView 使用共享的同一个，所以会导致这个问题\n\n- 解决办法\n\n启动 App 的时候创建 `WebView` 然后 `destroy()`一下\n\n```java\n@Override\npublic void onCreate() {\n    super.onCreate();\n    //处理Android7（N）WebView 导致应用内语言失效的问题\n    LocaleManager.destoryWebView(this);\n}\n```\n\n#### 2、`Toolbar` 或者 `ActionBar` 的`title` 切换语言不起作用\n\n默认 `title` 是从 `AndroidManifest.xml` 中 `Activity` 的 `label` 标签里读取的，我们在代码里手动设置一下 `title`即可\n\n```java\n//Toolbar\ntoolbar.setTitle(R.string.app_name);\n//ActionBar\nactionBar.setTitle(R.string.title_activity_settings);\n```\n\n#### 3、保存语言设置时，连续调用了 `switchLanguage` 和 `restartActivity` 结果目标语言没有保存下来。\n\n- 原因\n\n切换后的目标语言保存在 `SharedPreferences` 中，`restartActivity`会导致上下文丢失，所以保存失败\n\n- 解决方法\n\n选择语言后调用 `switchLanguage` 点击保存后只调用`restartActivity`\n\n\u003e 上述方案有一个新问题，就是我只切换了语言，但是没有保存，按了返回键，但是已经触发了语言切换，下次启动App会看到切换后的语言，其实这个时候用户是没有切换的\n\n- 解决方法\n\n在用户点击返回的时候，再次调用 `switchLanguage` 切换回当前语言\n\n如果你有更好的思路和方案请提交给我哦\n\n#### 4、切换从右到左的语言后，布局不跟随改变\n\n- 原因\n\n在较早的 Android 系统版本中不支持从右到左的布局切换，从 `Android 4.1 (Jelly Bean API 17+)` 以后才开始支持\n\n- 解决办法\n\n在布局文件我们把之前的`left`替换成`start` 、`right`替换成`end`,比如 `paddingLeft`替换成`paddingStart`\n\n#### 5、获取字符串使用 `String.format(String format, Object... args)` 来创建格式化的字符串\n\n- 转化符说明参考表\n\n转化符 | 说明 | 示例\n---|---|---\n%s|字符串类型|“asdf”\n%c|字符类型|'m'\n%b|布尔类型| true|false\n%d|整数类型（十进制）|99\n%x|整数类型（十六进制）|FF\n%o|整数类型（八进制）|77\n%f|浮点类型|99.99\n%a|十六进制浮点类型|FF.35AE\n%e|指数类型|9.38e+5\n%g|通用浮点类型（f和e类型中较短的)|\n%h|散列码|\n%%|百分比类型|99%\n%n|换行符|\n%tx|日期与时间类型（x代表不同的日期与时间转换符|\n\n- 示例\n\n```java\nString str=null;\nstr=String.format(\"Hi,%s\", \"王力\");\nSystem.out.println(str);\nstr=String.format(\"Hi,%s:%s.%s\", \"王南\",\"王力\",\"王张\");\nSystem.out.println(str);\nSystem.out.printf(\"字母a的大写是：%c %n\", 'A');\nSystem.out.printf(\"3\u003e7的结果是：%b %n\", 3\u003e7);\nSystem.out.printf(\"100的一半是：%d %n\", 100/2);\nSystem.out.printf(\"100的16进制数是：%x %n\", 100);\nSystem.out.printf(\"100的8进制数是：%o %n\", 100);\nSystem.out.printf(\"50元的书打8.5折扣是：%f 元%n\", 50*0.85);\nSystem.out.printf(\"上面价格的16进制数是：%a %n\", 50*0.85);\nSystem.out.printf(\"上面价格的指数表示：%e %n\", 50*0.85);\nSystem.out.printf(\"上面价格的指数和浮点数结果的长度较短的是：%g %n\", 50*0.85);\nSystem.out.printf(\"上面的折扣是%d%% %n\", 85);\nSystem.out.printf(\"字母A的散列码是：%h %n\", 'A');\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbyteszero%2Fswitchlanguage","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbyteszero%2Fswitchlanguage","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbyteszero%2Fswitchlanguage/lists"}