良好的本地化一直是一個成熟的軟件系統必備的,通常須要在若干語言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
對於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(…)就能夠獲取圖片以及媒體資源。 接口