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.

È stato utile?

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 &amp;&amp; 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 /

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top