Meertalige applicatie

  • Onderwerp starter Onderwerp starter bn2vs
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

bn2vs

Terugkerende gebruiker
Lid geworden
18 aug 2007
Berichten
1.705
Hey,

Ik wil een van mn apps multilanguage functionaliteit geven. Heb wat zitten googlen, en op de meetste plaatsen word er aangeraden om .resx files te gebruiken. Dat is handig omdat het in je app zit en dus niet makkelijk omzeep geholpen kan worden. Ik wil echter ook de mogelijkheid om de gebruiker achteraf nieuwe talen bij te downloaden (zoals bij firefox bv). Iemand een suggestie hoe ik dit best doe? (txt, xml, ect?) En hoe ik die 2 verschillende systemen dan best met elkaar laat werken?

Alvast bedankt :)
 
Data bestanden

Je kunt het beste 1 default taal opnemen (bijvoorbeeld Engels) zodat je altijd iets hebt en andere talen toevoegen met een databestand (een tekst file). Als je daarin een check inbouwt met een som die moet kloppen kun je misbruik voorkomen. Met een .ini bestand kun je dan de gekozen taal opslaan.
Als je zinnen gebruikt met ingevulde waarden b.v. "File XXX van datum YYY is corrupt" en je moet XXX en YYY invullen dan moet je oppassen. Ik heb zelf een keer een tweetalig systeem gemaakt en je zult zien dat de volgorde van zinnen in beide talen soms anders is. In de ene taal is de volgorde in een zin b.v. dat je eerst XXX en dan YYY invult en in de andere taal eerst YYY en XXX. Als je dat wilt doen moet je iets verzinnen zodat e.e.a goed wordt ingevuld.
 
Je kan DLL's gebruiken, bijvoorbeeld voor elke taal 1 (kan ook voor alle talen, maar dan wordt het erg groot om achteraf te downloaden).
Je maakt dan een klasse in een dll en zet je alle teskt van je programma in aparte strings.
Bijvoorbeeld:

Code:
Public strLabel1Text As String = "Welkom bij mijn prog"
Public strMainText As String = "MijnProg"
Public strButton1Text As String = "Button"

Natuurlijk wel in de goede taal en dat doe je dan voor elke dll. Zo kan je ze achteraf nog meer downloaden en checken of de language files aanwezig zijn :)
 
Hey

Ik heb nu voor de app waar ik dit voor nodig had (BN+ Converter Pro) gekozen voor de volgende oplossing:

Ik gebruik .resx files met daarin de namen van de controls die vertaald zijn, en de bijhorende vertaling. Met een lus check ik voor alle controls of er een vertaling in de correcte .resx file staat, en als dat zo is verandert die de text van die control.

Systeem werkt vlot en heeft voor zover ik kan zien de volgende voordelen en nadelen:

Voordelen
* Heel flexiebel systeem dat toelaat deelse veratlingen te maken (hoofdreden dat ik het zo heb gedaan)
* Snel omdat het niet eerst uit een andere file of datasource gehaald moet worden
* Niet molbaar door een user omdat het in de app zelf gecompiled word

Nadelen
* Geen download systeem voor extra talen mogelijk

Als iemand geintereseerd is in de source of nog suggesties heeft, let me know :D
 
Hey

Ik heb nu voor de app waar ik dit voor nodig had (BN+ Converter Pro) gekozen voor de volgende oplossing:

Ik gebruik .resx files met daarin de namen van de controls die vertaald zijn, en de bijhorende vertaling. Met een lus check ik voor alle controls of er een vertaling in de correcte .resx file staat, en als dat zo is verandert die de text van die control.

Systeem werkt vlot en heeft voor zover ik kan zien de volgende voordelen en nadelen:

Voordelen
* Heel flexiebel systeem dat toelaat deelse veratlingen te maken (hoofdreden dat ik het zo heb gedaan)
* Snel omdat het niet eerst uit een andere file of datasource gehaald moet worden
* Niet molbaar door een user omdat het in de app zelf gecompiled word

Nadelen
* Geen download systeem voor extra talen mogelijk

Als iemand geintereseerd is in de source of nog suggesties heeft, let me know :D

Ik ben geintereseerd in de source-code...
 
Niet zo makkelijk om te posten zo omdat het uit meerdere stukken bestaat, maar in de volgende versie van mn brute force app gaat dat in zitten, dus dan kan je het geheleproject downloaden en zo zien :)

Deze code heb ik in een module staan en bevat de functies nodig om de correcte veratlingen van de betreffende control op te halen.
Code:
    Private rm As Resources.ResourceManager

    Friend Sub setLangValue(ByVal component As Object, Optional ByVal langKey As String = Nothing)
        If component Is Nothing Then Exit Sub
        Dim langValue As String

        If langKey Is Nothing Then
            Select Case True
                Case TypeOf (component) Is ToolStripMenuItem
                    langKey = CType(component, ToolStripMenuItem).Name
                Case TypeOf (component) Is Control
                    langKey = CType(component, Control).Name
                Case TypeOf (component) Is ToolStripItem
                    langKey = CType(component, ToolStripItem).Name
                Case Else
                    MessageBox.Show("not valid type" & vbNewLine & component.GetType.ToString)
            End Select
        End If

        langValue = getLangValue(langKey)

        If langValue IsNot Nothing Then
            If langValue.Length > 0 Then
                Select Case True
                    Case TypeOf (component) Is ToolStripMenuItem
                        CType(component, ToolStripMenuItem).Text = langValue
                    Case TypeOf (component) Is Control
                        CType(component, Control).Text = langValue
                    Case TypeOf (component) Is ToolStripItem
                        CType(component, ToolStripItem).Text = langValue
                End Select
            End If
        End If
    End Sub

    Friend Function getLangValue(ByVal langKey As String) As String
        If IsNothing(rm) Then setLangResourceManager(True)
        If langKey Is Nothing Then Return ""
        Return rm.GetString(langKey)
    End Function

    Friend Sub setLangResourceManager(ByVal autoDetect As Boolean, _
                                      Optional ByVal languageCode As String = Nothing)
        'MessageBox.Show(System.Globalization.CultureInfo.CurrentUICulture.Name)
        
        If autoDetect Then
            languageCode = System.Globalization.CultureInfo.CurrentCulture.ToString.ToUpper.Substring(0, 2)
        End If

        Select Case languageCode
            Case "NL" : rm = My.Resources.Dutch.ResourceManager
            Case Else : rm = My.Resources.English.ResourceManager
        End Select

    End Sub

Deze code mol je gewoon ergens anders in je app, in dit geval is dat in de form die ik multilanguage wou. Is een sub die alle child objecten van een bepaald object doorloopt en als die beschikbaar is er de vertaling van instelt.
Code:
    Private Sub setControlLangValues(ByVal parent As Object)
        setLangValue(parent)

        Select Case True
            Case TypeOf (parent) Is ToolStrip
                For Each item As ToolStripItem In CType(parent, ToolStrip).Items
                    If Not TypeOf (item) Is ToolStripSeparator Then
                        setControlLangValues(item)
                    End If
                Next

            Case TypeOf (parent) Is ToolStripMenuItem
                For Each item As Object In CType(parent, ToolStripMenuItem).DropDownItems
                    setControlLangValues(item)
                Next

            Case TypeOf (parent) Is ToolStripSplitButton
                For Each item As Object In CType(parent, ToolStripSplitButton).DropDownItems
                    setControlLangValues(item)
                Next

            Case TypeOf (parent) Is TabControl
                For Each obj As Object In CType(parent, TabControl).TabPages
                    setControlLangValues(obj)
                Next

            Case TypeOf (parent) Is ToolStripContainer
                Dim container As ToolStripContainer = CType(parent, ToolStripContainer)
                setControlLangValues(container.ContentPanel)
                setControlLangValues(container.TopToolStripPanel)
                setControlLangValues(container.BottomToolStripPanel)

            Case TypeOf (parent) Is Control
                For Each obj As Object In CType(parent, Control).Controls
                    setControlLangValues(obj)
                Next

        End Select
    End Sub

Dan moet je die sub nog aanroepen, wat een volledige lijn code opijst xD
Code:
setControlLangValues(Me)
Me is dus de form waar die code in staat. Je kan dat dus doen voor meedere forms met enorm weinig code.

In je resx fiels moet je dus gewoon de control naam hebben staan met daarnaast de correcte vertaling :)

Hoop dat je hier iets aan heb :thumb:
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan