Mehrsprachigkeit in Lotus Notes Anwendungen ist leider nicht mit einem Knopfdruck erledigt. Der von der IBM vorgesehene Weg führt zu einer Verdoppelung aller Design-Elemente, was nicht unbedingt erstrebenswert ist. Aber mit der richtigen Kombination von verschiedenen Techniken kann der Arbeitsaufwand zumindest reduziert werden.
Zunächst einmal der von der IBM vorgesehene Weg: In den Datenbank-Eigenschaften
kann im Design-Reiter die Option "Multilingual database" aktiviert
werden. Bei der Gelegenheit kann gleich auch die Vorgabesprache eingestellt
werden.
Pro Designelement kann anschließend
die Sprache bestimmt werden. Der Notes Client versucht, aus den Benutzervorgaben
die gewünschte Sprache zu ermitteln. Wenn für diese Sprache ein Designelement
vorhanden ist, wird dieses verwendet. Anderenfalls kommt die Vorgabesprache
zum Zuge. Es ist aber auch möglich, keine Sprache für ein Designelement
anzugegeben, dann steht es für alle Anwender zur Verfügung.
Der Weg, alle Designelemente zu verdoppeln,
führt natürlich zu einem Mehraufwand, insbesondere bei der Pflege von Datenbanken.
Es gibt ein paar Alternativen, die aber auch nicht völlig frei von Nachteilen
sind.
Masken
Mit "Computed Text" gibt es
eine Möglichkeit, Beschriftungen sprachunabhängig zu machen. Allerdings
leidet ein wenig die Übersichtlichkeit bei der Entwicklung, wenn überall
nur noch "<Computed Text>" steht. Insofern bevorzuge ich
persönlich eine eigenständige Maske pro Sprache.
Bei den Aktionen gibt es seit Version
6 neben dem Namen ein separates Label in dem auch die Formelsprache verwendet
werden kann.
Ansichten
Die Aktionen können wie bei Masken durch
ein Label sprachunabhängig gemacht werden. Leider hat die IBM diese Möglichkeit
nicht für die Überschriften in den Ansichtsspalten vorgesehen. Dort wird
weiterhin nur statischer Text angezeigt. Das ist insofern unschön, weil
zusätzliche Ansichten eine Datenbank größer und langsamer machen. Gerade
bei Datenbanken mit vielen Dokumenten kann das schnell signifikante Auswirkungen
haben.
Script Bibliotheken
Bei den Script Bibliotheken hat sich
bei uns folgendes Verfahren etabliert. In einer zentrale Script Bibliothek
wird eine Liste "properties" definiert.
Public
properties List
As
String
Im Initialize dieser Script Bibliothek
wird der folgende Code zur Bestimmung der Sprache ausgeführt:
Dim
eval As
Variant
eval = Evaluate(|@LanguagePreference(ontent|)
properties("language.gui")
=
Lcase(Left(eval(0),
2))
If
properties("language.gui")
<>
"de" And
properties("language.gui")
<>
"en" Then
Messagebox
|Sorry, the language "| &
properties("language.gui")
&
|" is not supported at the moment.|,
64,
"Language not supported"
properties("language.gui")
=
"en"
End
If
Jede Script Bibltiothek schreibt im
Initialize die von Ihr verwendeten sprachabhängigen Strings in diese Liste.
Um die Eindeutigkeit zu gewährleisten, hat jede Script Bibltiothek eine
private Konstante LIBRARY mit ihrem Namen.
Private
Const
LIBRARY =
"Common utils"
Select
Case
properties("language.gui")
Case
"de":
properties(LIBRARY
&
".errmsg.db.could.not.be.opened")
=
|Die Datenbank "<%DATABASE%>" konnte nicht geöffnet werden.|
...
properties(LIBRARY
&
".errmsg.property.not.found")
=
|Die Eigenschaft "<%PROPERTY%>" ist nicht definiert.|
Case
"en":
properties(LIBRARY
&
".errmsg.db.could.not.be.opened")
=
|The database "<%DATABASE%>" could not be opened.|
...
properties(LIBRARY
&
".errmsg.property.not.found")
=
|The property "<%PROPERTY%>" could not be found.|
End
Select
Nun gibt es bei der Verwendung von Listen
eine kleine Schwierigkeit. Wenn ein angefragtes Listenelement nicht vorhanden
ist, gibt es nur eine unspezifische Fehlermeldung das ein Listenelement
nicht gefunden werden kann. Aber leider wird nicht gesagt, welches Listenelement
das ist.
Aus diesem Grund greifen wir nicht direkt
auf die Liste zu, sondern verwenden eine Function GetProperty.
Public
Function
GetProperty (keyname
As
String)
As
String
If
Iselement(properties(keyname))
Then
GetProperty =
properties(keyname)
Else
Error
ERRNO_PROPERTY_NOT_FOUND,
Replace(properties(LIBRARY
&
".errmsg.property.not.found"),
"<%PROPERTY%>",
keyname)
End
If
End
Function
So gibt es bei einem Tippfehler beim
Zugriff auf die Properties-Liste wenigstens eine eindeutige Fehlermeldung.
Wobei die Fehlermeldung selbstverständlich auch aus den Properties ausgelesen
wird.
Mit diesem Verfahren gibt es von jeder
Script-Bibliothek nur eine Variante. Da es sowieso ein guter Ansatz ist,
möglichst viel Code aus Masken und anderen Design-Elementen in Script-Bibliotheken
zu verlagern, hilft es dabei die Aufwände für Mehrsprachigkeit gering zu
halten.