Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: P4nd3m0n1um en 14 Noviembre 2016, 19:53 pm



Título: Trabajar con Multilenguaje interno de VB.NET
Publicado por: P4nd3m0n1um en 14 Noviembre 2016, 19:53 pm
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
  1. Language = "Seleccionar.." (Idioma a Traducir) en este caso EN y ES
  2. Localizable = True

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

Imports System.Globalization
Imports System.ComponentModel
 
Código
  1. Public Class Form1
  2.    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  3.        ''español
  4.        Dim l As New CultureInfo("es", True)
  5.        Dim resources As ComponentResourceManager = New ComponentResourceManager(Me.GetType)
  6.        For Each c As Control In Me.Controls
  7.            resources.ApplyResources(c, c.Name, l)
  8.        Next c
  9.    End Sub
  10.  
  11.    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
  12.        ''ingles
  13.        Dim l As New CultureInfo("en", True)
  14.        Dim resources As ComponentResourceManager = New ComponentResourceManager(Me.GetType)
  15.        For Each c As Control In Me.Controls
  16.            resources.ApplyResources(c, c.Name, l)
  17.        Next c
  18.    End Sub
  19. 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..



Título: Re: Trabajar con Multilenguaje interno de VB.NET
Publicado por: okik en 15 Noviembre 2016, 11:20 am
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
  1.    Button1.Text = My.Resources.Button1_English

Código
  1.    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 (https://msdn.microsoft.com/es-es/library/aa309459(v=vs.71).aspx)



EJEMPLO
Crea cadenas en el recurso en tiempo de ejecución.
Código
  1. Imports System
  2. Imports System.Collections
  3. Imports System.Resources
  4.  
  5. Public Class Form1
  6.    Public Sub New()
  7.        'Añade cadenas al registro en tiempo de ejecución
  8.        MyClass.InitializeComponent()
  9.        ' First create the resource file and add strings.
  10.        Dim rw As ResourceWriter = New ResourceWriter("sample.resources")
  11.        rw.AddResource("4564", "Examinar")
  12.        rw.AddResource("4565", "Browse")
  13.        rw.AddResource("Title_Form2", "Diálogo")
  14.        rw.Close()
  15.    End Sub
  16.  
  17.    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  18.        'Obtiene las cadenas del registro
  19.        Dim rr As ResourceReader = New ResourceReader("sample.resources")
  20.        Dim de As IDictionaryEnumerator = rr.GetEnumerator()
  21.        'Obtiene las cadenas en orden de enumeración
  22.        While de.MoveNext
  23.            Select Case de.Key.ToString
  24.                Case "4564" : MessageBox.Show(de.Value.ToString)
  25.                Case "4565" : MessageBox.Show(de.Value.ToString)
  26.            End Select
  27.        End While
  28.        rr.Close()
  29.  
  30.        'Abre el form2
  31.        Form2.ShowDialog()
  32.    End Sub
  33. End Class
  34. Public NotInheritable Class Form2 : Inherits Form
  35.  
  36.    Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  37.        Dim rr As ResourceReader = New ResourceReader("sample.resources")
  38.        Dim de As IDictionaryEnumerator = rr.GetEnumerator()
  39.        'Obtiene la cadena para el título del formulario 2
  40.        While de.MoveNext
  41.            Select Case de.Key.ToString
  42.                Case "Title_Form2" : Me.Text = de.Value.ToString
  43.            End Select
  44.        End While
  45.        rr.Close()
  46.    End Sub
  47. End Class
  48.