Pregunta

¿Cómo puedo transformar un sitio web para poder manejar varios idiomas (ejemplo: inglés, francés, español)?

No me gusta el archivo de recursos porque me siento limitado y es bastante largo construir la lista. ¿Tienes alguna sugerencia?

Actualizar

Por el momento, la mejor manera que encontramos es usar un archivo XML y con algunos valores Xpath et get.

¿Fue útil?

Solución

La localización implícita (en Visual Studio - Menú Herramientas - Generar recursos locales) es tan fácil como puede ser. Escriba sus páginas en su idioma predeterminado, elija la opción de menú y sus archivos de recursos se crean y pueden enviarse a alguien para que los traduzca.

El archivo resx es solo xml, por lo que si la empresa de traducción lo desea, puede transformarlo en (y fuera de) hojas de cálculo fácilmente.

Usar una base de datos en lugar de resx como su almacén de respaldo no es difícil. Rick Strahl tiene una buena explicación y un código de ejemplo para un proveedor de localización basado en bases de datos aquí : también hay un bonito editor de localización integrado con interfaz para las traducciones de Google y Babelfish.

Otros consejos

Almacenamos recursos para sitios multilingües en una base de datos. Hemos creado un par de herramientas para facilitar su creación y acceso. Hay un ExpressionBuilder personalizado que nos permite usar esta sintaxis:

 <asp:linkbutton runat='server' text='<%$ LanguageStrings:ClickMe%>' />

Y una etiqueta personalizada que contiene el texto predeterminado, y agrega una fila a la base de datos si aún no hay una.

 <r:languagelabel runat="server" name="AboutUs">About Us</r:languagelabel>

La tabla que contiene las cadenas tiene una columna por idioma. Esto hace que sea muy fácil crear el sitio en inglés (o el idioma predeterminado) y luego pasar la tabla (que se completa) a un traductor. También es muy fácil ver para qué idiomas necesitas traducir cosas. Con los recursos, cada vez que necesite agregar una nueva cadena, debe detener lo que está haciendo y luego ir al archivo de recursos para cada idioma y agregar el recurso.

Aquí está el código para la etiqueta de idioma:

''' <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

y la función de utilidad:

    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

Los archivos de recursos son el camino a seguir. Enviamos nuestro producto en 12 idiomas. Extraemos todas las cadenas en archivos de recursos y las enviamos a una empresa de traducción. A veces es un dolor, pero esa es la forma de facto de hacerlo.

También se vuelve divertido cuando las palabras en inglés de 4 letras se traducen en frases de 17 letras y tienes que modificar tu interfaz de usuario.

¿Qué tan avanzado está el proceso de diseño? Si no es demasiado tarde, y si el presupuesto lo permite, considere transferir a un CMS multilingüe como Ektron CMS300.net (que tiene herramientas de traducción integradas). Si no, entonces tienes una gran tarea por delante.

Otra solución que estoy usando es crear las carpetas de idiomas que contienen las páginas aspx que contienen todo el texto requerido en ese idioma en particular.

El único problema aquí es cómo puede inyectar el menor código posible en las páginas que se replican. Estoy usando un patrón de controlador aquí para hacer esto, y luego una fuente de datos de objeto para obtener los datos y vincularlos a los controles en todas las páginas.

De esta manera, he logrado el objetivo de deshacerme de los archivos de recursos y puedo mantener el código en un lugar sin replicarlo (a menos que sea necesario).

Editar: También recomendaría un buen marco CMS.

Una de las aplicaciones web que desarrollo también tiene este requisito de NLS.

Descubrí que hay al menos 3 ubicaciones donde tiene textos localizados:

  • interfaz de usuario
  • tablas de bases de datos (" catálogos " o como quiera llamarlas)
  • código de fondo (servicios, etc.)

Mi solución tiene una tabla para las páginas, tablas, etc. (" Contenedor "), una tabla para cada elemento en ese contenedor (por ejemplo, etiquetas, botones por ID, identificadores de registro) y una tabla para los elementos traducidos ( identificador de idioma más).

Una aplicación de traducción me ayuda a mantener las traducciones actualizadas y exporta todas las traducciones en XML.

El producto se envía con traducciones, pero los clientes pueden ajustar las traducciones, los cambios surten efecto de inmediato.

Código de muestra que hice usando el archivo de recursos agregar 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-website-for-multilanguage.html

http://satindersinght.wordpress.com / 2012/06/14 / create-website-for-multilenguage-support /

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top