Flex4 多语言
2011年01月04日
Flex开发2011-01-04 08:40:50阅读0评论0 字号:大中小 订阅 Flex在3和4中都有Localization的支持,包括使用Resource Modules。不过我并不打算使用该方法。
原因有二
1??Resource Modules过大:
使用Resource Modules是一种很好的设计模式,其意图是希望在运行状态中将资源从外部加载进来,以达到
减少垃圾文件及动态更换语言的目的。不过在最新Flex4版本中,这个想法还是没有很好的体现出来。
我编写了一个1K大小的lang.properties但是导出的Resource Modules确有18K(见原帖)。
这样完全没有达到使用Resource Modules的目的,至少对于多语言这方面是没有什么意义。
2??使用ResourceManager无法替换文字中的转义符:
文字中出现转义符的在很多程序设计中都有需要,由其在游戏中经常会需要显示如下的信息
"Congratulate you have found #ITEM_NAME#" ; "Hello #USER_NAME# ,nice to meet you"
无论使用@Resource 还是运行期间使用resourceManager.getString(**,**),
ResourceManager都无法胜任该工作。
因此,我自己设计了一套多语言结构,拿出来和大家探讨一下。如果有什么想法欢迎留言
Main: [b] [/b]
[b]flex/spark"
xmlns:mx="library://ns.adobe.com/flex/halo"
minWidth="1024"
minHeight="768"
width="348"
height="314"
initialize="onInit()"[b]> [/b]
[b] [/b]
[b] [/b]
[b] [/b]
Main 函数主要目的是初始化LanguageHandle,由于仅是做个Demo演示 所以没有写的那么复杂,代码看起来比较2....
LanguageHandle: [b]package[/b] copyengine.common.lang
{
[b]import[/b] flash.events.Event;
[b]import[/b] flash.events.EventDispatcher;
[b]import[/b] flash.utils.Dictionary;
[b]public[/b] [b]class[/b] LanguageHandle [b]extends[/b] EventDispatcher
{
[b]private[/b] [b]static[/b] [b]var[/b] _instance:[b]LanguageHandle[/b];
[b]public[/b] [b]static[/b] [b]function[/b] [b]get[/b] instance():LanguageHandle
{
[b]if[/b] (_instance == [b]null[/b])
{
_instance=[b]new[/b] [b]LanguageHandle[/b]();
}
[b]return[/b] _instance;
}
[b]private[/b] [b]var[/b] allLanguageRes:[b]Dictionary[/b];
[b]private[/b] [b]var[/b] currentLanguage:[b]String[/b];
[b]public[/b] [b]function [/b]LanguageHandle()
{
allLanguageRes=[b]new[/b] [b]Dictionary[/b]();
}
[b]public[/b] [b]function [/b]init(_language:[b]String[/b]):[b]void [/b]
{
currentLanguage=_language;
}
[b]public[/b] [b]function [/b]addLanguage(_langXml:[b]XML[/b]):[b]void [/b]
{
currentLanguage=_langXml.@val;
[b]var[/b] currentRes:[b]Vector[/b].=[b]new[/b] Vector.();
allLanguageRes[currentLanguage]=currentRes;
[b]for[/b] [b]each[/b] ([b]var[/b] node:[b]XML[/b] [b]in[/b] _langXml.text)
{
[b]var[/b] languageFile:[b]LanguageFile[/b]=[b]new[/b] LanguageFile;
languageFile.textID=node.@id;
languageFile.textValue=node.@val;
currentRes.push(languageFile);
}
}
[Bindable(event="CopyEngine_LanguageChange")]
[b]public[/b] [b]function [/b]getText(_textID:[b]String[/b]):[b]String [/b]
{
[b]var[/b] currentRes:[b]Vector[/b].=allLanguageRes[currentLanguage];
[b]for[/b] [b]each[/b] ([b]var[/b] langugeFile:[b]LanguageFile[/b] [b]in[/b] currentRes)
{
[b]if[/b] (langugeFile.textID == _textID)
{
[b]return[/b] langugeFile.textValue;
}
}
[b]return[/b] [b]null[/b];
}
[b]public[/b] [b]function [/b]changeLanguage(_language:[b]String[/b]):[b]void [/b]
{
currentLanguage=_language;
dispatchEvent([b]new[/b] [b]Event[/b]("CopyEngine_LanguageChange"));
}
}
}
主要注意
[Bindable(event="CopyEngine_LanguageChange")]
public function getText(_textID:String):String]{}
这个是对getText函数进行绑定,当有Event-->CopyEngine_LanguageChange产生时,该函数即Call,
在最下方,当更换语言时就会dispatch出该Event
测试类: [b] [/b]
[b]flex/spark"
xmlns:mx="library://ns.adobe.com/flex/halo"
width="275"
height="181"[b]> [/b]
[b] [/b]
[b] [/b]
[b] [/b]
[b] [/b]
[b] [/b]
[b] [/b]
[b] [/b]
[b] [/b]
[b] [/b]
[b] [/b]
[b] [/b]
由于仅仅是简单的Demo,所以就没有封装Rplace函数,不过原理都是一样。
最终演示
转自:
2011年01月04日
Flex开发2011-01-04 08:40:50阅读0评论0 字号:大中小 订阅 Flex在3和4中都有Localization的支持,包括使用Resource Modules。不过我并不打算使用该方法。
原因有二
1??Resource Modules过大:
使用Resource Modules是一种很好的设计模式,其意图是希望在运行状态中将资源从外部加载进来,以达到
减少垃圾文件及动态更换语言的目的。不过在最新Flex4版本中,这个想法还是没有很好的体现出来。
我编写了一个1K大小的lang.properties但是导出的Resource Modules确有18K(见原帖)。
这样完全没有达到使用Resource Modules的目的,至少对于多语言这方面是没有什么意义。
2??使用ResourceManager无法替换文字中的转义符:
文字中出现转义符的在很多程序设计中都有需要,由其在游戏中经常会需要显示如下的信息
"Congratulate you have found #ITEM_NAME#" ; "Hello #USER_NAME# ,nice to meet you"
无论使用@Resource 还是运行期间使用resourceManager.getString(**,**),
ResourceManager都无法胜任该工作。
因此,我自己设计了一套多语言结构,拿出来和大家探讨一下。如果有什么想法欢迎留言
Main: [b] [/b]
[b]flex/spark"
xmlns:mx="library://ns.adobe.com/flex/halo"
minWidth="1024"
minHeight="768"
width="348"
height="314"
initialize="onInit()"[b]> [/b]
[b] [/b]
[b] [/b]
[b] [/b]
Main 函数主要目的是初始化LanguageHandle,由于仅是做个Demo演示 所以没有写的那么复杂,代码看起来比较2....
LanguageHandle: [b]package[/b] copyengine.common.lang
{
[b]import[/b] flash.events.Event;
[b]import[/b] flash.events.EventDispatcher;
[b]import[/b] flash.utils.Dictionary;
[b]public[/b] [b]class[/b] LanguageHandle [b]extends[/b] EventDispatcher
{
[b]private[/b] [b]static[/b] [b]var[/b] _instance:[b]LanguageHandle[/b];
[b]public[/b] [b]static[/b] [b]function[/b] [b]get[/b] instance():LanguageHandle
{
[b]if[/b] (_instance == [b]null[/b])
{
_instance=[b]new[/b] [b]LanguageHandle[/b]();
}
[b]return[/b] _instance;
}
[b]private[/b] [b]var[/b] allLanguageRes:[b]Dictionary[/b];
[b]private[/b] [b]var[/b] currentLanguage:[b]String[/b];
[b]public[/b] [b]function [/b]LanguageHandle()
{
allLanguageRes=[b]new[/b] [b]Dictionary[/b]();
}
[b]public[/b] [b]function [/b]init(_language:[b]String[/b]):[b]void [/b]
{
currentLanguage=_language;
}
[b]public[/b] [b]function [/b]addLanguage(_langXml:[b]XML[/b]):[b]void [/b]
{
currentLanguage=_langXml.@val;
[b]var[/b] currentRes:[b]Vector[/b].=[b]new[/b] Vector.();
allLanguageRes[currentLanguage]=currentRes;
[b]for[/b] [b]each[/b] ([b]var[/b] node:[b]XML[/b] [b]in[/b] _langXml.text)
{
[b]var[/b] languageFile:[b]LanguageFile[/b]=[b]new[/b] LanguageFile;
languageFile.textID=node.@id;
languageFile.textValue=node.@val;
currentRes.push(languageFile);
}
}
[Bindable(event="CopyEngine_LanguageChange")]
[b]public[/b] [b]function [/b]getText(_textID:[b]String[/b]):[b]String [/b]
{
[b]var[/b] currentRes:[b]Vector[/b].=allLanguageRes[currentLanguage];
[b]for[/b] [b]each[/b] ([b]var[/b] langugeFile:[b]LanguageFile[/b] [b]in[/b] currentRes)
{
[b]if[/b] (langugeFile.textID == _textID)
{
[b]return[/b] langugeFile.textValue;
}
}
[b]return[/b] [b]null[/b];
}
[b]public[/b] [b]function [/b]changeLanguage(_language:[b]String[/b]):[b]void [/b]
{
currentLanguage=_language;
dispatchEvent([b]new[/b] [b]Event[/b]("CopyEngine_LanguageChange"));
}
}
}
主要注意
[Bindable(event="CopyEngine_LanguageChange")]
public function getText(_textID:String):String]{}
这个是对getText函数进行绑定,当有Event-->CopyEngine_LanguageChange产生时,该函数即Call,
在最下方,当更换语言时就会dispatch出该Event
测试类: [b] [/b]
[b]flex/spark"
xmlns:mx="library://ns.adobe.com/flex/halo"
width="275"
height="181"[b]> [/b]
[b] [/b]
[b] [/b]
[b] [/b]
[b] [/b]
[b] [/b]
[b] [/b]
[b] [/b]
[b] [/b]
[b] [/b]
[b] [/b]
[b] [/b]
由于仅仅是简单的Demo,所以就没有封装Rplace函数,不过原理都是一样。
最终演示
转自: