Trabajar con Multilenguaje interno de VB.NET

Iniciado por P4nd3m0n1um, 14 Noviembre 2016, 19:53 PM

0 Miembros y 1 Visitante están viendo este tema.

P4nd3m0n1um

Hace tiempo había visto que se podían crear múltiples formularios con diferentes idiomas para hacer traducciones de nuestro proyecto, pero no doy bien con su buen uso, o quizás sea algo muy beta, ya que tengo un programa que actualmente se traduce con un archivo .ini que tiene toda la información de las palabras utilizadas y quería utilizar el multilenguaje para evitar usar un archivo externo.

Creo un proyecto nuevo y agrego:

Código (vbnet) [Seleccionar]
Language = "Seleccionar.." (Idioma a Traducir) en este caso EN y ES
Localizable = True


Coloco dos botones uno que pasa al Español y otro al Ingles..

Imports System.Globalization
Imports System.ComponentModel

Código (vbnet) [Seleccionar]
Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        ''español
        Dim l As New CultureInfo("es", True)
        Dim resources As ComponentResourceManager = New ComponentResourceManager(Me.GetType)
        For Each c As Control In Me.Controls
            resources.ApplyResources(c, c.Name, l)
        Next c
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        ''ingles
        Dim l As New CultureInfo("en", True)
        Dim resources As ComponentResourceManager = New ComponentResourceManager(Me.GetType)
        For Each c As Control In Me.Controls
            resources.ApplyResources(c, c.Name, l)
        Next c
    End Sub
End Class


y funciona sin problemas, ahora aplico lo mismo en un formulario de un proyecto que tiene 30 formularios más y no funciona..


okik

#1
Accede a 'Propiedades de proyecto' en el menú 'PROYECTO' y selecciona Recursos

Selecciona 'Cadenas'

En la columna 'Nombre',  en la primera fila pones 'Button1_Spanish' y en Valor pones 'Examinar'

En la columna Nombre, en la segunda fila pones 'Button2_English' yen Valor pones "Browse'

Ahora para obtener la cadena pones:
Código (vbnet) [Seleccionar]

   Button1.Text = My.Resources.Button1_English


Código (vbnet) [Seleccionar]

   Button1.Text = My.Resources.Button1_Spanish





También puedes acceder a los recursos desde el Explorador de soluciones.

haz clic en 'Mostrar todos los archivos'

Abre 'MyProyect'

Haz doble clic en Resources.resx



Para crear recursos desde código

Recursos de cadenas/Crear recursos mediante código




EJEMPLO
Crea cadenas en el recurso en tiempo de ejecución.
Código (vbnet) [Seleccionar]

Imports System
Imports System.Collections
Imports System.Resources

Public Class Form1
    Public Sub New()
        'Añade cadenas al registro en tiempo de ejecución
        MyClass.InitializeComponent()
        ' First create the resource file and add strings.
        Dim rw As ResourceWriter = New ResourceWriter("sample.resources")
        rw.AddResource("4564", "Examinar")
        rw.AddResource("4565", "Browse")
        rw.AddResource("Title_Form2", "Diálogo")
        rw.Close()
    End Sub

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        'Obtiene las cadenas del registro
        Dim rr As ResourceReader = New ResourceReader("sample.resources")
        Dim de As IDictionaryEnumerator = rr.GetEnumerator()
        'Obtiene las cadenas en orden de enumeración
        While de.MoveNext
            Select Case de.Key.ToString
                Case "4564" : MessageBox.Show(de.Value.ToString)
                Case "4565" : MessageBox.Show(de.Value.ToString)
            End Select
        End While
        rr.Close()

        'Abre el form2
        Form2.ShowDialog()
    End Sub
End Class
Public NotInheritable Class Form2 : Inherits Form

    Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim rr As ResourceReader = New ResourceReader("sample.resources")
        Dim de As IDictionaryEnumerator = rr.GetEnumerator()
        'Obtiene la cadena para el título del formulario 2
        While de.MoveNext
            Select Case de.Key.ToString
                Case "Title_Form2" : Me.Text = de.Value.ToString
            End Select
        End While
        rr.Close()
    End Sub
End Class