Proyecto de clases utilizando StringResources
y System.Reflection
, para generar aplicacion multilenguaje.
-
Singleton-pattern
-
Propiedades. Cada una representa la
key
en el archivoStringRersources
. -
GetValueProperty() Metodo utilizado para acceder al
value
de la propiedad deseada, medianteSystem.Reflection
public string GetValueProperty(string name) { try { return GetType().GetProperty(name).GetValue(this, null).ToString(); } catch (Exception) { return null; } }
Uso de la clase Idioma
en un simple formulario de Login.
-
Idiomas. Español / Ingles / Chino
-
StringResources.resx Archivo que contiene los pares
key/value
base -
StringResources.ES-AR.resx Archivo que contiene los pares
key/value
para el idioma Español -
StringResources.EN-US.resx Archivo que contiene los pares
key/value
para el idioma Ingles -
StringResources.ZH-CHS.resx Archivo que contiene los pares
key/value
para el idioma Chino -
AplicarIdioma() Metodo creado para aplicar el idioma seleccionado.
- Para facilitar las traducciones se opta por nombrar cada elemento del formulario con la siguiente regla:
prefijo
tipo control +nombre
de la propiedad en la claseIdioma
. Tomando como ejemplo el texto "Ingrese su usuario" el controllabel
se llamaralbl
[prefijo] +Usuario
[propiedad]
- Para facilitar las traducciones se opta por nombrar cada elemento del formulario con la siguiente regla:
private void AplicarIdioma()
{
try
{
// Recorro los controles para cambiar el idioma
// En aquellos elementos que los textos deben ser en mayusculas se establece la propiedad tag = upper
foreach (Control ctrl in Controls)
{
string value = Idioma.getInstance.GetValueProperty(ctrl.Name.Substring(3));
if (string.IsNullOrEmpty(value)) continue;
if (ctrl is Label || ctrl is Button)
ctrl.Text = ctrl.Tag != null ? ctrl.Tag.ToString() == "upper" ? value.ToUpper() : value : value;
}
}
catch (Exception ex)
{
// Formulario creado para mostar el error ocurrido
using (frmError frm = new frmError(ex.Message, Idioma.getInstance.ErrorInesperado))
frm.ShowDialog(this);
}
// Cambia a Bold el label correspondiente al idioma actual
foreach (Label lbl in (from c in panelIdioma.Controls.OfType<Label>()
where !string.IsNullOrEmpty(c.Tag.ToString())
select c))
lbl.Font = new Font("Microsoft Sans Serif", 8,
(lbl.Tag.ToString() == Thread.CurrentThread.CurrentUICulture.Name.ToUpper()) ? FontStyle.Bold
: FontStyle.Regular);
}