ASP.NET多语言网站?

时间:2008-10-09 18:00:18

标签: asp.net .net-2.0 multilingual

如何将网站转换为能够处理多语言(例如:英语,法语,西班牙语)?

我不喜欢资源文件,因为我觉得有限,而且构建列表的时间很长。你有什么建议吗?

更新

目前我们发现的最佳方法是使用XML文件和一些Xpath和get值。

7 个答案:

答案 0 :(得分:9)

隐式本地化(在Visual Studio上 - 工具菜单 - 生成本地资源)就像它可以一样简单。使用默认语言编写页面,选择菜单选项,然后创建资源文件并将其发送给某人进行翻译。

resx文件只是xml,因此如果翻译公司希望您可以轻松地将其转换为(和退出)电子表格。

使用数据库而不是resx作为后备存储并不困难。 Rick Strahl对数据库驱动的本地化提供程序here有一个很好的解释和示例代码 - 还有一个很好的内置本地化编辑器,其中包含与Google翻译和Babelfish的接口。

答案 1 :(得分:6)

我们将多语言网站的资源存储在数据库中。我们已经创建了一些工具,可以轻松创建和访问这些工具。有一个自定义的ExpressionBuilder允许我们使用这种语法:

 <asp:linkbutton runat='server' text='<%$ LanguageStrings:ClickMe%>' />

包含默认文本的自定义标签,如果还没有,则向数据库添加一行。

 <r:languagelabel runat="server" name="AboutUs">About Us</r:languagelabel>

包含字符串的表每种语言有一列。这使得用英语(或任何默认语言)创建网站变得非常容易,然后将表格(自身填充)交给翻译。您还可以很容易地看到翻译内容所需的语言。使用资源,每次需要添加新字符串时,都必须停止正在执行的操作,然后转到每种语言的资源文件并添加资源。

以下是语言标签的代码:

''' <summary>
''' Retrieves a language-specific string.
''' </summary>
Public Class LanguageLabel
    Inherits Label

    Private _Name As String
    Public Property Name() As String
        Get
            Return _Name
        End Get
        Set(ByVal value As String)
            _Name = value
        End Set
    End Property

    Private Sub Populate()
        If Len(Me.Name) > 0 Then
            Dim LanguageString As String = GetLanguageString(Me.Name, Me.Text)
            If Len(LanguageString) > 0 Then Me.Text = LanguageString
        End If
    End Sub

    Private Sub LanguageLabel_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreRender
        Populate()
    End Sub

    Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)
        ' By default a label wraps the text in a <span>, which we don't want in some situations
        writer.Write(Me.Text)
    End Sub

End Class

和效用函数:

    Public Function GetLanguageString(ByVal Name As String, Optional ByVal DefaultText As String = "") As String
        Dim DefaultLanguage As Language = Languages.GetById(1)
        Name = StripPunctuation(Name).Trim.Replace(" ", "") ' Remove punctuation, spaces from name
        Dim SelectSql As String = String.Format("Select {0},{1} from LanguageStrings where Name=@Name", Languages.CurrentLanguage.Code, DefaultLanguage.Code)
        Dim LanguageStringTable As DataTable = ExecuteDataset(cs, CommandType.Text, SelectSql, New SqlParameter("@Name", Name)).Tables(0)
        If LanguageStringTable IsNot Nothing AndAlso LanguageStringTable.Rows.Count > 0 Then
            Dim LanguageText As String = LanguageStringTable.Rows(0)(Languages.CurrentLanguage.Code).ToString
            Dim DefaultLanguageText As String = LanguageStringTable.Rows(0)(DefaultLanguage.Code).ToString
            If Len(LanguageText) > 0 Then
                ' We have a string in this language
                Return LanguageText
            Else
                ' Nothing in this language - return default language value
                Return DefaultLanguageText
            End If
        Else
            ' No record with this name - create a dummy one
            If DefaultText = "" Then DefaultText = Name
            Dim InsertSql As String = String.Format("Insert into LanguageStrings (Name, {0}) values (@Name, @Text)", DefaultLanguage.Code)
            ExecuteNonQuery(cs, CommandType.Text, InsertSql, New SqlParameter("@Name", Name), New SqlParameter("@Text", DefaultText))
            Return Name
        End If
    End Function

答案 2 :(得分:2)

资源文件是可行的方法。我们的产品有12种语言版本。我们将所有字符串输出到资源文件中并将它们发送给翻译公司。有时这很痛苦,但这是事实上的方法。

当4个字母的英文单词被翻译成17个字母的短语并且你必须调整你的UI时,这也很有趣。

答案 3 :(得分:1)

你的设计过程有多晚?如果不是太晚,如果预算允许,请考虑移植到多语言CMS,如Ektron CMS300.net(内置翻译工具)。如果没有,那么你面前有一项艰巨的任务。

答案 4 :(得分:0)

我使用的另一个解决方案是创建语言文件夹,其中包含包含该特定语言中所有必需文本的aspx页面。

这里唯一的问题是如何在这些复制页面中尽可能少地注入代码。我在这里使用控制器模式来执行此操作,然后使用对象数据源来获取数据并将其绑定到所有页面中的控件。

通过这种方式,我实现了摆脱资源文件的目标,我可以将代码保留在一个地方,而无需复制它(除非必要)。

编辑:我也推荐一个好的CMS框架。

答案 5 :(得分:0)

我开发的其中一个网络应用程序也有这个NLS要求。

我发现至少有3个地方有本地化文本:

  • 用户界面
  • 数据库表(“目录”或您想要称之为的任何内容)
  • 后端代码(服务等)

我的解决方案有一个表,用于页面,表格等(“容器”),一个表用于该容器中的每个项目(例如标签,ID按钮,记录标识符),以及一个用于翻译项目的表格(加上语言标识符)。

翻译应用程序可帮助我保持翻译的最新状态,并以XML格式导出所有翻译。

该产品附带翻译,但客户可以调整翻译,更改立即生效。

答案 6 :(得分:0)

我使用资源文件完成的示例代码 添加global.asax

 void Application_BeginRequest(Object sender, EventArgs e)
    {
        // Code that runs on application startup
        HttpCookie cookie = HttpContext.Current.Request.Cookies["CultureInfo"];
        if (cookie != null &amp;&amp; cookie.Value != null)
        {
            System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(cookie.Value);
            System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(cookie.Value);
        }
        else
        {
            System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en");
            System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en");
        }
    }

http://satindersinght.blogspot.in/2012/06/create-website-for-multilanguage.html

http://satindersinght.wordpress.com/2012/06/14/create-website-for-multilanguage-support/