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 {

// 繁体中文时用的resources

Resources mResources;

public NotePaperImageDownloader(Context context) {

super(context);

}

public NotePaperImageDownloader(Context context, int connectTimeout, int readTimeout) {

super(context, connectTimeout, readTimeout);

}

@Override

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

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

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

  2. android 语音播报(通过手说tts 实现中文语音播报)

    手说TTS介绍: 关于手说tts中文语音包的详细资料可以查看官网 http://shoushuo.com/index.html 手说TTS,是Android平台下的中文语音引擎,提供了中文文本到语音的 ...

  3. android 语音播报中文,android 语音播报(通过手说tts 实现中文语音播报)

    手说TTS介绍: 手说TTS,是Android平台下的中文语音引擎,提供了中文文本到语音的转换. 使用手说TTS进行中文文本的朗读,包括中文简繁体.阿拉伯数字.英文字母及一些符号的混读.并且处理了中文 ...

  4. Android获取系统语言(区分简体中文和繁体中文) .

    之前做android应用时遇到过一个问题,就是根据语言的不同而显示不同的内容 网上很多代码都是错误的,起码无法区分简体和繁体,这里给出一种方法 不涉及android任何知识,所以就归类到java这边了 ...

  5. android 语音通信,Android与PC间的语音通信

    主要问题是语音格式的编码解码. Android端使用android.media包,AudioRecord获取由麦克风采样的语音,格式为: private final static int Sample ...

  6. android语音插件,Android平台离线打包 - 语音识别(Speech)插件配置

    百度语音设置 需要添加的文件 将以下文件放入工程的libs下 路径 文件名SDK\libs speech-release.aar.speech_baidu-release.aar AndroidMan ...

  7. 如何调试Android语音功能,Android如何添加语音功能

    语音指令是可穿戴体验的一个重要的部分.这使得用户可以释放双手,快速发出指令.穿戴提供了2种类型的语音操作:系统提供的 这些语音指令都是基于任务的,并且内置在Wear的平台内.我们在activity中过 ...

  8. Android手机模拟器如何把语言设置为中文

    1.打开安卓模拟器,找到Setting(设置)选项卡并打开,如图所示: 2.找到Language and Input(语言和输入法)选项卡并打开,如图所示: 3.点击最上方的Languages选项卡, ...

  9. Android 项目国际化 多国语言适配

    近期一个项目 ,为了响应一带一路政策...要做国际化 适配三国语言(中文,英语,葡萄牙语) emmm.... 那就开始搞吧 首先在项目里面  写好要适配国家的values-xxx-xx 比如: 各个国 ...

  10. android语音动画,Android逐帧动画的简单使用-语音播放效果的实现

    逐帧动画(Frame-By-Frame Animation)原理很简单,即快速切换不同的图片,形成动画效果.Android中逐帧动画的实现方式也很简单,下面以语音播放效果为例说明. 1. 首先准备图片 ...

最新文章

  1. java 内核线程_Java:如何根据cpu内核扩展线程?
  2. gb2312转utf-8linux,linux GB2312转UTF-8 shell脚本
  3. Linux根文件系统介绍
  4. PHP从入门到跑路(二),基础语法,数据库操作
  5. 超详细的Hadoop2配置详解
  6. 图片处理--冰冻特效
  7. 如何在 macOS Monterey 中更改光标的颜色样式?
  8. ASP.NET 系列_01_Web Pages 教程
  9. autojs遍历当前页面所有控件_移动端控件(一)-弹窗(Alert/Dialog)
  10. #今日论文推荐#罗格斯大学王灏:保持孩子般的好奇心
  11. C语言打印杨辉三角的多种方法
  12. android用户界面组件都是放置在,Android开发工程师第十章 节 用户界面高级组件.ppt...
  13. 2000字精华总结,安利一个超好用的 Python 数据分析神器
  14. Failed to check the status of the service. No provider available for the service【已解决】
  15. BZOJ 5293 求和(LCA)
  16. 南柯33的Python学习笔记第(一)部分
  17. Flutter 全能型选手GetX —— 依赖管理
  18. 接口请求返回的状态码总览
  19. 解决MYSQL 8小时连接问题
  20. 【Angular实战/网易云】用户签到(interceptor使用)

热门文章

  1. 转:C语言面试题大汇总 (图像处理方向)
  2. C#iText7对PDF进行签章
  3. SecureBlackbox 2022细粒度控制的同时
  4. 02 Ajax表单提交
  5. 【机器学习】逻辑回归(LogisticRegression)原理与实战
  6. js 判断是域名还是ip并获取当前url中指定部分
  7. cv2.imread()、cv2.putText、cv2.imwrite()、cv2.waitKey()
  8. DAU/MAU?UGC?
  9. 关于嵌入式面试的一些题
  10. 如何截取视频中的一部分制作成GIF动态图