vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Zippen wie die Profis!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück
Rubrik: Oberfläche · Sonstiges   |   VB-Versionen: VB4, VB5, VB613.12.01
Umschaltung der Programmsprache zur Laufzeit

Flexible Umschaltung der Programmsprache zur Laufzeit durch eine Sprachdatenbank

Autor:   Michael HartmannBewertung:     [ Jetzt bewerten ]Views:  18.131 
ohne HomepageSystem:  Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 Beispielprojekt auf CD 

Wer schon mal ein größeres Projekt gemacht hat und dies auch international vertreibt, wird sicherlich schon mal die Erfahrung mit fremdsprachlichen Versionen seines Programms gemacht haben. Da hat man ein schönes Resourcenfile mit all seinen Texten, hat sie fleissig und mit viel Mühe übersetzt und hat es an viele Kunden ausgeliefert. Jetzt taucht aber doch mal ein Übersetzungsfehler auf, aber man hat gerade keinen Stand des Quellcodes um schnell mit einem Update zu reagieren. Oder noch schöner ist, wenn ein Kunde aus einem neuen Land hinzukommt, für den noch keine landessprachliche Übersetzung vorhanden ist. Wie bekommt man jetzt sehr schnell eine neue Sprache in sein Programm, ohne wieder alles neu zu kompilieren?

Lösung: Wenn man sowieso schon eine Datenbank in der Anwendung verwendet, warum dann nicht auch die Texte des Programms in eine Datenbank auslagern? Dies muss keine aufwendige Datenbank sein. Eine einfache Access-Datenbank, eine einzige Tabelle darin und für jede mögliche Sprache eine separate Spalte. Wie man jetzt konkret die Texte aus der Datenbank rausholt und seine Fenster damit aktualisiert zeigt der folgende Quellcode.

Zunächste einmal der Kern der gesamten Geschichte, die Funktion, die die Texte aus der Datenbank holt:

Option Explicit
 
' Zum Aktualisieren des Fensters nach einer Umschaltung der
' Programmsprache bekommt das Fenster die Nachricht WM_PAINT
' gesendet, damit die Funktion Form_Paint ausgeführt wird und
' die Caption-Eigenschaften der einzelnen Controls aktualisiert
' wird.
Public Const WM_PAINT As Long = &HF
 
Public Declare Function SendMessage Lib "user32" _
  Alias "SendMessageA" ( _
  ByVal hWnd As Long, _
  ByVal wMsg As Long, _
  ByVal wParam As Long, _
  lParam As Any) As Long
 
' Stringarry für die Caption-Texte
' Dies kann auch ein dynamisches Array sein,
' aber so oft werden die Texte eines Programms
' ja nicht erweitert.
Public strCaptionTexts(20) As String
 
Public Sub ChangeLanguage(ByVal strLang As String)
  Dim DB As Database
  Dim RS As Recordset
  Dim I As Integer
 
  On Error GoTo ErrorHandler
 
  ' Sprachdatenbank vorhanden?
  If Dir(App.Path & "\language.mdb") = "" Then
    Call MsgBox("Language database not found (" & _
      UCase(App.Path) & "\LANGUAGE.MDB).", _
      vbOKOnly + vbCritical)
    Exit Sub
  End If
 
  ' Tabelle in Sprachdatenbank öffnen und alle Einträge der
  ' durch strLang definierten Sprache lesen und in dem
  ' Stringarray strCaptionTexts ablegen.
  Set DB = DBEngine.OpenDatabase(App.Path & "\language.mdb")
  Set RS = DB.OpenRecordset("Languages", dbOpenDynaset)
 
  If Not RS.BOF And Not RS.EOF Then RS.MoveFirst
 
  Do While Not RS.EOF
    I = RS.Fields("ID")
    If Not IsNull(RS.Fields(strLang)) Then
      strCaptionTexts(I) = RS.Fields(strLang)
    End If
    RS.MoveNext
  Loop
 
  ' Zum Schluß noch alles schön wieder schließen
  RS.Close
  DB.Close
 
  Exit Sub
 
ErrorHandler:
  If Err.Number = 3265 Then
    ' Fehler: Unbekannte Sprache gewählt
    ' Es wird eine Standardsprache gewählt
    strLang = "English"
    Resume
  Else
    Call MsgBox("Runtime error " & Err.Number & _
      ": " & Err.Description, vbOKOnly + vbCritical)
  End If
End Sub

Was so im einzelnen in dieser Funktion vor sich geht ist ja bestens kommentiert und sollte keine Probleme bereiten. Ich habe das ganze jetzt mit DAO gemacht, aber mit RDO oder ADO geht es genauso.

Jetzt nur noch mal ein kleines Programmfenster, das sich landessprachlich anpasst. Die verfügbaren Sprachen werden ebenfalls aus der Sprachdatenbank gelesen und z.B. in einer Combobox dem Benutzer zu Auswahl angeboten. Kommt jetzt eine neue Sprache hinzu, muss lediglich eine neue Spalte in der Sprachdatenbank angelegt werden. Das Programm bekommt dies mit und bietet sie sofort zur Auswahl an.

Für das Beispiel wird eine Form benötigt mit folgenden Steuerelementen:

2 x CommandButton - cmdQuit, cmdFinish
2 x ComboBox - cboLanguage, cboColor
2 x Label - lblLanguage, lblYourName
1 x Frame - fraFrame
1 x CheckBox - chkGiveData
3 x OptionButton - optGender1, optGender2, optGender3

Die einzelnen Controls plazieren Sie wie in nachfolgender Abbildung.

frmLanguage

Hier jetzt der Code des Formulars:

Option Explicit
 
Private Sub cmdQuit_Click()
  ' Hier endet das Demoprogramm
  End
End Sub
 
Private Sub cboLanguage_Click()
  If cboLanguage.Text <> cboLanguage.Tag Then
    ' Sprache nur neu Lesen, falls der Benutzer wirklich ein
    ' andere Sprache angeklickt hat.
    cboLanguage.Tag = cboLanguage.Text
    Call ChangeLanguage(cboLanguage.Text)
    ' Fenster mit neuen Texten zeichnen
    Call SendMessage(frmLanguage.hWnd, WM_PAINT, _
      frmLanguage.hDC, 0&)
  End If
End Sub
 
Private Sub Form_Load()
  Dim DB As Database
  Dim RS As Recordset
  Dim RSField As Field
 
  ' Falls die Sprachdatenbank nicht vorhanden ist wird das Programm
  ' nicht gestartet.
  If Dir(App.Path & "\language.mdb") = "" Then
    Call MsgBox("Language database not found (" & _
      UCase(App.Path) & "\LANGUAGE.MDB).", _
      vbOKOnly + vbCritical)
    Exit Sub
  End If
 
  ' Alle verfügbaren Sprachen aus der Datenbank lesen und
  ' zur Auswahl in die entsprechende Combobox einstellen. Falls
  ' in der Sprachdatenbank eine neue Sprache mit aufgenommen wird,
  ' muss das Programm nicht geändert werden!
  Set DB = DBEngine.OpenDatabase(App.Path & "\language.mdb")
  Set RS = DB.OpenRecordset("Languages", dbOpenDynaset)
  For Each RSField In RS.Fields
    If UCase$(RSField.Name) <> "ID" Then
      cboLanguage.AddItem RSField.Name
    End If
  Next
  RS.Close
  DB.Close
 
  ' Der Wert für die aktuelle Sprache muss irgendwo gespeichert
  ' werden, z.B. in einer INI-Datei oder der Registry. Für dieses
  ' Demo-Projekt wird immer "Deutsch" als aktuelle Sprache gewählt.
  cboLanguage.Text = cboLanguage.List(0)
  cboLanguage.Tag = cboLanguage.Text
 
  ' Die für die gewählte Sprache notwendigen Texte werden
  ' aus der Sprachdatenbank gelesen.
  Call ChangeLanguage(cboLanguage.Text)
End Sub
 
Private Sub Form_Paint()
  Me.Caption = strCaptionTexts(1)
  lblLanguage.Caption = strCaptionTexts(2)
  cmdQuit.Caption = strCaptionTexts(3)
  fraFrame.Caption = strCaptionTexts(4)
  chkGiveData.Caption = strCaptionTexts(5)
  lblYourName.Caption = strCaptionTexts(6)
  optGender1.Caption = strCaptionTexts(7)
  optGender2.Caption = strCaptionTexts(8)
  optGender3.Caption = strCaptionTexts(9)
  lblColor.Caption = strCaptionTexts(10)
  cboColor.Clear
  cboColor.AddItem strCaptionTexts(11)
  cboColor.AddItem strCaptionTexts(12)
  cboColor.AddItem strCaptionTexts(13)
  cboColor.AddItem strCaptionTexts(14)
  cboColor.AddItem strCaptionTexts(15)
  cboColor.AddItem strCaptionTexts(16)
  cboColor.AddItem strCaptionTexts(17)
  cboColor.AddItem strCaptionTexts(18)
  cboColor.AddItem strCaptionTexts(19)
  cmdFinish.Caption = strCaptionTexts(20)
End Sub

So etwas lohnt sich aber wirklich nur für größere Projekte. Für die kleinen Tools, die mit VB programmiert werden, würde ich ebenfalls ein Resourcenfile vorziehen, da der Aufwand, in einem Setupprogramm die Datenbank-Engine zu installieren sich für kleine Tools nicht lohnt.
 

Dieser Tipp wurde bereits 18.131 mal aufgerufen.

Voriger Tipp   |   Zufälliger Tipp   |   Nächster Tipp

Über diesen Tipp im Forum diskutieren
Haben Sie Fragen oder Anregungen zu diesem Tipp, können Sie gerne mit anderen darüber in unserem Forum diskutieren.

Neue Diskussion eröffnen

nach obenzurück


Anzeige

Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv  Vol.6
(einschl. Beispielprojekt!)

Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
- nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten
- Symbol-Galerie mit mehr als 3.200 Icons im modernen Look
Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m.
 
   

Druckansicht Druckansicht Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel