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多语言适配繁体中文相关推荐

  1. android 语音适配,Android多语言适配繁体中文

    Android多语言适配一般默认是values/drawable目录下的文件是英文语言的资源,如果在中文下使用不同的资源则需要新建values-zh/drawable-zh-xxxdpi这样,res目 ...

  2. Android多语言适配values文件夹命名

    对于App开发而言,Android多语言适配实在太简单了,新增values文件夹就可以了,只是很多人不清楚每一种语言对应的代号. 当然正常App不需要支持这么多语言吧.最简单的3个就OK了,value ...

  3. android多语言适配--语言对应的资源文件夹名称

    android多语言适配--语言对应的资源文件夹名称 众所皆知.Android开发中,res资源文件夹下,可以根据不同的文件名后缀(连接符(-)加限定符)来区别不同的资源. android在运行时使用 ...

  4. 系统语言为繁体中文时适配APP

    有些机型可以设置语言和地域,有些只能设置语言.以汉语为例,有香港繁体.台湾繁体.简体等几种语言. 若只需要APP根据当前语言来适配(此时和地域无关),比如只要手机系统设置了繁体(不管地域选择的是中国. ...

  5. Android——多语言适配

    多种语言适配无疑对于Android是最简单的事情了,只需要新建values文件夹就可以了.更多的人不知道对应的语言要如何命名文件夹,如图表示的是中文(台湾) 以下是部分对应的命名. 西班牙文(西班牙) ...

  6. android 设置繁体环境,Android更改中文和繁体中文的区域设置无法正常工作

    在我的应用程序中,我可以选择从中文切换到繁体中文 . 我使用的是微调器,其中1号是中文,2号是繁体中文 . 选择位置1时,这是我的代码切换语言 if (pos == 0) { langSelected ...

  7. Android 多语言适配

    最近在做多语言适配需要注意两个点: 系统语言和用户选择的语言 res文件下values命名 这里只给出values命名: 英语(美国):values-en-rUS 英语(英国):values-en-r ...

  8. android 的语言适配

    转自:http://blog.csdn.net/u011002668/article/details/50442210 1.在res文件目录下分别创建不通的values文件夹 2.在文件夹里面创建st ...

  9. Android根据语言适配货币符,ios – 使用NSLocale根据国家/地区代码或国家/地区名称获取货币符号...

    我想使用NSLocale显示基于国家名称或国家/地区代码的货币符号我有所有国家/地区名称列表.假设我选择了USA然后返回$Currency 代码: NSLocale *locale = [NSLoca ...

最新文章

  1. Hadoop HA 机制学习:HA是怎么运作,QJM又是怎么发挥功效的
  2. Windows XP字体模糊
  3. 如何在运行时打印出 SAP Spartacus 配置(config)信息
  4. POJ 2777 ZOJ 1610 HDU 1698 --线段树--区间更新
  5. p(y|x,z)=p(x,y,z)/p(x,z)的解释
  6. Maven历史版本下载
  7. 上学前夕-心里有种说不出的感觉-眼里酸酸的
  8. linux桌面lxde 安装_Ubuntu怎么安装轻量级的LXDE桌面
  9. Fast R-CNN文章翻译笔记
  10. Centos8.0编译安装稳定最新版的nginx
  11. HG30-3交直流校准源
  12. 第五章 如何使用java中的线程打印偶数和奇数
  13. 数学笔记31——幂级数和泰勒级数
  14. C语言中宽字符和多字节字符
  15. 勇芳VFB的Miniblink组件实现文件下载
  16. Git之多人协同开发
  17. 人工智能中的运筹学与最优化就该这样学之著名教材
  18. h5页面 iOS 回退上一页面白屏,滑动页面后正常
  19. win10连接网线的时候开启移动热点就没网了
  20. Android开发之经典的Arity Calculator图形计算器

热门文章

  1. 群晖Video Station刮削器使用指南
  2. 2021全球与中国红外传感器芯片市场现状及未来发展趋势
  3. SPI与SSP的区别?
  4. libgo高性能网络服务器,gnet: 轻量级且高性能的 Golang 网络库
  5. 容器操作基础命令随记
  6. ti图形计算机论文,TI―Nspire图形计算器支持下的数学探究
  7. 编一段输出“nihao”的c++程序
  8. iOS错误:Error: ImageIO: PNG IDAT: invalid stored block lengths
  9. 滴答验箱视频智能验箱演示,司机随时随地验箱区分好坏箱,箱信息+箱况报备,套箱云堆场,智慧航运智能化船公司智能化数字化集装箱管控
  10. 学python笔记本什么牌子好且实惠实用_想自学python,应该买什么牌子的笔记本?...