Mehrsprachige Anwendungen

Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.

Wer seine Anwendung nicht nur mit einer Sprache ausstatten möchte, sondern diese auch in anderen Ländern verfügbar machen will, hat zwei Möglichkeiten: Entweder er erstellt für jede Sprache eine andere Version oder er bringt einer einzigen Anwendung bei, auf Knopfdruck die Sprache zu wechseln. Erfahren Sie, welche Version sinnvoller ist und wie Sie eine mehrsprachige Anwendung in die Tat umsetzen.

Vorausgesetzt, Ihre Anwendung ist so ausgereift, dass sie ganz sicher nicht mehr geändert wird, dann können Sie diese einfach kopieren und die enthaltenen Texte an eine andere Sprache anpassen. Da aber spätestens beim Wechsel zu einer anderen Access-Version änderungen anstehen, sollten Sie vorsichtig damit sein: Diese müssen Sie nämlich dann in jeder Sprachversion separat durchführen.

Anders sieht es aus, wenn Sie eine Anwendung mit Funktionen versehen, die je nach gewünschter Sprache die passenden Texte anzeigen. Der Aufwand, diese Funktionen zu implementieren, ist zwar unumgänglich, und auch bei Erweiterungen oder änderungen der Datenbank fällt ein wenig mehr Arbeit an, aber je mehr Sprachen man unterstützt, desto weniger Aufwand ergibt sich gegenüber der erstgenannten Lösung bei änderungen.

Betroffene Bereiche

Wichtig ist beim Implementieren von Mehrsprachigkeit, sich zunächst genau zu überlegen, wo sich dieses Feature bemerkbar macht und mit welchem Aufwand die Anpassungen verbunden sind. Die folgende Liste zeigt, was Sie beachten müssen:

  • Dokumentation (PDF, gedruckt), Onlinehilfe
  • Elemente der Benutzeroberfläche: Menüs, Formulare, Berichte, Steuerelemente, Beschriftungen; insbesondere Größe der Elemente in Abhängigkeit von der Länge der Texte in den verschiedenen Sprachen
  • Datenmodell: In welcher Sprache werden Tabellen und Felder benannt
  • VBA-Code: In welcher Sprache werden Konstanten, Variablen und Routinen sowie Klassen benannt und der Code dokumentiert
  • Access-Objekte: In welcher Sprache werden Abfragen, Formulare, Berichte und Module benannt
  • Liegt Access jeweils in der richtigen Sprache vor Dies ist vor allem in Hinblick auf die Verwendung von MsgBox und InputBox wichtig.
  • Zahlen-, Währungs- und Datumsformate müssen den jeweiligen Gegebenheiten angepasst werden.
  • Daten: Welche Daten müssen in allen Sprachen vorliegen – beispielsweise Anreden, Währungen, sonstige Texte

Dieser Beitrag lässt die Dokumentation und die Onlinehilfe weg, da diese wohl oder übel in jeder Sprache separat erstellt werden müssen. Die internen Elemente einer Datenbank, wie das Datenmodell, die Bezeichnungen der Access-Objekte und die im VBA-Code verwendeten Bezeichnungen, bleiben ebenfalls außen vor, weil der Benutzer mit diesen nicht in Berührung kommt und wir davon ausgehen, dass nur die Benutzer und nicht die Entwickler unterschiedliche Sprachen erwarten. Mit englischen Bezeichnungen fährt man aber hier wohl meist gut. Wie Sie alles Weitere realisieren, erfahren Sie auf den nächsten Seiten.

Wohin mit den Informationen

Eine wichtige Frage ist, wo Sie die verschiedenen Übersetzungen der in der Anwendung enthaltenen Texte speichern. Man könnte diese in einer Textdatei speichern oder auch aus Ressourcen-Dateien oder der Registry beziehen. Es wäre aber ungünstig, solche Informationen außerhalb der Anwendung zu speichern, wenn dies innerhalb geschehen kann – und zwar in passenden Tabellen, die man auch noch relational miteinander verknüpfen kann.

Datenmodell

Ganz klar zu sein scheint, dass es eine Tabelle mit den verschiedenen Sprachen geben muss. Diese enthält neben dem Primärschlüsselfeld die Bezeichnung der Sprache und gegebenenfalls ein international gültiges Kürzel. Auf die Tatsache, dass der Benutzer die Sprache ja gegebenenfalls beim Auswählen derselben in der jeweiligen Landessprache vorfinden möchte, gehen wir weiter unten ein. Wer gern spielt, kann natürlich auch passende Landesflaggen zur Auswahl anbieten.

Neben den Sprachen gibt es Begriffe beziehungsweise Texte, die für jede Sprache einmal vorhanden sein müssen. Eine Tabelle, die solche Informationen speichert, enthält also mindestens ein Feld mit der jeweiligen Übersetzung, eine eindeutige ID für den Text, sowie ein Feld, mit dem ein Eintrag der gerade beschriebenen Sprachentabelle festgelegt wird. Dabei gibt es einen zusammengesetzten eindeutigen Schlüssel über die beiden Felder BegriffID und SpracheID, damit kein Begriff zweimal in derselben Sprache vorkommt.

Schließlich müssen Sie noch dafür sorgen, dass Steuerelemente, Formulare, Berichte und die anderen Elemente mit den dort gespeicherten Begriffen ausgestattet werden. Dazu brauchen Sie für die unterschiedlichen Ziele verschiedene Tabellen. Die erste kümmert sich um die Formulare, Berichte und Steuerelemente. Sie enthält zwei Felder für die Angabe des Formular- beziehungsweise Berichtsnamens und für den Namen des jeweiligen Steuerelements.

Will man die Formular- oder Berichtstitel festlegen, gibt man dort einfach nur den Objektnamen an und lässt das Steuerelement weg. Ein weiteres Feld enthält die Nummer des Texts, der dort unter Berücksichtigung der gewählten Sprache eingebaut werden soll. Schauen wir uns nun an, wie dieses Datenmodell funktioniert; die Tabellen für die übrigen Objekte folgen später in Zusammenhang mit den jeweiligen Techniken.

Das Datenmodell sieht nun zunächst wie in Bild 1 aus.

pic001.tif

Bild 1: Datenmodell für die Ausstattung von Formularen und Berichten mit mehrsprachigen Texten

Formulare, Berichte und Steuerelemente

Alle Beschriftungen von Formularen, Berichten und den enthaltenen Steuerelementen sollen für die entsprechende Sprache angepasst werden. Aber reicht das aus Nein, es gibt noch eine Reihe weiterer Informationen, die in die jeweilige Sprache übersetzt werden müssen:

  • ControlTipText: Dieser Text wird, soweit vorhanden, beim Überfahren mit der Maus angezeigt.
  • StatusBarText: Diesen Text zeigt Access für das jeweils aktuelle Element in der Statusleiste an.
  • ValidationText: Die Gültigkeitsmeldung zeigt Access an, wenn der Benutzer einen ungültigen Wert eingibt.

Von Deutsch nach …

Die geplante Vorgehensweise sieht so aus:

  • Sie erstellen eine Anwendung, die einmal mehrsprachig werden soll. Am wenigsten Arbeit macht dies bezogen auf Formulare und Berichte wohl, wenn Sie die Anwendung erstmal so weit fertigstellen und dann die Mehrsprachigkeit hinzufügen.
  • Eine Routine durchläuft die bestehenden Formulare und Berichte und deren Steuerelemente. Dabei schreibt sie alle Stellen, an denen zu übersetzende Texte auftauchen, inklusive der vorhandenen Beschriftungen in die entsprechenden Tabellen.
  • Im gleichen Zuge legt sie für alle in der Tabelle tblSprachen vorhandenen Einträge eine Kopie der zuvor gespeicherten Texte an – jeweils mit vorangestelltem Kürzel der Sprache.
  • Die so vorbereiteten Texte werden dann mithilfe eines speziellen Formulars, das die Texte für zwei Sprachen – die Originalsprache und die Zielsprache – enthält, nebeneinander angezeigt und können dort komfortabel übersetzt werden.
  • Beim Öffnen eines Formulars oder Berichts mit zu übersetzenden Texten wird eine Routine aufgerufen, die alle Steuerelemente durchläuft und die in den Übersetzungstabellen enthaltenen Texte für die entsprechenden Eigenschaften einfügt.

Einlesen bestehender Texte

Wenn die Anwendung fertiggestellt ist, rufen Sie einfach die Routine TexteEinlesen auf (s. Listing 1) und geben als Parameter die Sprache der Texte an, mit der Formulare, Berichte und Steuerelemente aktuell ausgestattet sind – zum Beispiel 1 für Deutsch (den entsprechenden Wert entnehmen Sie der Tabelle tblSprachen).

Listing 1: Startroutine zum Einlesen der in Formularen und Berichten bestehenden Texte

Public Sub TexteEinlesen(lngSpracheID As Long)
Dim i As Integer
Dim db As DAO.Database
Dim strObjekt As String
Set db = CurrentDb
db.Execute "DELETE FROM tblElemente"
db.Execute "DELETE FROM tblUebersetzungen"
For i = 0 To CurrentProject.AllForms.Count - 1
    strObjekt = CurrentProject.AllForms(i).Name
    ObjektEinlesen strObjekt, lngSpracheID, "Formular"
Next i
For i = 0 To CurrentProject.AllReports.Count - 1
    strObjekt = CurrentProject.AllReports(i).Name
    ObjektEinlesen strObjekt, lngSpracheID, "Bericht"
Next i
End Sub

Die Routine löscht zunächst alle in den Tabellen tblElemente und tblUebersetzungen enthaltenen Daten. Anschließend durchläuft sie erst alle Formulare der Datenbank und dann alle Berichte. Für all diese Objekte ruft die Prozedur die Routine ObjektEinlesen auf.

Diese wiederum finden Sie in Listing 2. Die Routine erwartet den Namen des Objekts, die ID der Standardsprache der Anwendung sowie den Typ des Objekts als Parameter.

Listing 2: Diese Routine durchläuft alle relevanten Eigenschaften von Formularen, Berichten und deren Steuerelementen und ruft für jedes die Routine UebersetzungSchreiben auf, die alle notwendigen Daten in die Übersctzungstabellen schreibt.

Public Sub ObjektEinlesen(strObjekt As String, lngSpracheID As Long, strTyp As String)
Dim i As Integer
Dim strEigenschaft As String
Dim obj As Object
Dim ctl As Access.Control
If strTyp = "Formular" Then
    DoCmd.OpenForm strObjekt, acPreview
    Set obj = Forms(strObjekt)
Else
    DoCmd.OpenReport strObjekt, acPreview
    Set obj = Reports(strObjekt)
End If
UebersetzungSchreiben lngSpracheID, obj, ctl, "Caption"
For Each ctl In obj.Controls
    For i = 1 To 4
        strEigenschaft = Choose(i, "Caption", "ControlTipText", "StatusbarText", _
        "ValidationText")
        UebersetzungSchreiben lngSpracheID, obj, ctl, strEigenschaft
    Next i
Next ctl
DoCmd.Close acForm, strObjekt
End Sub

Je nachdem, ob der Parameter strTyp den Wert Formular oder Bericht enthält, öffnet einer der beiden Zweige der ersten If…Then-Bedingung das entsprechende Objekt in der Entwurfsansicht.

Danach ruft die Routine zunächst eine weitere Prozedur namens UebersetzungSchreiben auf, die für das Eintragen der Übersetzungen verantwortlich ist. Anschließend durchläuft die Routine alle Steuerelemente des Formulars beziehungsweise Berichts und ruft für jedes Element viermal die Prozedur UebersetzungSchreiben auf: je einmal für die vier Eigenschaften Caption, ControlTipText, StatusbarText und ValidationText. Dies sind die vier Eigenschaften herkömmlicher Steuerelemente, die für den Benutzer sichtbare Texte enthalten können (die Daten, die durch die Steuerelemente angezeigt werden, einmal außen vor gelassen).

Danach schließt die Routine das geöffnete Objekt wieder. Die Hauptarbeit übernimmt die Prozedur UebersetzungSchreiben (s. Listing 3) Sie erwartet vier Parameter:

Listing 3: Diese Routine erledigt die eigentliche Arbeit, denn sie schreibt nicht nur die Texte, sondern auch noch Platzhalter für die Übersetzungen in die Übersetzungstabellen.

Public Sub UebersetzungSchreiben(lngSpracheID As Long, frm As Object, Optional ctl As Control, _
Optional strEigenschaft As String)
Dim db As DAO.Database
Dim rst As DAO.Recordset
Dim strControl As String
Dim strBegriff As String
Dim lngBegriffID As Long
Dim lngSteuerelementtyp As Long
Set db = CurrentDb
Set rst = db.OpenRecordset("tblSprachen", dbOpenDynaset)
lngBegriffID = Nz(DMax("BegriffID", "tblUebersetzungen"), 0) + 1
Do While Not rst.EOF
    On Error Resume Next
    If Not ctl Is Nothing Then
        strBegriff = ctl.Properties(strEigenschaft)
        strControl = ctl.Name
        lngSteuerelementtyp = ctl.ControlType
    Else
        strBegriff = frm.Properties(strEigenschaft)
        strControl = ""
    End If
    If Err.Number > 0 Then Exit Sub
    On Error GoTo 0
    If Len(strBegriff) > 0 Then
        If rst!SpracheID = lngSpracheID Then
            strBegriff = strBegriff
        Else
            strBegriff = rst!Kuerzel & "_" & strBegriff
        End If
    Else
        strBegriff = "_" & rst!Kuerzel & "_" & strControl & "_" & strEigenschaft
    End If
    db.Execute "INSERT INTO tblUebersetzungen(BegriffID, SpracheID, Begriff) " _
    & "VALUES(" & lngBegriffID & ", " & rst!SpracheID & ", '" & strBegriff & "')", _
    dbFailOnError
    On Error Resume Next
    db.Execute "INSERT INTO tblElemente(Objekt, Steuerelement, Steuerelementtyp, " _
    & "BegriffID, Eigenschaft) VALUES('" & frm.Name & "', '" & strControl & "', '" _
    & lngSteuerelementtyp & "', " & lngBegriffID & ", '" & strEigenschaft & "')", _
    dbFailOnError
    On Error GoTo 0
    rst.MoveNext
Loop
End Sub
  • lngSprachID: ID der Ausgangssprache
  • frm: Objektvariable, kann Formular- und Berichts-Objekte aufnehmen
  • ctl: Optionaler Parameter für das Steuerelement
  • strEigenschaft: Name der Eigenschaft, die den anzulegenden Text enthält

Die Routine öffnet zunächst eine Datensatzgruppe auf Basis der Tabelle tblSprachen. Diese durchläuft sie komplett, denn es soll ja für jede Kombination aus Sprache und Steuerelement beziehungsweise Steuerelementeigenschaft ein Datensatz in der Tabelle tblUebersetzungen angelegt werden. Bis dahin sind allerdings noch einige Vorarbeiten zu erledigen: Die erste If…Then-Bedingung prüft, ob das aktuelle Objekt ein Steuerelement oder ein Formular/Bericht ist. Wenn der Übergabeparameter ctl nicht leer ist, handelt es sich um ein Steuerelement, sonst um das Formular oder den Bericht selbst. Im Falle eines Steuerelements weist die Routine der Variablen strControl den Steuerelementnamen und strBegriff den Wert der mit strEigenschaft übergebenen Eigenschaft zu (wie weiter oben erwähnt: eine der Eigenschaften Caption, ControlTipText, StatusbarText oder ValidationText). Die Variable lngSteuerelementtyp wird mit dem Wert der Eigenschaft ControlType des Steuerelements gefüllt.

Falls ctl leer ist, soll die Caption eines Formulars oder Steuerelements verarbeitet werden: Dann wird strBegriff mit dem Wert der per strEigenschaft übergebenen Eigenschaft gefüllt, was immer die Caption betrifft.

Im nächsten Schritt prüft die Routine, ob strBegriff einen Wert enthält. Das bedeutet im Detail, dass die übergebene Eigenschaft des übergebenen Steuerelements einen Text enthält, der dementsprechend auch übersetzt werden sollte.

In diesem Fall vergleicht die Routine die mit dem Parameter lngSpracheID übergebene Sprach-ID mit der des aktuell durchlaufenen Datensatzes der Tabelle tblSprachen.

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

Testzugang

eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar