Cómo crear aplicaciones multilenguaje con C#
Tags: csharp
Published: 2021-05-19 02:07:27

{% youtube BQauingTbIQ  %}

[Clic aquí](https://github.com/JuanDiegogit/MultiLenguaje) para ver un proyecto de ejemplo.


Para crear una aplicación multilenguaje en C# lo primero es crear una carpeta donde vamos a colocar cada uno de los lenguajes llamada `Lenguajes` o el nombre que desees.
![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x5r73dxgts9ldwu26xx7.png)

Luego agregamos un archivo de recurso en la carpeta con el nombre de `Strings` o `cadenas` en español.

![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gu9nmstwwrq9kfi85n7b.png)
 

y por cada texto en el formulario o mensaje de alerta en el formulario procedemos hacer una propiedad o fila en el archivo de recurso, para agregar una propiedad se debe abrir el archivo de recurso.
![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dzagszhnf1h7wc4wsouk.png)
 
![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/v2jwq8mx2wwhyogg8gve.png)
 
![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gsmxzrzxk07j36a4nmhs.png)
 
Una vez tengamos el archivo procedemos hacer un archivo resx por cada lenguaje con las mismas propiedad, pero se llamará cómo el archivo anterior pero con un punto y el código de lenguaje, así :
![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2gs9atab29zhwafacrt8.png
)

El código del lenguaje es la unión de la abreviatura del idioma más un    "-" seguido de la abreviatura del país, la abreviatura del idioma en minúscula y la del país en mayúscula.

Ejemplo, el idioma Ingles es "en" y el país de Estados Unido es "US" entonces  el idioma ingles de estados unidos queda así "en-US" [clic aquí para ver los código de los idiomas](http://utils.mucattu.com/iso_639-1.html) y [clic aquí para ver la abreviatura de todos los paises](https://traduciresdescubrir.wordpress.com/2012/07/26/paises-y-abreviaturas)

Una vez tengamos el archivo por cada lenguaje, lo que procedemos hacer el cargar el idioma al cargar el formulario.

con esta línea cambiamos el lenguaje de la aplicación

```
Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en-US");
``` 
pero antes de crear un método que cargue el idioma necesitamos guardar el idioma que el programa tuvo antes de cerrarse para que al volverlo abrir se cargue de nuevo.

eso lo hacemos creado una propiedad para guardar el idioma, sino sabes cómo hacerlo, mira este vídeo.

{% youtube GTjpy2W4Q6g %}

![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/633gj44sw01idkdgruz6.png)

creamos un método que cargue el idioma al cargar el formulario



 ```
  public void CargarIdioma()
        {
            Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(Settings.Default.Idioma);
            lblLenguaje.Text = Strings.lblLenguaje;
            lblnuevo.Text = Strings.lblnuevo;
            ckActivo.Text = Strings.ckActivo;
            btnMensaje.Text = Strings.btnMensaje;
            this.Text = Strings.titulo;
            btnAplicar.Text = Strings.btnAplicar;

        }
```
Al cambiar el idioma, cambiamos la configuración  y volvemos a cargar el idioma

```
  Settings.Default.Idioma = "en-US";
  CargarIdioma();
```
```
  Settings.Default.Idioma = "es-CO";
  CargarIdioma();
```


al cerrar el formulario debemos guardar el último idioma que se seleccionó 

 ```
Settings.Default.Save();
```

> #Trucos

## 1- Crear una clases que controles los idiomas

Creamos una clase con todos los atributos de un idioma y un método estático que devuelta todos los idiomas.

Clase : `Idioma.cs`

 ```
public class Idioma
    {
        public String Nombre { get; set; }
        public String Abreviacion{ get; set; }
        public String Pais { get; set; }
        public String AbreviacionPais{ get; set; }

        public String NombrePais
        {
            get
            {
                return Nombre + "(" + Pais + ")";

            }
        }
        public String CultureInfo
        {
            get
            {
                return Abreviacion + "-" + AbreviacionPais;
            }
        }

        public static List<Idioma> ObtenerIdiomas()
        {
            return new List<Idioma> {
                new Idioma
                {
                    Nombre = "Español",
                    Abreviacion = "es",
                    Pais = "Colombia",
                    AbreviacionPais = "CO"
                },
                 new Idioma
                {
                    Nombre = "English",
                    Abreviacion = "en",
                    Pais = "Estados Unidos",
                    AbreviacionPais = "US"
                },
                  new Idioma
                {
                    Nombre = "português",
                    Abreviacion = "pt",
                    Pais = "Brazil",
                    AbreviacionPais = "BR"
                }
            };
        }

        public static void CambiarTexto(Control.ControlCollection controls)
        {
            foreach (Control c in controls)
            {
                if(c is Panel)
                {
                    CambiarTexto(c.Controls);
                }
                else
                {
                    String text = Strings.ResourceManager.GetString(c.Name);
                    if (text != null)
                    {
                        c.Text = text;
                    }
                }
               
            }
        }

    }
 ```
para llenar un combobox sería así : 
```
  public void LlenarIdiomaCombobox()
        {
            comboBox1.DataSource = Idioma.ObtenerIdiomas();
            comboBox1.DisplayMember = "Nombre";
            comboBox1.ValueMember = "CultureInfo";
        } 
```
Resultado : 

![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/j8bpo4i1xqt260ru5inr.png)
 
otra forma es :

```
  public void LlenarIdiomaCombobox()
        {
            comboBox1.DataSource = Idioma.ObtenerIdiomas();
            comboBox1.DisplayMember = "NombrePais";
            comboBox1.ValueMember = "CultureInfo";
        } 
```

Resultado : 

![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0uf74xpfmru9ui92et95.png)
 
Cargar los idiomas dinámicamente, el único requisito es que el nombre del control se debe  llamar igual que la propiedad del archivo de recurso.

```
    public void CargarIdioma()
        {
            Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(Settings.Default.Idioma);
            Idioma.CambiarTexto(this.Controls);
            this.Text = Strings.titulo;

        }
```

## 2- Instalar ResXManager

Instalar la extensión desde el menú de Herramientas, descargas la extensión y cierras visual studio.


![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5ldzp4xigmxpvf3ilkaw.png)

presionas en modificar (Modify) y luego en finalizar tarea (end Task).

luego vamos donde están los idiomas, clic derecho en uno de ellos y luego clic izquierdo para desplegar las opciones y luego lo abrimos con la extensión
 
![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zcmhc741k6ndo960pekd.png)
 

luego puedes ver y editar todos los idiomas al mismo tiempo y agregar un nuevo idioma
   
![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qqjs4no5xvq7wli1km43.png)