android客户端的语言国际化支持

来源:互联网 发布:世界征服者3 数据同步 编辑:程序博客网 时间:2024/05/17 06:03

android客户端的语言国际化支持

一个程序,如果要做到国际化(i18n),也就是在UI的语言上要有多种语言的支持,一般的做法是在应用程序的开发layout中补充多种语言的文本内容,然后调用android系统进行应用语言的切换,不过这样做需要先退出应用程序,在选择语言后,重新打开应用.

而本工程的要求则简化为,在某一个界面选择了语言类型后,只需要对现已呈现的界面刷新下文本内容,其他还未展示UI的文本内容,在布局UI,判别下条件,在默认显示语言类型与已挑选语言类型中选择即可.

原理是,在每一个文本显示内容处,在判断是否挑选了某特定语言类型并加载成功后,通过该处特定的代码逻辑位置(开发人员根据要求应该知道在某一个界面的某处位置需要显示什么样的对应内容),以某个key值去一张存储文本内容的hash表中查询得到对应的文本内容,然后就可以显示不同的语言类型的文本内容了;

hash表中的内容是通过加载语言资源文件,来得到key值与对应value的文本内容,这样相当于是查表得到的.

语言文本资源的准备

本机上的文本资源是把整个项目要显示的文本内容,按照一定的格式进行编辑,然后存储成ini格式的文件.INI文件由节、键、值组成,正好对应hash表的key-value结构;

如相同文本内容的资源文件编辑如下:

中文:

[INIT]

init_appellation = 亲爱的女士和先生:

init_welcomeword = 欢迎来到本酒店,请享受这快乐的假日.

[HOME]

home_notify = 这是主功能界面

然后把文件存储成XXX.ini文件,放置于android工程的assets文件夹中,参考说明

http://abc20899.iteye.com/blog/1096620

注意的是,ini文件存储时要选择utf-8格式存储,并且注意是否选取有无bom标记,如果是选择了有bom标记的,读取文件时需要自行过滤掉该处于文件头部的标记,否则自己的解码部分容易报错.

文本资源的读取

1、调用getAssets(),通过指定的context来获取AssetManager引用对象。

2、AssetManageropen(String fileName, int accessMode)方法则指定读取的文件以及访问模式就能得到输入流InputStream

参数accessMode,指定了系统获取资源的模式:

ACCESS_BUFFER :加载文件到内存中,这种方式适合小文件的读取;

ACCESS_RANDOM:可以随意的向前或者向后的读取数据块

ACCESS_STRAMING:顺序的读取内容

ACCESS_UNKNOWN:当没有明确指定时,使用默认模式

这里我们一定要注意,open(String fileName)默认的使用ACCESS_STREAMING模式进行读取.

3、用已经open file inputStream读取文件,读取完成后记得inputStream.close()

4、不要调用AssetManager.close来关闭AssetManager 对象,因为这个对象会被系统调用.

、hashtable简介

哈希表,根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。

Hashtable中的方法是同步的,即是说,在多线程应用程序中,不用专门的操作就安全地可以使用Hashtable了;HashTable不允许null(keyvalue都不可以)

使用put/get命令来对hashtable进行存值/取值操作。

四、示例的代码:

1、给某个按钮绑定一个监听器,onClick的动作是弹出一个PopupWindow对象,在该PopupWindow对象上生成表明语言种类的按钮,供进一步调用;

public void onClick(View v) 

{

View contentView = initPopWindow(v.getContext());

languageMenu = new PopupWindow(contentView, LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);

//the next line's attempt is enable the back_key close the PopupWindow

languageMenu.setBackgroundDrawable(new BitmapDrawable());

languageMenu.setFocusable(true);

languageMenu.setOutsideTouchable(true);

languageMenu.setTouchable(true);

languageMenu.setAnimationStyle(R.style.PopupAnimation);

languageMenu.showAtLocation(v, Gravity.CENTER, 0, 0);

......}

private View initPopWindow(Context _context) 

{

listener = new LanguageA2ZandCancelChooseListener(initHandler, popHandler);

RelativeLayout language_bg = new RelativeLayout(_context);

language_bg.setBackgroundColor(0xb0000000);

......

return language_bg;

}

2、申请一个handler对象,用来处理PopupWindow的关闭;

Handler popHandler = new Handler()

{

public void handleMessage(Message msg) 

{

if (languageMenu != null && languageMenu.isShowing())

languageMenu.dismiss();

}

};

3、给对应语言字母的按钮绑上监听器,监听器的任务就是针对触发的按钮,选择合适的语言ini文件,进行内容的解码和加载就可以了。

关于语言种类的获取与显示:

假设服务器要求客户端支持语言A

服务器有的语言类型

客户端支持语言类型

语言配置文件读取成功

实际显示语言

N/A

N/A

false

默认语言

true

true

true

A

true

false

true

默认语言

false

N/A

N/A

不显示

0 0