Formulier localization

Status
Niet open voor verdere reacties.

snelledre

Gebruiker
Lid geworden
1 dec 2013
Berichten
40
Allen,

Ik heb enige tijd geleden een mooi programma gemaakt in access wat goed werkt (TD registratie).
Alleen ik heb nu één probleem het werkt te goed ze willen het namelijk ook nu een Frans/Vlaams talige vestiging ook gaan gebruiken.
Nu zijn alle formulieren e.d. opgemaakt met vaste label in het nederlands.
Nu moeten deze 2 talig gaan worden is mijn idee.

Mijn plan is:
Een tabel maken met de Nederlandse omschrijving en de Franse omschrijving en een LangId uiteraard.
Als ik nu op het hoofd formulier een taal keuze maak die bijvoorbeeld een variabele in dat formulier waarde nl of fr heeft.
Dit kan natuurlijk ook in een tabel zijn als dit makkelijker of robuuster is.

Als ik nu bijvoorbeeld vanuit het hoofd formulier een andere formulier oproep en tijdens het laden van het andere formulier check welke taal-waarde geschreven is daar de volgende actie doet voor elk label.

Code:
If lang = 1 Then
Bijschrift5.Caption = "Hallo"
Bijschrift6.Caption = "Tot ziens"
Else
Bijschrift5.Caption = "Allo"
Bijschrift6.Caption = "au revoir"
End If

Natuurlijk zijn de Caption nu hardcoded maar moet verwijzen naar de tabel uiteraard.
Gaat dit goed werken ongeacht het veel werk is voor alle labels.
Of zijn er andere handigere manieren dan het bovenstaande.

André
 
Dat kan ook met iets als dit, als Nederlands (lang) = 1 en Frans (lang) = 2:
Code:
    Bijschrift5.Caption = Choose(lang, "Hallo", "Allo")
    Bijschrift6.Caption = Choose(lang, "Tot ziens", "Au revoir")
 
Laatst bewerkt:
Afhankelijk van hoe vaak en hoe te onderhouden. Wat de meeste websites / apps doen is alles wat een tekst heeft nummeren en dan eenvoudig de tekst uit een lijst laden. De lijst zelf vul je met de taal die geselecteerd is. Het vullen kan van een centrale lokatie gebeuren intern, maar ook een meegeleverd tekstbestand, XML of database zijn. In excel zou het zelfs een verborgen tabblad kunnen zijn. Ik zou in ieder geval niet met IF constructies gaan werken, dat is moeilijk, arbeidsintensief, makkelijk om fouten in te maken en niet te onderhouden
 
Mijn plan is:
Een tabel maken met de Nederlandse omschrijving en de Franse omschrijving en een LangId uiteraard.
Een uitstekend plan! Ik heb zoiets wel eens gemaakt, en het is dan vrij simpel om bij het openen van een formulier alle labels aan te passen. Niet op de aangegeven manier overigens :).
 
Een uitstekend plan! Ik heb zoiets wel eens gemaakt, en het is dan vrij simpel om bij het openen van een formulier alle labels aan te passen. Niet op de aangegeven manier overigens :).

Op welke manier zou jij dan de gegevens uit de tabel naar de labels e.d. schrijven.
Zoals je ziet ben ik geen expert maar ben wel bereid om verder te leren hoe dingen beter en makkelijker aangepakt kunnen worden.
 
Het gaat relatief simpel als je de tabel met vertalingen op een handige manier inricht.
Om te beginnen zou ik dat niet helemaal genormaliseerd doen, al kan dat wel mocht je dat willen. Maar omdat het vaak maar om een paar talen gaat, zou ik dus per label één record maken. Je krijgt dan ongeveer deze constructie qua velden:
PHP:
TaalID - Formuliernaam - Labelnaam - Nederlands - Engels - Duits - Frans

TaalID is dan een Autonummer (niet zo boeiend eigenlijk), Formuliernaam is uiteraard de naam van het formulier, Labelnaam de naam van het te veranderen label, en bij de landen vul je uiteraard de gewenste tekst in. Voor Formuliernaam kun je nog een keuzelijst maken die op basis van een verborgen tabel alle formuliernamen laat zien. Dan kun je geen typfout maken. De labelnamen zou ik standaard houden, en ze opvolgend nummeren. Dus Label1, Label2, Label 3 en zo door. Dus als je 43 labels op een bepaald formulier hebt, en 23 op een tweede formulier, dan heb je in totaal 66 records in de vertaaltabel.

Bij het openen van het formulier lees je eerst de tabel met vertalingen uit, gefilterd op formuliernaam (uiteraard). Voor Formulier1 open je dus een recordset met 43 records, en Formulier2 bevat een recordset met 23 records. Alle recordsets bevatten, als het goed is, labelnamen die één keer voorkomen.
Vervolgens maak je een loop die de labels instelt. Bijvoorbeeld zoiets:
PHP:
Private Sub Form_Load()
Dim rs As DAO.Recordset
Dim arr As Variant

    arr = Split(Me.OpenArgs, "|")
    CurrentDb.OpenRecordset ("SELECT Labelnaam, " & arr(UBound(arr)) & " FROM tVertalingen WHERE Formuliernaam = """ & arr(LBound(arr)) & """")
    With rs
        Do While Not .EOF
            Me(Labelnaam.Value).Caption = .Fields(arr(UBound(arr))).Value
        Next i
        .MoveNext
    End With
End Sub

De code maakt gebruik van de parameter OpenArgs en die geef je mee bij het openen van het formulier. Dus onder de knop waarmee je het formulier opent. Daarin staat dan de naam van het formulier, en de taal; gescheiden door een pipe symbool. Bijvoorbeeld het openen van formulier1 op basis van de keuzelijst cboFormulier met alle formuliernamen, en cboTaal met daarin alle beschikbare talen:
PHP:
     DoCmd.OpenForm "Formulier1", OpenArgs = Me.cboFormulier & "|" & Me.cboTaal

De eerste variabele wordt gebruikt om het formulier te filteren, de tweede om het juiste veld uit de tabel tVertalingen te kiezen.
De rest van de code lijkt mij voor zichzelf te spreken. De belangrijkste regel is natuurlijk Me(Labelnaam.Value).Caption = .Fields(arr(UBound(arr))).Value; deze regel past de tekst van het label op het formulier aan met de gekozen vertaling.
 
Bedankt allen hiermee kan ik verder.
Zal morgen eens een opzet gaan proberen.
Ik zal eerst de verder borduren op de hier aangedragen richting.

Tevens had ik vandaag nog een versie gevonden alleen deze is wat ingewikkelder.
In deze versie kan je ook combobox en list inhoud meenemen maar dat is voor mij niet nodig vandaar.
Voor de liefhebbers hier nog de link

André
 
Ingewikkelder? Ja. Handiger? Nee. Kan het meer: ook niet.... Persoonlijk kies ik er niet voor om het op deze manier te doen. Ik pak met mijn methode alleen die formulieren aan die op dat moment gebruikt worden. Maar in essentie is de techniek hetzelfde.
 
Octafish,

Ik heb de wat aangepast om alles werkend te krijgen.
Eerst voor de drukknop in jouw versie bleef de waarde van OpenArgs NULL.
Gewijzigde code: Als je OpenArgs = weglaat werkt het wel en staat er wel een waarde in althans bij mij.
PHP:
DoCmd.OpenForm "Formulier1", acNormal, , , , acDialog, Me.cboFormulier & "|" & Me.cboTaal

De code in het nieuw te openen formulier is ook gewijzigd.
Gewijzigde code: i gedefineerd,
Misschien overbodig maar de openrecordset naar Set rs=,
Code gaf aan een missing For dus deze er ook in gezet.
Dit alles getest en werkt, misschien nog niet de beste oplossing maar werkt wel.
Code:
Private Sub Form_Load()
Dim rs As DAO.Recordset
Dim arr As Variant
Dim i As Long
 
If Len(Me.OpenArgs) > 0 Then
    arr = Split(Me.OpenArgs, "|")
    Set rs = CurrentDb.OpenRecordset("SELECT Labelnaam, " & arr(UBound(arr)) & " FROM tVertalingen WHERE Formuliernaam = """ & arr(LBound(arr)) & """")
    If rs.EOF And rs.BOF Then
    Else
        Do While Not rs.EOF
            For i = 0 To rs.Fields.Count - 1
                Me(rs!Labelnaam.Value).Caption = rs.Fields(arr(UBound(arr))).Value
            Next i
            rs.MoveNext
        Loop
    End If
End If
End Sub


Nu nog even uitzoeken hoe dit werkt met comboboxen. :)


André
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan