6 Stimmen

ASP.NET mehrsprachige Website?

Wie kann ich eine Website so umgestalten, dass sie mehrsprachig ist (Beispiel: Englisch, Französisch, Spanisch)?

Ich mag die Ressourcendatei nicht, weil ich mich eingeschränkt fühle und es ziemlich lang ist, die Liste zu erstellen. Haben Sie einen Vorschlag?

Update

Im Moment ist der beste Weg, den wir gefunden haben, eine XML-Datei zu verwenden und mit einigen Xpath et Werte zu erhalten.

9voto

martin Punkte 1036

Die implizite Lokalisierung (im Menü Visual Studio - Extras - Lokale Ressourcen generieren) ist so einfach wie nur möglich. Schreiben Sie Ihre Seiten in Ihrer Standardsprache, wählen Sie die Menüoption, und Ihre Ressourcendateien werden erstellt und können an jemanden zum Übersetzen geschickt werden.

Bei der resx-Datei handelt es sich lediglich um eine xml-Datei, die auf Wunsch des Übersetzungsunternehmens problemlos in Tabellenkalkulationen umgewandelt werden kann (und auch wieder daraus entfernt werden kann).

Die Verwendung einer Datenbank anstelle von resx als Sicherungsspeicher ist nicht schwierig. Rick Strahl hat eine gute Erklärung und Beispielcode für einen datenbankgesteuerten Lokalisierungsanbieter aquí - Es gibt auch einen netten eingebauten Lokalisierungseditor mit Schnittstelle zu Google-Übersetzungen und Babelfish.

6voto

Herb Caudill Punkte 49603

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

2voto

Cory Foy Punkte 7112

Ressourcendateien sind das Mittel der Wahl. Wir liefern unser Produkt in 12 Sprachen aus. Wir ziehen alle Strings in Ressourcendateien und geben sie an ein Übersetzungsunternehmen weiter. Das ist manchmal mühsam, aber das ist die Standardmethode, um es zu tun.

Lustig wird es auch, wenn englische Wörter mit 4 Buchstaben in Ausdrücke mit 17 Buchstaben übersetzt werden und Sie Ihre Benutzeroberfläche anpassen müssen.

1voto

Danimal Punkte 7510

Wie weit sind Sie mit dem Entwurfsprozess? Wenn es nicht zu spät ist und das Budget es zulässt, sollten Sie eine Portierung auf ein mehrsprachiges CMS wie Ektron CMS300.net (das über integrierte Übersetzungswerkzeuge verfügt). Wenn nicht, dann haben Sie eine große Aufgabe vor sich.

0voto

sajidnizami Punkte 487

Eine andere Lösung, die ich verwende, besteht darin, die Sprachordner zu erstellen, die die aspx-Seiten mit dem gesamten erforderlichen Text in der jeweiligen Sprache enthalten.

Das einzige Problem dabei ist, wie man so wenig Code wie möglich in diese sich wiederholenden Seiten einfügen kann. Ich bin mit einem Controller-Muster hier, dies zu tun, und dann ein Objekt Datenquelle, um die Daten zu erhalten und binden Sie es an die Steuerelemente in allen Seiten.

Auf diese Weise habe ich das Ziel erreicht, die Ressourcendateien loszuwerden, und ich kann den Code an einem Ort aufbewahren, ohne ihn zu replizieren (es sei denn, dies ist notwendig).

Edit: Ich würde auch ein gutes CMS-Framework empfehlen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X