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:
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
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..
Accede a '
Propiedades de proyecto' en el menú '
PROYECTO' y selecciona
RecursosSelecciona
'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:
Button1.Text = My.Resources.Button1_English
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.resxPara crear recursos desde código
Recursos de cadenas/Crear recursos mediante código (https://msdn.microsoft.com/es-es/library/aa309459(v=vs.71).aspx)
EJEMPLO
Crea cadenas en el recurso en tiempo de ejecución.
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