Android对国际化与多语言切换已经做得不错了,一个应用只要命名相应语系的values-[language]文件夹,通过“设置”→“语言&键盘”→“选择语言”即可实现应用多种语言的切换。 但如何在应用里自己实现?搜索过发现网上有如下的做法:
先上效果图: 前两种方法的原理即在应用里实现“选择语言”。通过查看源码,其核心代码为:
1. API欺骗 烧制到手机中的android.jar包含了Android所需的各种类与方法;而供开发者使用的android.jar只是其中的一部分。API欺骗是指在应用中去模拟未公开的类和方法让应用编译通过并生成APK,然而在应用实际运行中调用的却仍是烧制到手机中真实的android.jar。 通过核心代码可以看到我们要模拟的是ActivityManagerNative中的一个方法getDefault()和IActivityManager中的两个方法getConfiguration()与updateConfiguration(config)。参照源码,应用的工程结构图及代码模拟如下: 工程结构图: 代码:
2. Java反射机制 不多说了,Java反射机制入门教程: http://java.sun.com/developer/te ... flection/index.html 之前写过的几个使用Java反射的例子: [Android]获取未安装的APK图标(原创非转帖) http://blog.csdn.net/sodino/article/details/6215224 [Android]挂断、接听电话 http://blog.csdn.net/sodino/article/details/6181610 直接上代码:
3. 自己转换语系(哈哈,这个名字很现实啊) 动手实现嘛,啥都系统弄好了,那程序员的存在还有什么意义呢。 自己转换语系有点麻烦,先看工程结构图: values/strings.xml与xml/english.xml的内容是相同的;values-zh-rCN/strings.xml与xml/chinese.xml的内容也是相同的。出现这样的冗余是因为生成APK时values下的内容都打到rasc去了,读取不了了。 自己实现语系的转换需要考虑到: 3.1 R.xxxxx.id与对应语系中文本串的对应(需要特别考虑到R.array.string字符串数组)。 3.2 解析xml。 3.3 设置语系后,所有界面元素的手动刷新。 在xml中声明一个string是这个的格式:
3.2 解析XML |
Android对国际化与多语言切换已经做得不错了,一个应用只要命名相应语系的values-[language]文件夹,通过“设置”→“语言&键盘”→“选择语言”即可实现应用多种语言的切换。 但如何在应用里自己实现?搜索过发现网上有如下的做法:
先上效果图: 前两种方法的原理即在应用里实现“选择语言”。通过查看源码,其核心代码为:
1. API欺骗 烧制到手机中的android.jar包含了Android所需的各种类与方法;而供开发者使用的android.jar只是其中的一部分。API欺骗是指在应用中去模拟未公开的类和方法让应用编译通过并生成APK,然而在应用实际运行中调用的却仍是烧制到手机中真实的android.jar。 通过核心代码可以看到我们要模拟的是ActivityManagerNative中的一个方法getDefault()和IActivityManager中的两个方法getConfiguration()与updateConfiguration(config)。参照源码,应用的工程结构图及代码模拟如下: 工程结构图: 代码:
2. Java反射机制 不多说了,Java反射机制入门教程: http://java.sun.com/developer/te ... flection/index.html 之前写过的几个使用Java反射的例子: [Android]获取未安装的APK图标(原创非转帖) http://blog.csdn.net/sodino/article/details/6215224 [Android]挂断、接听电话 http://blog.csdn.net/sodino/article/details/6181610 直接上代码:
3. 自己转换语系(哈哈,这个名字很现实啊) 动手实现嘛,啥都系统弄好了,那程序员的存在还有什么意义呢。 自己转换语系有点麻烦,先看工程结构图: values/strings.xml与xml/english.xml的内容是相同的;values-zh-rCN/strings.xml与xml/chinese.xml的内容也是相同的。出现这样的冗余是因为生成APK时values下的内容都打到rasc去了,读取不了了。 自己实现语系的转换需要考虑到: 3.1 R.xxxxx.id与对应语系中文本串的对应(需要特别考虑到R.array.string字符串数组)。 3.2 解析xml。 3.3 设置语系后,所有界面元素的手动刷新。 在xml中声明一个string是这个的格式:
3.2 解析XML |