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, cmdFinish2 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. 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.750 mal aufgerufen. Voriger Tipp | Zufälliger Tipp | Nächster Tipp
Anzeige
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. |
Neu! sevDTA 3.0 Pro SEPA mit Kontonummernprüfung Erstellen von SEPA-Dateien mit integriertem BIC-Verzeichnis und Konto- nummern-Prüfverfahren, so dass ungültige Bankdaten bereits im Vorfeld ermittelt werden können. Tipp des Monats Dezemeber 2024 Roland Wutzke MultiSort im ListView-Control Dieses Beispiel zeigt, wie sich verschiedene Sortierfunktionen für ein ListView Control realisieren lassen. TOP Entwickler-Paket TOP-Preis!! Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1605.50 EUR... |
||||||||||||||||
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. |