¿Sitio web multilingüe ASP.NET?
-
06-07-2019 - |
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.
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 && 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 /