Android应用开发之Android开发国际化入门教程
凌雪 2018-10-24 来源 :网络 阅读 1405 评论 0

摘要:本文将带你了解Android应用开发之Android开发国际化入门教程,希望本文对大家学Android有所帮助。

本文将带你了解Android应用开发之Android开发国际化入门教程,希望本文对大家学Android有所帮助。


国际化
支持不同语言,在不同的国家都可以使用。
本文将会介绍如下节点:
实现 string 资源的国际化
简繁体切换实现
在现有业务上,做国际化遇到的一些问题
string 资源的国际化实现
在 Android 开发规范中,我们一般不建议在代码或者布局文件中 hard code 我们 string 字符串,而是需要将这些字符串放在单独的 string.xml 文件。
错误示例
   
    正确的姿势
   
    2.实现步骤
2.1 创建语言区域目录
在 res/ 文件中创建对应国家或者地区资源文件,具体如下
创建语言区域目录
   
    res/value-ISO语言代码
   
    res/value 默认的语言目录 res/value-zh 表示中国 res/value-zh-rHK 表示中国香港 res/value-zh-rTW 表示中国台湾 res/value-zh-rMO 表示中国澳门 res/value-es 表示美国 ….
本文演示的是中文简体和繁体的国际化,所以下面展示的是中国台湾,香港繁体和中文简体。
   
    2.2 创建语言区域目录对应的字符串文件
   
    默认的   res/value/strings.xml
   
    ?123<resources>    <string   name="text">纸短情长-默认</string></resources>
   
    res/value-zh-rHK/strings.xml
   
    ?123<resources>    <string   name="text">紙短情長-HK</string></resources>
   
    res/value-zh-rTW/strings.xml
   
    ?123<resources>    <string   name="text">紙短情長-TW</string></resources>
2.3 应用资源文件
?1<textview android:id="@+id/text"   android:layout_height="wrap_content"   android:layout_width="wrap_content"   android:text="@string/text"   app:layout_constraintbottom_tobottomof="parent" app:layout_constraintleft_toleftof="parent"   app:layout_constraintright_torightof="parent"   app:layout_constrainttop_totopof="parent"></textview>
2.4 测试
在这里调节不同的语言环境就可以看到加载不同的资源文件了。
3. 简繁体切换实现
   
    本地的语言环境是简体,但是我们在需要在应用动态读取繁体资源。这种操作意味着去更新应用的 Configuration 配置信息。
   
    3.1 操作步骤
获取一个需要转化的 Locale 对象 读取 Configuration 配置信息 修改locale为目标locale 更新configuration 重启Activity
注意:当修改 Configuration 之后,需要调用Activity#recreate() 方法重新创建 activity 。
3.2 简体转繁体
/** * 简体转繁体 * * @param view */public void s2t(View view)   {    // 本地语言设置    // 获取一个需要转化的 Locale 对象    Locale   myLocale = Locale.TAIWAN;    Resources res =   getResources();    DisplayMetrics dm =   res.getDisplayMetrics();    //读取 Configuration 配置信息    Configuration conf =   res.getConfiguration();    //修改locale为目标locale    conf.locale   = myLocale;    //更新configuration    res.updateConfiguration(conf,   dm);    //重启Activity    recreate();}
3.3 繁体转简体
/** * 繁体转简体 * * @param view */public void t2s(View view)   {    // 本地语言设置    Locale myLocale =   Locale.CHINESE;    Resources res =   getResources();    DisplayMetrics dm =   res.getDisplayMetrics();    Configuration conf =   res.getConfiguration();    conf.locale =   myLocale;    res.updateConfiguration(conf,   dm);    //重启Activity    recreate();}
4. 在现有业务上,做国际化遇到的一些问题
   
    一般的应用在开发初期只会针对国内用户进行开发,也就是一般不会去做国际化,当我们应用发展到一定的规模之后就需要往海外市场拓展。
   
    下面就会有一个这样需求,就是在当前的简体中文版基础上开发一个繁体中文版。需要国际化,就需要解决以下几个问题:
服务端接口是简体中文。 …
4.1 服务端接口国际化
因为时间比较赶,无法让服务端去修改接口,所以只能在客户端获取到接口数据之后,在进行简繁体转换。
因为项目使用是 OKHTTP 网络请求框架,因此我们使用拦截器的方式拦截返回的响应 Response 对象,修改返回内容来实现接口数据国际化。
定义拦截器
   
    在这里定义的拦截器中是   Application Interceptor 拦截器。放在 OKHTTP 拦截器自带拦截器之前,也就是说在这个拦截器得到的响应就是网络请求得到数据的响应,因此在这里修改响应内容即可。
   
    注意在读取 final String   content = response.body().string(); 之后,对应的流会被关闭,那么这时上层获取到 Response 之后,在调用 body().string()就会报错,因此我们在读取数据,并转化为繁体之后,需要构造一个新的 ResponseBody 给 Response 即可。
public class Simple2TraditionChineseInterceptor   implements Interceptor   {    @Override    public Response   intercept(Chain chain) throws IOException   {        Response response =   chain.proceed(chain.request());         if   (response.body() != null && response.body().contentType() != null)   {             final   MediaType mediaType =   response.body().contentType();             final   String content =   response.body().string();             String   convertResult =   content;              JChineseConvertor   jChineseConvertor =   JChineseConvertor                     .getInstance();             //将简体数据转化为繁体            try   {                final   String convertToTraditionalChinese = jChineseConvertor.s2t(content);                if   (!TextUtils.isEmpty(convertToTraditionalChinese))   {                    convertResult   =   convertToTraditionalChinese;                }            }   catch (Exception e) {                //当转化异常时,使用默认返回的数据                Logger.e("接口返回数据转化失败");                e.printStackTrace();            }             //构造一个新的ResponseBody,因为 response.body().string() 调用之后会把流关闭,因此这里要新建。            ResponseBody   responseBody = ResponseBody.create(mediaType,   convertResult);             response   = response.newBuilder().body(responseBody).build();        }        return   response;    }}
配置拦截器
public static OkHttpClient getClient()   {    if (client == null)   {        synchronized   (HttpUtils.class){            if   (client==null) {                OkHttpClient.Builder   builder = new   OkHttpClient.Builder();                builder.connectTimeout(CONNECT_TIMEOUT_MILLIS,   TimeUnit.MILLISECONDS);                builder.readTimeout(READ_TIMEOUT_MILLIS,   TimeUnit.MILLISECONDS);                builder.writeTimeout(WRITE_TIMEOUT_MILLIS,   TimeUnit.MILLISECONDS);                builder.addInterceptor(new   ReportInterceptor());   // 添加上报接口性能                //判断是否对接口进行简繁体转换                if   (LiveCore.isShowTraditionalChinese())   {                    builder.addInterceptor(new   Simple2TraditionChineseInterceptor());   // 国际化                }                client   = builder.build();            }        }    }    return   client;}    

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之Android频道!

本文由 @凌雪 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved