【问题标题】:ASP.NET multi language website?ASP.NET 多语言网站?
【发布时间】:2010-09-16 08:22:40
【问题描述】:

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

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

更新

目前我们发现的最好方法是使用 XML 文件并通过一些 Xpath 获取值。

【问题讨论】:

    标签: asp.net .net-2.0 multilingual


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      • 用户界面
      • 数据库表(“目录”或任何您想称呼它们的名称)
      • 后端代码(服务等)

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

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

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

      【讨论】:

        【解决方案3】:

        隐式本地化(在 Visual Studio - 工具菜单 - 生成本地资源)非常简单。用您的默认语言编写您的页面,选择菜单选项,然后您的资源文件被创建并可以发送给某人进行翻译。

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

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

        【讨论】:

          【解决方案4】:

          我们将多语言网站的资源存储在数据库中。我们已经创建了几个工具来轻松创建和访问这些工具。有一个自定义的 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
          

          【讨论】:

          • 如果屏幕中有50个标签,你会去数据库50次获取翻译吗?
          • 不,实际上我们将整个字典缓存在内存中。
          【解决方案5】:

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

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

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

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

          【讨论】:

            【解决方案6】:

            资源文件是要走的路。我们以 12 种语言发布我们的产品。我们将所有字符串提取到资源文件中并将它们发送给翻译公司。有时这很痛苦,但这是事实上的方式。

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

            【讨论】:

            • 资源文件是在 .net 中执行此操作的规范方式,但它们不适合追溯吗?我很想看到你对这个话题的回应有点充实......
            • 您将如何处理改变页面呈现方向的语言?在我看来,你必须编写一些代码来解决这个问题。我现在投票支持资源文件,因为没有其他更好的方法。
            • 我们确实处理从右到左的语言。我们将所有文本都放在控件中,这样控件就不必移动
            • @Danimal - 是的,他们会是一只熊。多年前,我参与了一个团队,我们必须在该团队中制作一个大型网站,然后将其外包给一家即时完成的翻译服务。如果你去 hillsboroughcounty.org 并滚动到底部,你可以看到它的效果。
            【解决方案7】:

            您在设计过程中的进度有多晚?如果还不算太晚,而且如果预算允许,可以考虑移植到像 Ektron CMS300.net 这样的多语言 CMS(它具有内置翻译工具)。如果没有,那么你面临着一项艰巨的任务。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2010-09-22
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-04-16
              • 1970-01-01
              相关资源
              最近更新 更多