Wir speichern Ressourcen für mehrsprachige Websites in einer Datenbank. Wir haben eine Reihe von Tools entwickelt, die das Erstellen und den Zugriff auf diese Ressourcen erleichtern. Es gibt einen benutzerdefinierten ExpressionBuilder, mit dem wir diese Syntax verwenden können:
<asp:linkbutton runat='server' text='<%$ LanguageStrings:ClickMe%>' />
Und ein benutzerdefiniertes Etikett, das den Standardtext enthält und der Datenbank eine Zeile hinzufügt, wenn noch keine vorhanden ist.
<r:languagelabel runat="server" name="AboutUs">About Us</r:languagelabel>
Die Tabelle, die die Zeichenketten enthält, hat eine Spalte pro Sprache. Dadurch ist es sehr einfach, die Website auf Englisch (oder in der Standardsprache) zu erstellen und die Tabelle (die sich selbst auffüllt) an einen Übersetzer weiterzugeben. Es ist auch sehr einfach zu sehen, für welche Sprachen Sie etwas übersetzen lassen müssen. Bei Ressourcen müssen Sie jedes Mal, wenn Sie eine neue Zeichenfolge hinzufügen müssen, Ihre Arbeit unterbrechen und dann die Ressourcendatei für jede Sprache aufrufen und die Ressource hinzufügen.
Hier ist der Code für die Sprachkennzeichnung:
''' <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
und die Nutzenfunktion:
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