Mehrsprachige ASP.NET-Website?
-
06-07-2019 - |
Frage
Wie kann ich eine Website so umwandeln, dass sie mehrsprachig ist (Beispiel:Englisch, Französisch, Spanisch)?
Mir gefällt die Ressourcendatei nicht, weil ich das Gefühl habe, dass sie eingeschränkt ist, und es ziemlich lang ist, die Liste zu erstellen.Hast du irgendwelche Vorschläge?
Aktualisieren
Im Moment ist es unserer Meinung nach die beste Möglichkeit, eine XML-Datei zu verwenden und mit etwas Xpath Werte abzurufen.
Lösung
Die implizite Lokalisierung (im Menü „Extras“ von Visual Studio – „Lokale Ressourcen generieren“) ist so einfach wie möglich.Schreiben Sie Ihre Seiten in Ihrer Standardsprache, wählen Sie die Menüoption und Ihre Ressourcendateien werden erstellt und können zur Übersetzung an jemanden gesendet werden.
Die Resx-Datei ist nur XML, sodass Sie sie auf Wunsch des Übersetzungsunternehmens problemlos in (und aus) Tabellenkalkulationen umwandeln können.
Die Verwendung einer Datenbank anstelle von Resx als Sicherungsspeicher ist nicht schwierig.Rick Strahl hat eine gute Erklärung und einen Beispielcode für einen datenbankbasierten Lokalisierungsanbieter Hier - Es gibt auch einen schönen integrierten Lokalisierungseditor mit Schnittstelle zu Google Translations und Babelfish.
Andere Tipps
Wir speichern Ressourcen für mehrsprachige Websites in einer Datenbank. Wir haben ein paar Tools erstellt, um das Erstellen und Zugriff auf diese zu erleichtern. Es gibt einen benutzerdefinierten Expressionbuilder, mit dem wir diese Syntax verwenden können:
<asp:linkbutton runat='server' text='<%$ LanguageStrings:ClickMe%>' />
Und eine benutzerdefinierte Beschriftung, die den Standardtext enthält und der Datenbank eine Zeile hinzufügt, wenn es noch nicht einen gibt.
<r:languagelabel runat="server" name="AboutUs">About Us</r:languagelabel>
Die Tabelle mit den Zeichenfolgen hat eine Spalte pro Sprache. Dies erleichtert es sehr einfach, die Site in Englisch (oder was auch immer die Standardsprache ist) zu erstellen und dann den Tisch (die sich selbst bevölkert) an einen Übersetzer abzugeben. Es ist auch sehr leicht zu sehen, für welche Sprachen Sie Dinge übersetzt haben. Bei Ressourcen müssen Sie jedes Mal, wenn Sie eine neue Zeichenfolge hinzufügen müssen, aufhören, was Sie tun, und dann zur Ressourcendatei für jede Sprache gehen und die Ressource hinzufügen.
Hier ist der Code für das Sprachetikett:
''' <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 Dienstprogrammfunktion:
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
Ressourcendateien sind der richtige Weg. Wir versenden unser Produkt in 12 Sprachen. Wir ziehen alle Zeichenfolgen in Ressourcendateien aus und versenden sie an eine Übersetzungsfirma. Es ist manchmal ein Schmerz, aber das ist die defaktische Art, dies zu tun.
Es macht auch Spaß, wenn 4-Buchstaben englische Wörter in 17 Buchstaben-Phrasen übersetzt werden und Sie Ihre Benutzeroberfläche optimieren müssen.
Wie spät im Designprozess sind Sie? Wenn nicht zu spät, und wenn das Budget es zulässt, sollten Sie auf ein mehrsprachiges CMS portieren wie EKTRON CMS300.NET (mit integrierten Übersetzungswerkzeugen). Wenn nicht, dann haben Sie eine große Aufgabe vor sich.
Eine andere Lösung, die ich verwende, besteht darin, die Sprachordner zu erstellen, die die ASPX -Seiten enthalten, die den gesamten erforderlichen Text in dieser bestimmten Sprache enthalten.
Das einzige Problem hierfür ist, wie Sie so wenig Code wie möglich in diese Replikationsseiten injizieren können. Ich verwende hier ein Controller -Muster, um dies zu tun, und dann eine Objektdatenquelle, um die Daten zu erhalten und an die Steuerelemente auf allen Seiten zu binden.
Auf diese Weise habe ich das Ziel erreicht, die Ressourcendateien loszuwerden, und kann den Code an einem Ort zurückhalten, ohne ihn zu replizieren (sofern nicht erforderlich).
Bearbeiten: Ich würde auch ein gutes CMS -Framework empfehlen.
Eine der Web -Apps, die ich entwickle, hat auch diese NLS -Anforderung.
Ich habe festgestellt, dass es mindestens 3 Orte gibt, an denen Sie lokalisierte Texte haben:
- Benutzeroberfläche
- Datenbanktabellen ("Kataloge" oder wie auch immer Sie sie nennen möchten)
- Backend -Code (Dienste usw.)
Meine Lösung verfügt über eine Tabelle für die Seiten, Tabellen usw. ("Container"), eine Tabelle für jedes Element in diesem Container (z. .
Eine Übersetzungsanwendung hilft mir, die Übersetzungen auf dem neuesten Stand zu halten, und exportiert alle Übersetzungen in XML.
Das Produkt wird mit Übersetzungen geliefert, aber Kunden können die Übersetzungen anpassen und sich sofort in Kraft treten.
Beispielcode, das ich mithilfe von Ressourcendatei Global.asax hinzufügen habe
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-tesite-for-multilanguage.html
http://satindersinght.wordpress.com/2012/06/14/create-tesit-for-multilanguage-support/