Pat*_*ins 6 asp.net multilingual .net-2.0
如何将网站转换为能够处理多语言(例如:英语,法语,西班牙语)?
我不喜欢资源文件,因为我觉得有限,而且构建列表的时间很长.你有什么建议吗?
目前我们发现的最佳方法是使用XML文件和一些Xpath和get值.
我们将多语言站点的资源存储在数据库中.我们已经创建了一些工具,可以轻松创建和访问这些工具.有一个自定义的ExpressionBuilder,允许我们使用这种语法:
<asp:linkbutton runat='server' text='<%$ LanguageStrings:ClickMe%>' />
Run Code Online (Sandbox Code Playgroud)
以及包含默认文本的自定义标签,如果还没有,则向数据库添加一行.
<r:languagelabel runat="server" name="AboutUs">About Us</r:languagelabel>
Run Code Online (Sandbox Code Playgroud)
包含字符串的表每种语言有一列.这使得用英语(或任何默认语言)创建网站变得非常容易,然后将表格(填充自身)交给翻译.您还可以很容易地看到翻译内容所需的语言.使用资源,每次需要添加新字符串时,都必须停止正在执行的操作,然后转到每种语言的资源文件并添加资源.
这是语言标签的代码:
''' <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
Run Code Online (Sandbox Code Playgroud)
和效用函数:
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
Run Code Online (Sandbox Code Playgroud)