Kennen Sie schon unseren Podcast? Thomas Bahn diskutiert mit Gästen aus Wirtschaft und Wissenschaft über Künstliche Intelligenz und Chatbots. Jetzt reinhören

Mehrsprachigkeit bei Lotus Notes-Anwendungen

von Bernd,
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 HCL Notes HCL Notes Traveler Entwicklung

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

Sie haben Interesse an diesem Thema?

Gerne bieten wir Ihnen eine individuelle Beratung oder einen Workshop an.

Kontaktieren Sie uns

Weitere interessante Artikel

Sie haben Fragen?

Wenn Sie mehr über unsere Angebote erfahren möchten, können Sie uns jederzeit kontaktieren. Gerne erstellen wir eine individuelle Demo für Sie.

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
Vertrieb: +49 4307 900 411

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