Flex开发的一些经验总结——本地化(多语言)实现

良好的本地化一直是一个成熟的软件系统必备的,通常须要在若干语言properties文件中切换,先作出一份模板的语言文件(好比en_US),而后交给翻译团队翻译成各类语言文件。本文讲述如何配置Flex,使得能编译多语言版本的swf,以及如何进行自定义的ResourceManager封装。 svn

简单配置步骤

1.新建一个名为resource的文件夹,并在其下创建locale文件夹,在locale文件夹下创建zh_CN.properties和en_US.properties以及别的你想支持的语言。 函数

2.配置项目的源代码目录,增长resources/locale/{locale},这样就能让编译器找到语言文件。 ui

3.配置项目属性中的编译命令,增长-locale zh_CN en_US,让编译器在编译的时候编译进swf。 google

若是还有不清楚的地方能够查阅个人UI项目:ReflectProxyServerUI url

ResourceManager的封装

对于Flex来讲,因为有绑定的支持,完成这些事情变得很是容易。 Flex有ResourceManager提供这类的支持,这个类用来管理Flex代码中用到的资源(字符串,图片等)。惟一一点不方便的地方是,每次使用的时候都传入一个bundle_name,让我以为有点不方便,所以考虑封装下,提供相似getString(resName:String, para:Array = null)的接口。并且切换语言的时候能够作到即时把界面上的字符串全都替换成目标语言。不过对于大型系统来讲这样作会致使界面卡住,由于Bindable自己就是用事件来实现的,一旦切换语言,全部绑定的字符串都会从新执行一遍绑定函数,比较低效。 spa

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
packageme.hackerzhou.reflectproxy.ui.util
{
    importflash.events.Event;
    importflash.events.EventDispatcher;
 
    publicclassResourceUtilextendsEventDispatcher
    {
        importmx.resources.IResourceManager;
        importmx.resources.ResourceManager;
        importmx.controls.Alert;
 
        privatestaticconstBUNDLE_NAME:String="Main";
        [Bindable]
        publicstaticvarresourceManager:IResourceManager =null;
        privatestaticvarinstance:ResourceUtil =null;
        privatestaticvarcurrentLanguage:String="zh_CN";
 
        publicstaticfunctiongetInstance():ResourceUtil {
            if(instance ==null) {
                instance =newResourceUtil();
                resourceManager = ResourceManager.getInstance();
                resourceManager.initializeLocaleChain([currentLanguage]);
            }
            returninstance;
        }
 
        publicfunctionchangeLanguage(languageName:String):void{
            resourceManager.localeChain.localeChain = [languageName];
            currentLanguage = languageName;
            dispatchChange();
        }
 
        [Bindable("change")]
        publicfunctiongetImage(resName:String):Class {
            varresult:Class = resourceManager.getClass(BUNDLE_NAME, resName
                            , currentLanguage);
            returnresult;
        }
 
        [Bindable("change")]
        publicfunctiongetString(resName:String, para:Array=null):String{
            varresult:String= resourceManager.getString(BUNDLE_NAME, resName, para
                            , currentLanguage);
            returnresult;
        }
 
        privatefunctiondispatchChange():void
        {
            dispatchEvent(newEvent("change"));
        }
    }
}

从上述代码能够看到,由于没法Bindable到一个静态的函数上进行切换语言,我使用了单例模式,并且自己ResourceManager在系统中就是单例的。须要修改语言时,只须要dispatch一个change的事件,全部绑定到getString的字符串都将会被从新执行getString操做,所以就能得到到最新的语言对应的字符串。 翻译

而在外部进行调用的时候,只须要把值绑定到ResourceUitl.getInstance().getString(…)就能够了,固然若是想在ActionScript中而不是MXML中执行绑定,则须要用BindUtil.bindProperty(…)。 code

固然,有了这套机制,图片等页面元素也能够根据语言的切换而进行修改。须要注意的是,properties文件的key=value中的value要变成相似Embed(“url”)的样子,其中的url是相对于当前properties语言文件的,使用ResourceManager.getClass(…)就能够获取图片以及媒体资源。 接口

相关文章
相关标签/搜索