Android多语言适配繁体中文
Android多语言适配一般默认是values/drawable目录下的文件是英文语言的资源,如果在中文下使用不同的资源则需要新建values-zh/drawable-zh-xxxdpi这样,res目录下的命名规则是drawable-语言-国家-xxxdpi,在没有特定国家的资源会先找语言相关的目录。但是中文有点特别!这也是一个坑,按常规思维drawable-zh应该是简体中文/繁体中文共有的资源,就是如果没有drawable-zh-rTw或drawable-zh-rHK的资源的话当切到繁体中文时会去drawable-zh查找资源,这样想是大错特错,实际的结果是没有繁体资源时系统会去默认的目录下查找,也就是在drawable或drawable-xxxdpi这些目录找,这个是android的bug还是故意认为HK和TW不是我大中华的?
废话不多话说,实际开发过程中会有这样的需求,就是希望所有的中文不管是繁体还是简体都是共用资源的,根据上面说的规则,如果不分别在zh-rTW和zh-rHK都放入资源的话是不可能做到了,那如果还是想省点资源怎么办呢?下面就是说说图片资源如何做到这点,这里关键要了解android资源的实现,android资源像ImageView查找资源是通过Resources来操作的,来看ImageView查找图片时的关键函数:
private void resolveUri() {if (mDrawable != null) {return;}if (getResources() == null) {return;}Drawable d = null;if (mResource != 0) {try {// 关键的地方d = mContext.getDrawable(mResource);} catch (Exception e) {Log.w(LOG_TAG, "Unable to find resource: " + mResource, e);// Don't try again.mResource = 0;}} else if (mUri != null) {d = getDrawableFromUri(mUri);if (d == null) {Log.w(LOG_TAG, "resolveUri failed on bad bitmap uri: " + mUri);// Don't try again.mUri = null;}} else {return;}
}updateDrawable(d);}
可以知道关键的地方是能过context.getDrawable来拿到的,如果我们能重写这个函数是不是就可以搞定了?答案是不能,因为这个函数是final不能被重写的,实现如下:
public final Drawable getDrawable(@DrawableRes int id) {return getResources().getDrawable(id, getTheme());
}
能怎么办呢,答案就从上面getDrawable函数的实现找到,getDrawable是能过getResources().getDrawable来实现的,如果能重写getResources,在这里判断是否是繁体,如果是则去zh目录下查找资源,来看getResources的实现:
// Context.java
public abstract Resources getResources();
看到这里,你应该知道这个思路是可以的!于是按思中路实现,首先判断是否是繁体,然后去默认中文目录下查找
第一步:
判断是用什么语言和国家可以用resources获取config
Locale locale = context.getResources().getConfiguration().locale;
if (locale.getLanguage().equals("zh") && !locale.getCountry().equals("CN")) {
// 繁体中文
}
第二步:
去中文目录查找,首先得有一个中文的resources,当前activity的resources是繁体的,是不能直接调用的,实现方法如下:
private static void updateResource(Resources resource, Locale l) {Configuration config = resource.getConfiguration();config.locale = l;resource.updateConfiguration(config, null);
}private static Resources getApplicationResource(PackageManager pm, String pkgName, Locale l) {Resources resourceForApplication = null;try {resourceForApplication = pm.getResourcesForApplication(pkgName);updateResource(resourceForApplication, l);} catch (PackageManager.NameNotFoundException e) {}return resourceForApplication;
}
//得到简体中文的resources,由于简体中文没有资源,所以会去默认的中文下去找
Resources resources = getApplicationResource(context.getApplicationContext().getPackageManager(),context.getPackageName(), new Locale("zh", "CN"));
综合起来是重写Activity的getResources:
@Override
public Resources getResources() {Locale locale = context.getResources().getConfiguration().locale;if (locale.getLanguage().equals("zh") && !locale.getCountry().equals("CN")) {// 繁体中文Resources resources = getApplicationResource(context.getApplicationContext().getPackageManager(),context.getPackageName(), new Locale("zh", "CN"));if (resources != null) {return resources;}}return super.getResources();
}
这样就实现了所有中文上都共用一套资源!上面的示例在xml中指定资源或者在代码里getDrawable可以这么使用,如果是用第三方图片加载库怎么实现?这里展示一下ImageLoader的实现:
ImageLoader加载资源是默认是通过BaseImageLoader去加载的,加载时会调用BaseDownloader去获取资源,我们只要自定义Downloader就可以了:
public class NotePaperImageDownloader extends BaseImageDownloader {// 繁体中文时用的resourcesResources mResources;public NotePaperImageDownloader(Context context) {super(context);}public NotePaperImageDownloader(Context context, int connectTimeout, int readTimeout) {super(context, connectTimeout, readTimeout);}@Overrideprotected InputStream getStreamFromDrawable(String imageUri, Object extra) {Locale locale = context.getResources().getConfiguration().locale;if (locale.getLanguage().equals("zh") && !locale.getCountry().equals("CN")) {// 繁体中文,使用简体中文的资源进行加载,否则在没有指定繁体资源时默认会去英文下找,会不会去drawable-zh-xx去找if (mResources == null) {Resources resources = getApplicationResource(context.getApplicationContext().getPackageManager(),context.getPackageName(), new Locale("zh", "CN"));if (resources == null) {return super.getStreamFromDrawable(imageUri, extra);}mResources = resources;}String drawableIdString = Scheme.DRAWABLE.crop(imageUri);int drawableId = Integer.parseInt(drawableIdString);return mResources.openRawResource(drawableId);} else {return super.getStreamFromDrawable(imageUri, extra);}}
}
总结:
关于android资源的加载,只要熟悉资源加载框架context/resources/assetmanger几个关键的类就可以做很多事。
Android多语言适配繁体中文相关推荐
- android 语音适配,Android多语言适配繁体中文
Android多语言适配一般默认是values/drawable目录下的文件是英文语言的资源,如果在中文下使用不同的资源则需要新建values-zh/drawable-zh-xxxdpi这样,res目 ...
- Android多语言适配values文件夹命名
对于App开发而言,Android多语言适配实在太简单了,新增values文件夹就可以了,只是很多人不清楚每一种语言对应的代号. 当然正常App不需要支持这么多语言吧.最简单的3个就OK了,value ...
- android多语言适配--语言对应的资源文件夹名称
android多语言适配--语言对应的资源文件夹名称 众所皆知.Android开发中,res资源文件夹下,可以根据不同的文件名后缀(连接符(-)加限定符)来区别不同的资源. android在运行时使用 ...
- 系统语言为繁体中文时适配APP
有些机型可以设置语言和地域,有些只能设置语言.以汉语为例,有香港繁体.台湾繁体.简体等几种语言. 若只需要APP根据当前语言来适配(此时和地域无关),比如只要手机系统设置了繁体(不管地域选择的是中国. ...
- Android——多语言适配
多种语言适配无疑对于Android是最简单的事情了,只需要新建values文件夹就可以了.更多的人不知道对应的语言要如何命名文件夹,如图表示的是中文(台湾) 以下是部分对应的命名. 西班牙文(西班牙) ...
- android 设置繁体环境,Android更改中文和繁体中文的区域设置无法正常工作
在我的应用程序中,我可以选择从中文切换到繁体中文 . 我使用的是微调器,其中1号是中文,2号是繁体中文 . 选择位置1时,这是我的代码切换语言 if (pos == 0) { langSelected ...
- Android 多语言适配
最近在做多语言适配需要注意两个点: 系统语言和用户选择的语言 res文件下values命名 这里只给出values命名: 英语(美国):values-en-rUS 英语(英国):values-en-r ...
- android 的语言适配
转自:http://blog.csdn.net/u011002668/article/details/50442210 1.在res文件目录下分别创建不通的values文件夹 2.在文件夹里面创建st ...
- Android根据语言适配货币符,ios – 使用NSLocale根据国家/地区代码或国家/地区名称获取货币符号...
我想使用NSLocale显示基于国家名称或国家/地区代码的货币符号我有所有国家/地区名称列表.假设我选择了USA然后返回$Currency 代码: NSLocale *locale = [NSLoca ...
最新文章
- Hadoop HA 机制学习:HA是怎么运作,QJM又是怎么发挥功效的
- Windows XP字体模糊
- 如何在运行时打印出 SAP Spartacus 配置(config)信息
- POJ 2777 ZOJ 1610 HDU 1698 --线段树--区间更新
- p(y|x,z)=p(x,y,z)/p(x,z)的解释
- Maven历史版本下载
- 上学前夕-心里有种说不出的感觉-眼里酸酸的
- linux桌面lxde 安装_Ubuntu怎么安装轻量级的LXDE桌面
- Fast R-CNN文章翻译笔记
- Centos8.0编译安装稳定最新版的nginx
- HG30-3交直流校准源
- 第五章 如何使用java中的线程打印偶数和奇数
- 数学笔记31——幂级数和泰勒级数
- C语言中宽字符和多字节字符
- 勇芳VFB的Miniblink组件实现文件下载
- Git之多人协同开发
- 人工智能中的运筹学与最优化就该这样学之著名教材
- h5页面 iOS 回退上一页面白屏,滑动页面后正常
- win10连接网线的时候开启移动热点就没网了
- Android开发之经典的Arity Calculator图形计算器
热门文章
- 群晖Video Station刮削器使用指南
- 2021全球与中国红外传感器芯片市场现状及未来发展趋势
- SPI与SSP的区别?
- libgo高性能网络服务器,gnet: 轻量级且高性能的 Golang 网络库
- 容器操作基础命令随记
- ti图形计算机论文,TI―Nspire图形计算器支持下的数学探究
- 编一段输出“nihao”的c++程序
- iOS错误:Error: ImageIO: PNG IDAT: invalid stored block lengths
- 滴答验箱视频智能验箱演示,司机随时随地验箱区分好坏箱,箱信息+箱况报备,套箱云堆场,智慧航运智能化船公司智能化数字化集装箱管控
- 学python笔记本什么牌子好且实惠实用_想自学python,应该买什么牌子的笔记本?...