Test Foro de elhacker.net SMF 2.1

Programación => Programación General => .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 (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..

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 (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 (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 (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