轻松创建多语言网页






3.64/5 (21投票s)
无需使用本地化和资源,即可轻松创建多语言网页。
引言
本文介绍如何以简单的方式编写多语言网页,而无需使用资源或本地化。
本文不描述如何将单词或句子从一种语言翻译成另一种语言!
背景
我正在我工作的公司中开发一个大型 Web 应用程序,该应用程序应该是多语言的。
在整个项目中,我们有一个 COM 组件,可以将单词或句子从一种语言翻译成另一种语言。该组件的基本机制是一个大的文本文件和一个哈希表。
在我的示例项目中,存在一个带有示例翻译的翻译类的实例。在现实生活中,这是翻译 COM 组件的实例!您应该在这里编写自己的解决方案!
我的示例项目中的基础和默认语言是德语。我使用会话变量来存储会话中的实际语言,并使用全局变量来存储整个 Web 应用程序的实际语言。切换语言的下拉列表可以放在菜单框架中。服务器端代码应该只刷新所有框架,以便动态切换语言。
使用代码
第一步是将CMLPageControl
类放入您的项目中。将文件CMLPageControl.vb复制到项目目录中,并将以下行添加到 vbproj 文件中。
<File
RelPath = "CMLPageControl.vb"
SubType = "ASPXCodeBehind"
BuildAction = "Compile"
/>
第二种
您的所有 WebForm 都必须从此类派生
Public Class WebForm1
Inherits CMLPageControl
End Class
第三步也是最后一步
要翻译文本,您应该将文本放在翻译标签<ML_TAG>
和</ML_TAG>
之间。
<asp:Label id="Label1" runat="server">
<ML_TAG>Hallo, hier wird demonstriert</ML_TAG>
</asp:Label>
<asp:Label id="Label2" font-bold="True" runat="server">
<ML_TAG>wie man on the fly die Sprache wechselt!</ML_TAG>
</asp:Label>
<asp:Button id="Button1" runat="server" Text="<ML_TAG>Drück mich</ML_TAG>">
</asp:Button>
<asp:CheckBox id="CheckBox1" runat="server"
Text="<ML_TAG>Klick mich</ML_TAG>">
</asp:CheckBox>
翻译标签被定义为基类中的常量。
Imports System.ComponentModel
Imports System.Web.UI
<DefaultProperty("Text"), ToolboxData("<{0}:CMLPageControl _
runat="server"></{0}:CMLPageControl>")> _
Public Class CMLPageControl _
Inherits System.Web.UI.Page
Public Const MLPAGE_TRANSLATION_TAG As String = "ML_TAG"
End Class
解决方案
基类是一个自定义控件,用于重载Render
方法。
一个问题是如何处理页面的已渲染 HTML 代码,包括所有子用户控件和占位符等等。我通过创建自己的HtmlTextWriter
对象并让基类System.Web.UI.Page
在我的 writer 中渲染页面来解决这个问题。现在,我可以将 HTML 作为字符串来翻译翻译标签之间的所有文本。
Protected Overrides Sub Render(ByVal output As System.Web.UI.HtmlTextWriter)
' generate your own writer
' without this, you don't have a chance
' to get the rendered HTML-Code
Dim oStringBuilder As New System.Text.StringBuilder
Dim oWriter As New System.Web.UI.HtmlTextWriter(New _
System.IO.StringWriter(oStringBuilder))
' Render HTML-Code
RenderChildren(oWriter)
第二个问题是,如果文本是在代码隐藏中设置的,而不是静态表示层(aspx 或 ascx 文件),则所有 .NET 控件的Render
方法都会将翻译标签中的刹车<
和>
替换为<
和>
。例子
List1.Items.Add(New ListItem("<ML_TAG>Deutsch</ML_TAG>", _
Convert.ToString(CTranslation.MLPAGE_LANGUAGE_GERMAN)))
List1.Items.Add(New ListItem("<ML_TAG>Englisch</ML_TAG>", _
Convert.ToString(CTranslation.MLPAGE_LANGUAGE_ENGLISH)))
为了解决这个问题,翻译程序被调用两次。第一次查找所有“正常”的翻译标签<ML_TAG>
,第二次查找所有修改后的翻译标签<ML_TAG>
。
' translate the page and write the result to the stream
output.Write(TranslatePage(TranslatePage(oStringBuilder.ToString(), _
MLPAGE_TRANSLATION_TAG, True), MLPAGE_TRANSLATION_TAG, False))
翻译本身是一个非常简单的搜索和替换。我认为这里有很大的调整潜力。但在我的实际客户应用程序中,翻译具有 200-300KB 渲染 HTML 代码的页面需要的时间 < 0.1 秒。大部分时间都需要在翻译组件中找到文本。这后面的数据是一个 2MB 的文本文件。
关注点
如果您在使用翻译标签时出错(例如,忘记关闭标签或语法错误),翻译解析器会向您显示错误点。
在下一个屏幕截图中,开始标记有书写错误
<asp:Label id="Label1" runat="server">
<ML_xTAG>Hallo, hier wird demonstriert</ML_TAG>
</asp:Label><br>
历史
初始版本。