Mehrsprachigkeit bei Lotus Notes-Anwendungen

von Bernd Hort,
assono GmbH, Standort Hamburg,

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.

A picture named M2 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.
A picture named M3
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. sad.gif
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.

Fachbeitrag IBM Notes IBM Notes Traveler Entwicklung

Sie haben Fragen zu diesem Artikel? Kontaktieren Sie uns gerne: blog@assono.de

Sie wollen eine individuelle Lösung? Kontaktieren Sie uns

Weitere interessante Artikel

Sie haben Fragen? Wir sind für Sie da.

Wir verwenden Ihre Daten, um Sie einmalig per E-Mail zu kontaktieren. Wir geben Ihre Daten nicht an Dritte weiter. Siehe: Datenschutzhinweise
assono GmbH

Standort Kiel (Zentrale)
assono GmbH
Lise-Meitner-Straße 1–7
24223 Schwentinental

Standort Hamburg
assono GmbH
Bornkampsweg 58
22761 Hamburg

Telefonnummern:
Zentrale: +49 4307 900 407
Techn. Hotline: +49 4307 900 403
Vertrieb: +49 4307 900 402

E-Mail-Adressen:
kontakt@assono.de
bewerbung@assono.de