Mehrsprachigkeit die 3.
Im letzten Teil der Serie geht es nun darum wie man in der Praxis die Mehrsprachigkeit realisiert. In der Regel ist es so, dass man zuerst die Formulare und Berichte ganz normal in Deutscher Sprache erstellt.
Um nun die Sprachcodes zu handhaben kann man mit einem Blatt Papier anfangen und Code mit Sprache als Liste aufschreiben. Oder man macht das z.B. in Excel. Wichtig bei dieser Sache ist, dass der Sprachcode fortlaufend ist und dass keine doppelten Codes vorhanden sind.
Hat man alle Deutschen Texte und Sprachcodes erfasst, ändert man nun im Formular/Bericht die Beschriftungen bzw. ControlTipText ab.
OK, das ist mir persönlich zu mühselig, und ich habe daher kurzerhand eine Funktion erstellt, die das automatisch für mich macht.
Erstellt ein neues Modul und fügt folgenden Code ein:
Option Compare Database Option Explicit Dim lastID As Long Public Sub fillLangTable(SFormular As String) Dim checkTable As String Dim ctl As Control, frm As Form Set db = CurrentDb Set rs = db.OpenRecordset("Select Tabellennamen From Sprachen Where Auswahl = true", dbOpenDynaset) If rs.RecordCount > 0 Then checkTable = rs!Tabellennamen Set rs = db.OpenRecordset("Select max(ID) AS lastID From " & checkTable, dbOpenDynaset) If rs.RecordCount = 0 Then lastID = 1 Else lastID = rs!lastID + 1 End If Else checkTable = "Deutsch" lastID = 1 End If DoCmd.OpenForm SFormular, acDesign Set frm = Forms(SFormular) For Each ctl In frm.Controls If ctl.Tag = "no" Then GoTo nextLoop Select Case ctl.ControlType Case 104 'Buttons If ctl.Picture <> "(keines)" Then db.Execute "Insert into " & checkTable & " (ID, Wert) Values (" & lastID & ",'" & ctl.ControlTipText & "')" ctl.ControlTipText = "[" & lastID & "]" lastID = lastID + 1 Else db.Execute "Insert into " & checkTable & " (ID, Wert) Values (" & lastID & ",'" & ctl.Caption & "')" ctl.Caption = "[" & lastID & "]" lastID = lastID + 1 End If Case 100 'Labels db.Execute "Insert into " & checkTable & " (ID, Wert) Values (" & lastID & ",'" & ctl.Caption & "')" ctl.Caption = "[" & lastID & "]" lastID = lastID + 1 End Select nextLoop: Next DoCmd.Close acForm, frm.Name, acSaveYes End Sub
Der Aufruf der Funktion könnt ihr z.B. aus einem „Dummy-Formular“ machen, wo ihr nur das Ereignis Beim Laden verwendet. Darin schreibt ihr folgenden Code:
Private Sub Form_Load() Call fillLangTable("Name des Formulars") End Sub
Aber Vorsicht!
Macht unbedingt eine Sicherungskopie der Datenbank bevor ihr anfangt und führt diesen Code pro Formular auch nur 1x aus!
Die Praxis hat gezeigt, dass es sowohl Befehlsschaltflächen gibt, die kein Bild haben, aber der Text dennoch nicht mehrsprachig sein soll. Z.B. Navigationsbuttons mit < oder << als Beschriftung. Setzt bei diesen als Eigenschaft Marke ein no. die anderen Steuerelemente benötigen doch keine Marke, dies habe ich wieder entfernt. Man kann jetzt noch mehr machen, z.B. die Texte automatisch übersetzen lassen. Dazu findet ihr einen Interessanten Bericht bei Access-im-Unternehmen.de: Texte automatisch übersetzen lassen per VBA
AV 2008