Android多语言切换/适配——以英语为例
近期在做一个背单词APP来作为毕业设计,在app里面想设计一个切换语言为英语的功能,记录一下本次实现的效果以及步骤。
文章目录
- 实现效果
- 中文模式
- 英文模式
- 实现原理
- 实现步骤
- 1、创建相关的value文件夹和string.xml文件
- 2、 在对应的string文件中选择合适的翻译
- 3、在对应的view中使用该string字段
- 4、修改资源文件对应的Locale属性
- 5、 重启Activity
- 6、设置重启后恢复SP储存的属性
- 最终效果图
实现效果
中文模式
英文模式
PS: 请不要吐槽我的垃圾英语翻译水平,纯机翻哈哈哈
实现原理
在Android当中针对不同的ConfigChanges会有不同的响应事件,对于手机语言状态的改变会引起对应的res / values的目录的使用,例如对于中文模式使用的就是默认的文件夹:
对于英语使用的就是values_en的文件夹下的xml文件。
语言对应的文件夹名字可以通过Android studio来直接创建对应的Resource Dictionnary:
再自己选择对应语言,这里以英语为例:
其他语言文件夹同理。
然后在对应的语言文件夹下的String.xml文件中翻译对应的字符串即可。
对于系统语言级别的切换App会自动进行响应切换为对应的语言,若对应的语言没有相关的文件夹则是使用默认的语言文件夹,若有则使用对应的语言文件夹。
对于app内部自己要进行语言的切换则是需要自己通过代码手动来进行切换对应的ConfigChanges事件。
实现步骤
1、创建相关的value文件夹和string.xml文件
2、 在对应的string文件中选择合适的翻译
values文件夹下的string文件(默认):
<resources><string name="app_name">乐背</string><string name="dialog_title">提示</string><string name="dialog_main_exit_text">今天不再背单词了吗?</string><string name="dialog_main_exit_yes">退出</string><string name="dialog_main_exit_no">再背会</string><string name="day">天</string><string name="words">词</string><string name="search">搜索</string><string name="set_goals">  设置目标  </string><string name="leaning_data"> 学习数据  </string><string name="CET_4_book_name">四级词汇书</string><string name="today_target">每日</string><string name="today_maintain">剩余</string><string name="learned_word">已学单词</string><string name="plan_today">今日计划</string><string name="need_learning">需新学</string><string name="need_review">需复习</string><string name="beging_learning">开始学习!</string><string name="function_expore">功能探索</string><string name="days_of_persistence">坚持天数</string><string name="accumulate_words">积累单词</string><string name="clock_in_calendar">打卡日历</string><string name="data_analysis">数据分析</string><string name="words_list">单词列表</string><string name="collected_word">收藏夹</string><string name="night_mode">夜间模式</string><string name="night_mode_tips">晚上开启夜间模式更护眼哦</string><string name="notification_bar">通知栏单词</string><string name="notification_bar_tips">通知栏显示单词,辅助更好学习</string><string name="language_setting">英语模式</string><string name="language_setting_tips">开启英语模式,感受英语氛围</string><string name="cloud_bridge">云端</string><string name="cloud_bridge_tips">数据云端备份/恢复</string><string name="about">关于</string><string name="about_tips">关于我/联系我</string><string name="know">认识</string><string name="vague">模糊</string><string name="dont_know">不认识</string><string name="ES">例句:</string>
</resources>
values_en文件夹下的string文件(英文):
<?xml version="1.0" encoding="utf-8"?>
<resources><string name="app_name">LeBei</string><string name="dialog_title">Tips</string><string name="dialog_main_exit_text">No More Words Today?</string><string name="dialog_main_exit_yes">Yes</string><string name="dialog_main_exit_no">No</string><string name="day">Days</string><string name="words">Words</string><string name="search">Searching</string><string name="set_goals"> Set </string><string name="leaning_data"> Learning Data </string><string name="CET_4_book_name">CET-4</string><string name="today_target">Every day</string><string name="today_maintain">Surplus</string><string name="learned_word">Hava Learned Words</string><string name="plan_today">Todays Plan</string><string name="need_learning">Need To Learn</string><string name="need_review">Need To Review</string><string name="beging_learning">Start Learning!</string><string name="function_expore">Function Expore</string><string name="days_of_persistence">Persistent Days</string><string name="accumulate_words">Accumumlate Words</string><string name="clock_in_calendar">Calendar</string><string name="data_analysis">Analysis</string><string name="words_list">Words List</string><string name="collected_word">Stared Word</string><string name="night_mode">Night Mode</string><string name="night_mode_tips">More Eye-Friendly To Turn On The Night Mode At Night</string><string name="notification_bar">Notification Words</string><string name="notification_bar_tips">Open Notification Bar Word</string><string name="language_setting">Chinese Mode</string><string name="language_setting_tips">Switch Chinese Mode</string><string name="cloud_bridge">Cloud Bridge</string><string name="cloud_bridge_tips">Data Cloud Backup / Recovery</string><string name="about">About</string><string name="about_tips">About Me / Contact Me</string><string name="know">Know</string><string name="vague">Vague</string><string name="dont_know">Don`t Know</string><string name="ES">ES:</string></resources>
3、在对应的view中使用该string字段
例:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:fitsSystemWindows="true"android:background="@color/colorBgLittleGrey"tools:context=".fragment.Fragment_function"><!-- TODO: Update blank fragment layout --><TextViewandroid:id="@+id/textView6"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="16dp"android:layout_marginLeft="16dp"android:text="@string/function_expore" //这里来进行使用!!!!!android:textColor="@color/colorTextBlackNomal"android:textSize="@dimen/appbar_text_size"android:textStyle="bold"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent" /><GridViewandroid:id="@+id/function_grid_view"android:layout_width="match_parent"android:layout_height="0dp"android:layout_marginTop="16dp"android:layout_marginLeft="16dp"android:layout_marginRight="16dp"android:horizontalSpacing="16dp"android:numColumns="2"android:verticalSpacing="16dp"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@+id/textView6" />
</androidx.constraintlayout.widget.ConstraintLayout>
对于为了适应手机语言切换来适配的进行到这一步就可以了。
对于APP内部主动进行修改的还要进行下面的步骤。
4、修改资源文件对应的Locale属性
在要修改语言的相应位置中加上相关代码:
switchToEnglish.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {// 获得res资源对象Resources resources = getActivity().getResources();// 获得屏幕参数,主要是用来下面的切换DisplayMetrics metrics = resources.getDisplayMetrics();// 获得配置对象Configuration config = resources.getConfiguration();@Overridepublic void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {if (isChecked) {config.locale = Locale.ENGLISH;locale = config.locale;Toast.makeText(getContext(), "切换为英语模式!", Toast.LENGTH_SHORT).show();} else {config.locale = Locale.CHINESE;Toast.makeText(getContext(), "切换为中文模式!", Toast.LENGTH_SHORT).show();}if (locale == Locale.ENGLISH) {updateActivity("English");} else {updateActivity("Chinese");}}});
在以上代码主要做的事情就是切换了config.locale的相关属性,详细见其源码。
5、 重启Activity
在修改完之后要重启Activity的时候才会重新载入相关属性,因此我们要做的第二步就是保存当前属性,重启Actiivity。
详细代码就是updateActivity方法:
public void updateActivity(String language) {//在本地SP中保存当前选择的语言SharedPreferencesUtils.setParem(getContext(), "languege", language);Locale local = this.locale;Resources res = getResources();DisplayMetrics dm = res.getDisplayMetrics();Configuration conf = res.getConfiguration();conf.locale = local;res.updateConfiguration(conf, dm);//设置好选择的语言以后,需要清除任务栈中的所有activity,打开首页,确保以后进入的页面都是当前选择的语言Intent intent = new Intent(getActivity(), MainActivity.class);//清空任务栈确保当前打开activit为前台任务栈栈顶intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);startActivity(intent);getActivity().finish();}
}
6、设置重启后恢复SP储存的属性
这里我参考网上的代码,在自定义Application当中来做:
public class MyApplication extends Application {private static Context context;@Overridepublic void onCreate() {super.onCreate();context = getApplicationContext();setCurrLanguageMode();}//设置当前APP的语言模式private void setCurrLanguageMode() {String language = (String) SharedPreferencesUtils.getParem(this, "languege", "");Locale local = LanguageUtils.getLocale(language);Resources res = getResources();DisplayMetrics dm = res.getDisplayMetrics();Configuration conf = res.getConfiguration();conf.locale = local;res.updateConfiguration(conf, dm);}public void init() {//LitePal.initialize(this);}
}
最终效果图
结束。
参考文章:
https://www.jianshu.com/p/ef749f54faba在这里插入图片描述
Android多语言切换/适配——以英语为例相关推荐
- Android多语言切换(兼容安卓9、10)
前言:Android应用的开发不可能仅仅针对某一个国家或者区域使用,因此APP必须支持多种语言,为了实现这个特性,Android给出了一个解决方案,在res文件夹下通过values+语言编码来实现多国 ...
- Android RadioButton 语言切换问题
偶然间发现在不退出界面的情况下,RadioButton在语言切换时会出现不同步的问题:本来整个界面是英文的,这时如果把语言切换成中文,则会出现界面是其它的部分都已经正常的加载了,但是RadioButt ...
- android 系统语言切换,Android系统切换语言更新应用界面方法
最近做的一个升级应用,在下载升级包的过程中又有一个toast类型的dialog悬浮在屏幕右上角,这个时候切换系统语言会出现问题. 当主屏幕为升级应用时,切换系统语言升级应用重启,而重启后并不能自动断点 ...
- Android 系统语言切换监听和设置
最近项目上产品经理提了个需求,要求关闭语言国际化,不管手机系统设置那个国家的语言,都要显示汉语,好吧,既然有需求,那就做吧.但是项目中已经有英文的配置了,且是作为默认String提供的,这么多翻译好的 ...
- Android多语言切换,字体风格,简体转繁体
DEMO地址:https://github.com/zhaopingfu/LanguageTypeface Android中多语言切换 在线简体中文转为繁体中文:http://www.vifo.com ...
- android多语言切换失效
最近一个项目中用到了多语言,可是在有些语言切换失效,挣扎许久终于找到问题了. 这是切换语言的代码: public void changeAppLanguage(String key) {Configu ...
- android 切换语言重启应用程序,Android 多语言切换无需重启APP的方式
简述 当APP需要给提供多种语音供用户使用的时候,作为开发者的我们自然要涉及到多语言切换的开发,希望我提供的方式能给需要的小伙伴们一点思路,老规矩先上图. 效果如下,可能看起来会比较卡(不知道为啥黑屏 ...
- android系统语言切换及系统烧写默认语言设置
Android 4.3 1 . 语言全局切换 重写Setting后需要全局切换语言(中英.中阿等),查看原生的Setting代码,抽出切换语言部分,具体实现如下: zh_CN,这是原始localeSt ...
- Android 中英文语言切换
非常简便,只需替换一个文件再添加上去即可 strings和-zh文件链接:https://download.csdn.net/download/meixi_android/11367095 1.首先替 ...
最新文章
- linux高性能网络编程,Linux高性能网络编程的介绍
- ubuntu彻底卸载mysql并且重新安装
- PHP执行一个http请求
- 学习opencv3中文版_给视觉组新生的一点学习建议
- Java基础学习总结(161)——Java 重试机制
- BZOJ1433[ZJOI2009]假期的宿舍——二分图最大匹配
- 那年,寻找工作的历程
- r语言html帮助是什么东西,R语言帮助的使用
- 图片涂改了怎么给复原_图片马赛克怎么去掉 怎么去除马赛克方法介绍
- linux 下tftp服务器搭建,CentOS 6下搭建TFTP服务器
- 轻量级cad绘图工具FoxCAD for mac
- [转载]厚积博发,有的放矢
- 中国海洋大学计算机系实习报告,中国海洋大学海洋学实习报告.doc
- 基于微信公众平台API的菜谱小程序 的设计与实现
- spring事务管理器的源码和理解
- QQ防诈骗记录查询-网络交易信誉分查询认证源码
- Request method XXX not supported
- 基于 Python 的时序模型——AMIRA模型
- Python安全工具编写-pcap流量包重放
- linux环境开启kettle Carte