ASP.NET多语言网站?

ASP.NET多语言网站?,asp.net,.net-2.0,multilingual,Asp.net,.net 2.0,Multilingual,如何将网站转换为能够处理多种语言(例如:英语、法语、西班牙语) 我不喜欢这个资源文件,因为我觉得它很有限,而且构建列表很长。你有什么建议吗 更新 目前,我们找到的最佳方法是使用XML文件和一些Xpath et get值。您在设计过程中到了多晚?如果不太迟,如果预算允许,考虑移植到一个多语言的CMS(类似于内置的翻译工具)。如果没有,那么你面前就有一项艰巨的任务。资源文件就是一条出路。我们提供12种语言的产品。我们将所有字符串提取到资源文件中,并将它们发送给翻译公司。有时这是一种痛苦,但这是事实上

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

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

更新
目前,我们找到的最佳方法是使用XML文件和一些Xpath et get值。

您在设计过程中到了多晚?如果不太迟,如果预算允许,考虑移植到一个多语言的CMS(类似于内置的翻译工具)。如果没有,那么你面前就有一项艰巨的任务。

资源文件就是一条出路。我们提供12种语言的产品。我们将所有字符串提取到资源文件中,并将它们发送给翻译公司。有时这是一种痛苦,但这是事实上的做法


当4个字母的英语单词被翻译成17个字母的短语,你必须调整你的用户界面时,它也会变得很有趣。

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

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

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


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

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

 <asp:linkbutton runat='server' text='<%$ LanguageStrings:ClickMe%>' />
隐式本地化(在VisualStudio的“工具”菜单“生成本地资源”上)尽可能简单。使用默认语言编写页面,选择菜单选项,即可创建资源文件并将其发送给其他人进行翻译

resx文件只是xml,因此如果翻译公司需要,您可以轻松地将其转换为(或转换为)电子表格


使用数据库而不是resx作为备份存储并不困难。Rick Strahl为数据库驱动的本地化提供商提供了一个很好的解释和示例代码-还有一个很好的内置本地化编辑器,与Google translations和Babelfish接口。

我开发的一个web应用程序也有这个NLS要求

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

  • 用户界面
  • 数据库表(“目录”或任何你想叫它们的名称)
  • 后端代码(服务等)
我的解决方案有一个表格用于页面、表格等(“容器”),一个表格用于该容器中的每个项目(例如标签、按钮ID、记录标识符),一个表格用于翻译项目(加上语言标识符)

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


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

我使用资源文件完成的示例代码 添加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");
        }
    }


资源文件是在.net中实现这一点的标准方法,但它们不是一个可以追溯的工具吗?我很想看到你对这个话题的具体回应……你将如何处理一种改变页面呈现方向的语言?在我看来,您必须编写一些代码来应对这种情况。我现在投票支持资源文件,因为没有其他更好的方法了。我们处理从右到左的语言。我们将所有文本放在控件中,这样控件就不必shift@Danimal-是的,它们会是一只熊。许多年前,我加入了一个团队,在那里我们不得不创建一个大型网站,并将其外包给一家翻译服务公司,由该公司即时完成。如果你进入hillsboroughcounty.org并滚动到底部,你可以看到它的效果。如果你在屏幕上有50个标签,你会去数据库50次以获得翻译吗?不,实际上我们会将整个词典缓存在内存中。
''' <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
 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");
        }
    }