Register  |  
About the author
Baldwin's Status
 Contact Me
Baldwin Sun
Senior Developer for dnn solution & founder of SunBlog module...
Blog搜索
相册库
更多照片请查看相册库
最新评论
Rss Feed
feedsky
抓虾
pageflakes
newsgator
哪吒
我们的服务
  • DotNetNuke 咨询
  • Web设计及其模块开发
  • 免费建站
  • 电子商务
  • 开拓市场
我们致力于开发定制的web 2.0 ,所服务的客户主要包括小中型企业,社区俱乐部及其非盈利机构组织。我们将利用开源的DNN作为我们核心的系统机制,更多相关信息...

你需要么,dnn多语言解决方案?

Posted in [DNN使用及思考], [DNN模块开发], [DNN皮肤设计], [优化DNN] By baldwin

目前dnn多语言解决方案是我这段时间研究的重点, 我接下来也许会写几篇相关文章阐述这些问题.
切入正题, 本地化是ASP.NET的特性, 无疑dnn也会直接支持, 但是事实上并不是很乐观, 因为dnn本身也只是在表面上作些文章吧了, 如果你想利用dnn实现多语言门户(Portals), 那你可能想错了, 除非你重新开发或在模块级别上定制的开发支持多语言. 那dnn究竟支持多语言到何种程度呢? 让我慢慢道来, 其实dnn默认支持的多语言只局限于页面标签(Tags,Token etc), 比如登陆链接, 编辑模块时的字段Label等等, 而这些并非我们通常理解的内容本地化(多语言支持). 当然你可以通过下列两种解决方案来实现:
1) 模块级别的多语言开发,但你的内容可能需要存储好几个版本(根据你站点支持的语言总数)
   2) 站点级别的多语言开发,也就是你需要发布好几个站点(根据你需要支持的语言总数)

目前在DNN模块市场也有一些模块按照第一种思路做到了内容上支持多语言,比如:
1) MLSkinHelper, PageLocalization Module,Language Selector skin object 等等
http://www.apollo-software.nl/Home/tabid/36/language/en-US/Default.aspx
最经典的范例就是http://declic-video-fx.com/,它利用apollo-software相关模块实现了多语言站点,可以说基本上实现了多语言支持的所有功能.
2) Localization Extensions: Easily implement multilingual portals
http://www.adequation-dotnetnuke.com/en/AboutUs.aspx
该站点的公司主页就是利用来实现了多语言支持,请访问http://www.adequation-informatique.com/en/Home.aspx
3) 这是一个免费的模块Magic Content,同时也是DNN Forget下的一个新模块,该模块属于proeder.network.consult公司.
Magic Content is a multi-lingual content publishing module for the DotNetNuke plattform that can be used as a replacement for the current Text/HTML module. It's very easy to use and extends content publishing by many useful features. * one edit tab for each portal locale * advanced edit tab for role based content management * newsletter tab for sending content out via e-mail * replacement token tab.
http://www.codeplex.com/MagicContent
http://www.portalfabrik.net/
相关链接:
How to localization with dnnMenu or solpartMenu?
http://www.dotnetnuke.com/Community/Forums/tabid/795/forumid/76/threadid/224072/scope/posts/Default.aspx
how to localization in skin?
http://www.dotnetnuke.com/Community/Forums/tabid/795/forumid/109/threadid/222245/scope/posts/Default.aspx
在此我不就以上话题详细阐述如何开发多语言模块等等细节问题, 以后也许有机会我会讲解一些模块的开发经验等等, 现在我只是简单说明一个相关的问题, 就是皮肤级别上的多语言支持. 比如说我有一个需求,客户需要在某个皮肤添加说明性文字或提示, 类似于 当前位置:首页/新闻中心/某某新闻, 这"当前位置"需要进行本地化, 例如You Are Here:(English version), 当前位置(Chinese version). 我们该如何解决这一问题, 目前dnn没有在皮肤上支持本地化,但在皮肤控件上是支持的. 我曾在论坛逛了一些时候,发现dnn牛人Sebastian Leupold说:
DNN 5 will allow for more flexibility using the [Text] skin object, which supports core token replace, which gives you more flexibility and a bunch of  additional tokens and formatting options.
好吧,那我们就先来尝个新鲜,自己定制一个简单的皮肤本地化控件WindyText.首先需要在网站根目录下的admin/Skins文件夹里创建一个UserControl(请注意该文件夹下的代码不需要重新编译,如果你是以站点形式发布的),该控件只有三个属性(DefaultValue,CssClass和LocalizationKey),CssClass自然不需要解释了,就是定义该皮肤对象的样式,而LocalizationKey也表示你需要显示说明性文字或提示对应在资源文件的键值,如果你曾经开发过模块,应该很清楚,最后DefaultValue则是默认显示信息,为了防止资源文件里没有定义键值对.比如你设置LocalizationKey="AA",那么你对应的资源文件(WindyText.ascx.resx或WindyText.ascx.zh-CN.resx)里边就应该有一组键值对AA.Text = "你需要显示的说明性文字或提示".代码实现其实很简单,其实就是定制开发皮肤对象(Skin Object)的过程,比如说你必须继承SkinObjectBase等等:
 
  1. #Region "Public Members"   
  2.         Public Property DefaultValue() As String  
  3.             Get  
  4.                 Return _DefaultValue   
  5.             End Get  
  6.             Set(ByVal Value As String)   
  7.                 _DefaultValue = Value   
  8.             End Set  
  9.         End Property  
  10.   
  11.         Public Property LocalizationKey() As String  
  12.             Get  
  13.                 Return _LocalizationKey   
  14.             End Get  
  15.             Set(ByVal Value As String)   
  16.                 _LocalizationKey = Value   
  17.             End Set  
  18.         End Property  
  19.   
  20.         Public Property CssClass() As String  
  21.             Get  
  22.                 Return _cssClass   
  23.             End Get  
  24.             Set(ByVal Value As String)   
  25.                 _cssClass = Value   
  26.             End Set  
  27.         End Property
  28. #End Region  
  29.  
  30. #Region " Event Handlers "   
  31.         Private Sub Page_Load(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles MyBase.Load   
  32.             If Not String.IsNullOrEmpty(LocalizationKey) Then  
  33.                 Dim localizationString As String = Localization.GetString(LocalizationKey, Localization.GetResourceFile(Me, MyFileName))   
  34.                 lblLocalization.Text = IIF(String.IsNullOrEmpty(localizationString),DefaultValue,localizationString)   
  35.             End If  
  36.   
  37.             If CssClass <> "" Then  
  38.                 lblLocalization.CssClass = CssClass   
  39.             Else  
  40.                 lblLocalization.CssClass = "Normal"  
  41.             End If  
  42.         End Sub
  43. #End Region  
      我已把WindyText皮肤对象打包一下,你可以从此下载.安装步骤如下:
     1) 解压缩zip文件,拷贝WindyText.ascx,WindyText.ascx.vb,WindyText.xml到站点根目录下的admin/Skins
     2) 拷贝WindyText.ascx.resx,WindyText.ascx.zh-CN.resx到站点根目录下的admin/Skins/App_LocalResources
那我们该如何使用WindyText呢,首先你需要在页面注册一下,操作类似其他皮肤控件那样:
 
  1. <%@ Register TagPrefix="dnn" TagName="WINDYTEXT" Src="~/Admin/Skins/WindyText.ascx" %>  
然后你就可以直接使用WindyText了,例如:
 
  1. <div class="siteBreadCrumb">  
  2.     <dnn:WINDYTEXT ID="lblbreadcrumbTip" LocalizationKey="breadcrumbTip" runat="server" /> 
  3.     <dnn:BREADCRUMB runat="server" ID="dnnBreadCrumb" Separator=" / " RootLevel="0" />  
  4. div>  
请注意你需要在资源文件里定义对应键值,比如现在我设置的是breadcrumbTip.Text = "You Are Here:"(WindyText.ascx.resx版本)和breadcrumbTip.Text = "当前位置:"(WindyText.ascx.zh-CN.resx版本).到此你就大功告成了.目前http://www.dnnsun.com就是利用WindyText这一皮肤控件实现的,这一控件还要其他很有用的功能,以后有机会将继续扩展一些更强大的功能. ^_^

Comments

Was it good for you, too?Join the discussion » ,but you need to login first before you make comments.
# 1
Posted @ 2008/11/2 20:04 By Jorbidok
interesting, i'll be back later
# 2 [Author]
Posted @ 2008/11/2 20:06 By baldwin
Thanks for your comments and support.
# 3
Posted @ 2008/11/10 21:24 By chinese
怎么让内容本地化,例如 http://www.shuionland.com<br>它同时支持中英繁,当打开页面后,切换语言时,自动显示相应版本的内容
# 4 [Author]
Posted @ 2008/11/10 21:28 By baldwin
那就需要你模块开发设计考虑多语言支持,需要你存储不同语言版本的内容,也许几个对应语言的表来进行同步数据,如此模块的确有些复杂了 不过看你业务需要的 你可以看看本站点的首页“我们的服务”这一栏,你可以切换不同语言来查看不同的内容显示...