Proyecto de clases utilizando StringResources y System.Reflection, para generar aplicacion multilenguaje.
-
Singleton-pattern -
Propiedades. Cada una representa la
keyen el archivoStringRersources. -
GetValueProperty() Metodo utilizado para acceder al
valuede la propiedad deseada, medianteSystem.Reflectionpublic 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/valuebase
-
StringResources.ES-AR.resx Archivo que contiene los pares
key/valuepara el idioma Español
-
StringResources.EN-US.resx Archivo que contiene los pares
key/valuepara el idioma Ingles
-
StringResources.ZH-CHS.resx Archivo que contiene los pares
key/valuepara 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:
prefijotipo control +nombrede la propiedad en la claseIdioma. Tomando como ejemplo el texto "Ingrese su usuario" el controllabelse 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);
}