65.9K
CodeProject 正在变化。 阅读更多。
Home

轻松创建多语言网页

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.64/5 (21投票s)

2004年8月24日

CPOL

2分钟阅读

viewsIcon

90950

downloadIcon

1138

无需使用本地化和资源,即可轻松创建多语言网页。

Sample Image - The page in German

Sample Image - The page in english

引言

本文介绍如何以简单的方式编写多语言网页,而无需使用资源或本地化。

本文不描述如何将单词或句子从一种语言翻译成另一种语言!

背景

我正在我工作的公司中开发一个大型 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方法都会将翻译标签中的刹车<>替换为&lt;&gt;。例子

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>,第二次查找所有修改后的翻译标签&lt;ML_TAG&gt;

' 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>

Detecting mistakes in translation tags

历史

初始版本。

© . All rights reserved.