Sito web multilingue ASP.NET?
-
06-07-2019 - |
Domanda
Come posso trasformare un sito Web per essere in grado di gestire più lingue (esempio: inglese, francese, spagnolo)?
Non mi piace il file di risorse perché mi sento limitato ed è abbastanza lungo per costruire l'elenco. Hai qualche suggerimento?
Aggiornamento
Per il momento il modo migliore che abbiamo trovato è usare un file XML e con alcuni Xpath e ottenere valori.
Soluzione
La localizzazione implicita (nel menu Visual Studio - Strumenti - Genera risorse locali) è più semplice che può essere. Scrivi le tue pagine nella lingua predefinita, seleziona l'opzione di menu e i tuoi file di risorse vengono creati e possono essere inviati a qualcuno da tradurre.
Il file resx è solo xml, quindi se la società di traduzione lo desidera puoi trasformarlo facilmente in fogli di calcolo (e fuori).
L'uso di un database invece di resx come archivio di backup non è difficile. Rick Strahl ha una buona spiegazione e un codice di esempio per un provider di localizzazione basato su database qui - esiste anche un bel editor di localizzazione integrato con interfaccia per traduzioni Google e Babelfish.
Altri suggerimenti
Archiviamo risorse per siti multilingue in un database. Abbiamo creato un paio di strumenti per semplificare la creazione e l'accesso a questi. Esiste un ExpressionBuilder personalizzato che ci consente di utilizzare questa sintassi:
<asp:linkbutton runat='server' text='<%$ LanguageStrings:ClickMe%>' />
E un'etichetta personalizzata che contiene il testo predefinito e aggiunge una riga al database se non ce n'è già una.
<r:languagelabel runat="server" name="AboutUs">About Us</r:languagelabel>
La tabella contenente le stringhe ha una colonna per lingua. Ciò semplifica la creazione del sito in inglese (o qualunque sia la lingua predefinita), quindi passa la tabella (che si popola) a un traduttore. È anche molto facile vedere per quali lingue è necessario tradurre le cose. Con le risorse, ogni volta che è necessario aggiungere una nuova stringa, è necessario interrompere ciò che si sta facendo, quindi andare al file di risorse per ogni lingua e aggiungere la risorsa.
Ecco il codice per l'etichetta della lingua:
''' <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
e la funzione di utilità:
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
I file di risorse sono la strada da percorrere. Spediamo il nostro prodotto in 12 lingue. Estraiamo tutte le stringhe in file di risorse e le spediamo a una società di traduzione. A volte è un dolore, ma questo è il modo defacto per farlo.
È divertente anche quando le parole inglesi di 4 lettere vengono tradotte in frasi di 17 lettere e devi modificare l'interfaccia utente.
Quanto sei in ritardo nel processo di progettazione? Se non è troppo tardi e se il budget lo consente, prendere in considerazione il porting su un CMS multilingue come Ektron CMS300.net (che ha strumenti di traduzione integrati). In caso contrario, hai un compito enorme davanti a te.
Un'altra soluzione che sto usando è quella di creare le cartelle della lingua che contengono le pagine aspx che contengono tutto il testo richiesto in quella particolare lingua.
L'unico problema qui è come si può iniettare il minor codice possibile in quelle pagine replicanti. Sto usando un modello di controller qui per fare questo, e quindi una fonte di dati oggetto per ottenere i dati e collegarli ai controlli in tutte le pagine.
In questo modo ho raggiunto l'obiettivo di sbarazzarmi dei file di risorse e posso mantenere il codice in un posto senza replicarlo (a meno che non sia necessario).
Modifica: consiglierei anche un buon framework CMS.
Anche una delle app Web che sviluppo ha questo requisito NLS.
Ho scoperto che ci sono almeno 3 posizioni in cui sono presenti testi localizzati:
- interfaccia utente
- tabelle di database (" cataloghi " o come vuoi chiamarle)
- codice backend (servizi ecc.)
La mia soluzione ha una tabella per le pagine, le tabelle, ecc. (" Contenitore "), una tabella per ciascun elemento in quel contenitore (ad es. etichette, pulsanti per ID, identificatori di record) e una tabella per gli elementi tradotti ( più identificatore di lingua).
Un'applicazione di traduzione mi aiuta a mantenere aggiornate le traduzioni ed esporta tutte le traduzioni in XML.
Il prodotto viene fornito con le traduzioni, ma i clienti possono modificare le traduzioni, le modifiche diventano immediatamente effettive.
Codice di esempio che ho fatto utilizzando il file di risorse aggiungi 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-sito-per-multilanguage.html
http://satindersinght.wordpress.com / 2012/06/14 / create-sito-per-multilingua-support /