Pagina's in dit artikel
-
Voorbereiding
-
Map of add-in
-
Menu's
-
Toolbars
-
Beperk toegang
-
Code beveiligen
-
Initialiseren
-
Instellingen
-
Talen
-
Installatie
-
Conclusie
Internationalisatie (meerdere talen)
Bij veel invoegtoepassingen kan het prettig zijn voor de gebruiker
als de taal van de gebruikersinterface veranderd kan worden. Dit houdt
in, dat alle teksten die aan de gebruiker getoond moeten worden niet
meer vast in de VBA code kunnen blijven staan.
Er zijn verschillende oplossingen denkbaar voor het opslaan van de
verschillende talen:
Voordeel: Kan zo worden ingericht, dat de gebruiker zelf een nieuwe
taal kan toevoegen. Nadeel: als de gebruiker een fout maakt, kan het
gebeuren dat de applicatie verkeerde teksten gaat gebruiken, met alle
(interessante) gevolgen van dien.
- In een werkblad in de invoegtoepassing zelf
Voordeel: Eenvoudig te bewerken, verschillende talen kunnen naast
elkaar worden geplaatst. Nadeel (in geval van een invoegtoepassing): Een
nieuwe taal kan niet zomaar door de gebruiker worden toegevoegd, tenzij
hiervoor speciale voorzieningen getroffen worden.
In het dit voorbeeld wordt gebruik gemaakt van een werkblad.
Het werkblad de volgende indeling (zie afbeelding 10):
Afbeelding 10: Werkblad met vertalingen
Kolom A bevat een beschrijving van de locatie waarvoor de vertalingen
bestemd zijn, kolom B het object waar de vertaling bij hoort, kolom C de
eigenschap die is vertaald, kolom D en verder de vertalingen zelf, met
een kolom voor elke taal. De code die de vertalingen moet inlezen maakt
gebruik van een aantal gedefinieerde namen welke de linkerbovenhoek
aanduiden van een reeks vertalingen die bij elkaar horen. De naam
"Languages" (cel D1) duidt het begin aan van de aanwezige talen. De code
zoekt de eerste rij af, te beginnen met cel D1 en stopt bij de eerste
lege cel op rij 1. De naam "Userform1" (cel D2) duidt het beginpunt aan
van de vertalingen voor Userform1. De code start hier met vertalingen
lezen, eerst wordt de juiste kolom gekozen aan de hand van de ingestelde
taal. Dan worden de cellen van die kolom van boven naar beneden
ingelezen tot een lege cel wordt gevonden. Op soortgelijke wijze wordt
de naam "MsgBoxes" gebruikt om alle vertalingen voor berichtvensters op
te halen.
De code die de vertalingen inleest wordt getoond in listing 7:
Listing 7
Sub ReadMessages()
Dim
iCount As Long
ReDim
gsMsgs(10)
With
ThisWorkbook.Names("Languages").RefersToRange
For
iCount = 1 To 255
If
.Offset(0, iCount - 1).Value = "" Then
Exit For
ReDim
Preserve gsLanguages(iCount)
gsLanguages(iCount) =
.Offset(0, iCount - 1).Value
Next
End With
ReDim
gsMsgs(10)
With
ThisWorkbook.Names("MsgBoxes").RefersToRange
For
iCount = 1 To 500
If
.Offset(iCount - 1, giLang - 1).Value = "" Then
Exit For
ReDim
Preserve gsMsgs(iCount)
gsMsgs(iCount) =
.RefersToRange.Offset(iCount - 1, giLang - 1).Value
Next
End With
ReDim
gsUserform1Strings(10)
With
ThisWorkbook.Names("Userform1").RefersToRange
For
iCount = 1 To 500
If
.Offset(iCount - 1, giLang - 1).Value = "" Then
Exit For
ReDim
Preserve gsUserform1Strings(iCount)
gsUserform1Strings(iCount) = .Offset(iCount - 1, giLang -
1).Value
Next
End
With
End Sub
Indien dus een andere taal gekozen wordt, dient deze subroutine opnieuw
te worden uitgevoerd. Verder is natuurlijk code nodig die de
dialoogvensters (userforms) voorziet van de juiste taal:
Sub SetTexts()
With
Me
.cbOK.ControlTipText = gsUserform1Strings(1)
.cbCancel.ControlTipText = gsUserform1Strings(2)
.cbCancel.Caption = gsUserform1Strings(3)
.lblLanguage.Caption = gsUserform1Strings(4)
.cbxLanguage.ControlTipText = gsUserform1Strings(5)
.Caption = gsUserform1Strings(6)
End
With
End Sub
Wanneer er variabelen in de tekst moeten worden opgenomen ontstaat
mogelijk een probleem. De positie van deze variabele tekst is soms niet
gelijk voor elke taal. Bijvoorbeeld:
U heeft Nederlands gekozen als taal voor de gebruikersinterface. You
have chosen English for your userinterface language.
De positie van het vet gedrukte woord is niet dezelfde voor
Nederlands en Engels. De oplossing die hiervoor is bedacht is het
invoeren van codes in de zinnen:
U heeft _ARG1_ gekozen als taal voor de gebruikersinterface. You have
chosen _ARG1_ for your userinterface language.
Een VBA functie (zie listing 8) zoekt bij het samenstellen van de te
tonen zin naar deze codewoorden en vervangt deze door de gewenste
waarden (deze functie werkt helaas niet in Excel 97 vanwege het gebruik
van Replace):
Listing 8
Function ReworkMsg(ByVal
sMsg As String, _
Optional
ByVal Arg1 As String,
_
Optional
ByVal Arg2 As String,
_
Optional
ByVal Arg3 As String,
_
Optional
ByVal Arg4 As String,
_
Optional
ByVal Arg5 As String)
As String
If
Not IsMissing(Arg1) Then
sMsg
= Replace(sMsg, "_ARG1_", Arg1)
End
If
If Not
IsMissing(Arg2) Then
sMsg =
Replace(sMsg, "_ARG2_", Arg2)
End
If
If Not
IsMissing(Arg3) Then
sMsg =
Replace(sMsg, "_ARG3_", Arg3)
End
If
If Not
IsMissing(Arg4) Then
sMsg =
Replace(sMsg, "_ARG4_", Arg4)
End
If
If Not
IsMissing(Arg5) Then
sMsg =
Replace(sMsg, "_ARG5_", Arg5)
End
If
sMsg = Replace(sMsg, "_NEWLINE_", vbNewLine)
ReworkMsg = sMsg
End
Function
Deze functie kent dus 5 optionele argumenten. Om dus de bovenstaande
zinnen te verkrijgen, kan deze functie als volgt worden aangeroepen:
MsgBox ReworkMsg("U heeft _ARG1_ gekozen als taal voor de
gebruikersinterface.", "Nederlands")
Zie afbeelding 11.
Afbeelding 11: venster met aangepaste mededeling
In dit voorbeeld zal "_ARG1_" dus vervangen worden door "Nederlands".
Ook het starten van een nieuwe regel kan met deze methode worden
gedaan, door invoegen van het codewoord _NEWLINE_ op de plaats waar de
nieuwe regel moet starten.
MsgBox ReworkMsg("U heeft _ARG1_ gekozen als taal_NEWLINE_voor de
gebruikersinterface.", "Nederlands")
Zie afbeelding 12.
Afbeelding 12: venster met aangepaste mededeling