traductor - resources c# resx
¿Cómo convertir y almacenar elementos configurables en una aplicación web multilingüe? (7)
Por ejemplo, la página de registro tiene una lista desplegable de Prefijo: señor, señora, señorita, etc. Estos datos de prefijo provienen de una tabla y se pueden configurar; es decir, tenemos una página web de configuración para la misma.
Dado que los valores del menú desplegable están en la base de datos, creo que la traducción también debe estar en la base de datos.
La manera más fácil es tener un campo para cada idioma en su tabla de titles
:
--------------------------
| Id | TitleEn | TitleFr |
--------------------------
| 1 | Mr | M |
| 2 | Mrs | Mme |
| 3 | Miss | Mlle |
--------------------------
Sin embargo, esto no se escalará bien si tiene más idiomas o si desea agregar idiomas en el futuro.
La forma en que lo haría sería agregar una tabla localized_string
como esta:
--------------------------
| Id | Language | String |
--------------------------
| 7 | FR | M |
| 8 | FR | Mme |
| 9 | FR | Mlle |
| 7 | EN | Mr |
| 8 | EN | Mrs |
| 9 | EN | Miss |
--------------------------
En la tabla de títulos y en cualquier otra tabla donde necesite una cadena_calificada, almacena el ID de la cadena:
----------------------------
| Id | localized_string_id |
----------------------------
| 1 | 7 |
| 2 | 8 |
| 3 | 9 |
----------------------------
De esta manera puede consultar la cadena localizada en cualquier idioma y puede agregar tantos idiomas como desee sin modificar el esquema de su base de datos.
Tengo una aplicación web en varios idiomas . Estoy convirtiendo todos los controles, es decir, etiquetas, menú desplegable, texto y mensajes usando el archivo de recursos .
Problema:
Por ejemplo, la página de registro tiene una lista desplegable de Prefijo: señor, señora, señorita, etc. Estos datos de prefijo provienen de una tabla y se pueden configurar; es decir, tenemos una página web de configuración para la misma.
Hay muchas otras cosas configurables y páginas correspondientes.
Mi pregunta es cómo convertir estos datos en otro idioma y cómo guardarlos, ya que no se puede hacer con el archivo de recursos.
Cualquiera que tenga ideas prácticas puede guiarme.
Es probable que el enfoque que desee adoptar sea ampliar el proveedor de recursos.
Revisa lo siguiente:
https://msdn.microsoft.com/en-us/library/aa905797.aspx (el contexto de este artículo es ASP.Net WebForms, eche un vistazo a la sección "Creación de un proveedor de recursos de base de datos").
http://weblogs.asp.net/thangchung/extending-resource-provider-for-soring-resources-in-the-database (esta publicación del blog en realidad aplica lo que está cubierto en el artículo anterior de MSDN, pero a ASP.Net MVC en lugar de WebForms).
No estoy seguro de qué tipo de aplicación ASP.Net está creando, así que pensé que sería valioso incluir referencias tanto para WebForms como para MVC.
Lo que se menciona en estas dos referencias debería darle una buena base sobre la cual implementar su propia solución.
La forma en que actualmente estoy implementando soporte multilingüe en aplicaciones es a través del siguiente método.
- Cree una clase abstracta llamada Idioma de la que heredan todos los idiomas.
- Agregue una propiedad de cadena abstracta para cada cadena de texto que necesite traducción.
- Cada idioma que hereda de la clase de idioma base simplemente devuelve la versión traducida de la cadena.
- Crea una propiedad global para almacenar la clase de idioma elegida actualmente.
- Obtenga valores de cadena que necesiten traducción de propiedad global en lugar de configuración local.
Si bien agregar las cadenas traducidas es tedioso, creo que este método garantiza que todas las partes necesarias se traduzcan, manteniendo el código de UI lo más simple posible.
El uso de una clase base también permite la reutilización de cualquier método o propiedad que se pueda usar en todos los idiomas.
Para intentar dar un esquema básico, la estructura sería así.
// Clase de lenguaje base
public abstract class Language
{
// Field to identify the language by.
public string Code {get; private set;}
// Contructor that takes language code as parameter
public Language(string code)
{
Code = code;
}
// Add the strings you want translating.
// Making them abstract means classes that inherit from
// this class must provide their own implementation of these strings.
public abstract string Hello {get;}
public abstract string Goodbye {get;}
}
// Ejemplo de clase de idioma inglés
public class en_gb : Language
{
// Constructor simply provides base class with the language code.
public en_gb() : base ("en_gb"){}
// By inheriting from Language these properties must be overridden.
// Visual Studio will add these properties for you, so you simply need to add the return value.
public override string Hello {get {return "Hello";} }
public override string Goodbye {get {return "Goodbye";} }
}
// Ejemplo de clase de idioma español
public class es_sp : Language
{
// Constructor simply provides base class with the language code.
public es_sp() : base ("es_sp"){}
// By inheriting from Language these properties must be overridden.
// Visual Studio will add these properties for you, so you simply need to add the return value.
public override string Hello {get {return "Hola";} }
public override string Goodbye {get {return "Adiós";} }
}
Entonces simplemente tienes una propiedad global en alguna parte.
public Language CurrrentLanguage {get; set;}
Todos los elementos que deben traducirse pueden hacer referencia a la propiedad CurrrentLanguage para devolver la cadena deseada.
Ejemplo XAML:
<TextBlock Text="{Binding Source={StaticResource GlobalValues}, Path=CurrrentLanguage.Hello}" />
Ejemplo de código:
Textbox1.Text = GlobalValues.CurrentLanguage.Hello;
Microsoft .NET proporciona soporte para trabajar con información cultural específica utilizando la clase CultureInfo en el espacio de nombres System.Globalization. La información cultural se puede establecer tanto a nivel de página como a nivel de aplicación.
<%@ Page language="C#" Culture="fr-FR"%>
Para establecer la información de Cultura en el nivel de la aplicación, use lo siguiente en la sección Globalización del archivo web.config.
<configuration>
<system.web>
<globalization
culture="en-GB"
/>
</system.web>
</configuration>
prueba esto,
http://aspalliance.com/articleViewer.aspx?aId=957&pId=-1
Para guardar los elementos de configuración que los usuarios ingresan dinámicamente en los recursos, puede usar IResourceWriter de la siguiente manera:
IResourceWriter writer = new ResourceWriter("Resource.resx");
// Adds resources to the resource writer.
writer.AddResource("String 1", "First String");
writer.AddResource("String 2", "Second String");
// Writes the resources to the file or stream, and closes it.
writer.Close();
Prueba el formato XML para distinguir tu lengua
<Controls>
<Control>
<DropDown>
<English>Cities</English>
<Urdu>شھر</Urdu>
<Arabic>البد</Arabic>
</DropDown>
</Control>
</Controls>
Si es configurable por el usuario, no es práctico usar archivos de recursos, ya que los usuarios pueden configurar lo que necesiten.
Entonces, si lo entendí correctamente, creo que la única solución práctica es tener traducciones en una tabla para cada valor que ingresan los usuarios.
Dado que los usuarios pueden ingresar valores en cualquier idioma, puede ser complicado.
Elegiría un idioma requerido por defecto, por ejemplo inglés, de modo que siempre que los usuarios administren los valores (Título o prefijo en su muestra), deben administrarlos en pares, es decir, su idioma e inglés.
Por lo tanto, si la configuración regional es francesa, cuando comprueban el índice de títulos, ven dos columnas, una para francés y otra para inglés.
Si es la primera vez que el usuario francés ingresa a la vista, entonces no hay valores en francés, por lo que el usuario tiene que agregar la traducción al francés de los valores en inglés al registrarse.
Si el usuario agrega un nuevo valor [francés], entonces él / ella también tiene que ingresar la traducción al inglés.
Parece un poco engorroso y puede no ser muy práctico, ¡pero es una opción!
Mejor,
PD: Oye, ¡por favor comparte la solución cuando llegues!