Office Forum
www.Office-Loesung.de
Access :: Excel :: Outlook :: PowerPoint :: Word :: Office :: Wieder Online ---> provisorisches Office Forum <-
Sprache der Anwendung dynamisch wechseln
zurück: Laufzahlen mal anders (Function) weiter: Error-Logfile für VBA Unbeantwortete Beiträge anzeigen
Neues Thema eröffnen   Neue Antwort erstellen     Status: Tutorial Facebook-Likes Diese Seite Freunden empfehlen
Zu Browser-Favoriten hinzufügen
Autor Nachricht
Bitsqueezer
Office-VBA-Programmierer


Verfasst am:
16. Aug 2011, 17:30
Rufname:


Sprache der Anwendung dynamisch wechseln - Sprache der Anwendung dynamisch wechseln

Nach oben
       Version: Office 2007

Hallo zusammen,

mal wieder was aus der Kategorie "was man mit selbstgeschriebenen Events alles machen kann".

Im Beitrag "Split Form"/Formularsynchronisation mit Events hatte ich ja schon mal ausführlich beschrieben, wie man Events dazu nutzen kann, zwei beliebige Formulare zu synchronisieren, die voneinander nichts wissen.

Das gleiche Konzept kann man ebensogut für andere Anwendungen übernehmen, hier geht es nun darum, alle Objekte in einer Anwendung mit einer dynamischen Beschriftung zu versehen. Der Anwender soll eine Sprache auswählen können und alle Label, Buttons, Option Groups usw. sollen in der entsprechenden Sprache angezeigt werden.

Access hat dabei leider keine eingebaute Möglichkeit, die Größe der jeweiligen Controls automatisch an deren Inhalt anzupassen, hier muß man also selbst schauen, die Texte in den diversen Sprachen so zu gestalten, daß alle in die entsprechenden Zielcontrols passen (oder per Windows API die Fontbreite messen und die Breite automatisch anpassen...).

Das Grundprinzip ist im o.g. Artikel ausführlich erläutert, es geht darum, daß jedes neue Objekt (Formulare) sich an den "Radiosender" anklinkt und auf Nachrichten horcht - hier die Änderung der gewünschten Sprache.

Das ganze ist in wenigen Zeilen Codes erledigt:

1. Der "Radiosender": Die Eventklasse
Diese besteht im einfachsten Fall nur aus den folgenden Zeilen:
Code:
Option Compare Database
Option Explicit

Public Event LanguageChanged(strLanguage As String)

Public Sub RaiseLanguageChanged(strLanguage As String)
    RaiseEvent LanguageChanged(strLanguage)
End Sub
Es muß als Klassenmodul angelegt werden und nennt sich "clsLanguageEventManager".

Damit die Eventklasse für alle ständig zur Verfügung steht, wird sie einfach in einem Modul instantiiert, das beliebig heißen kann und nur aus folgenden Zeilen besteht:
Code:
Option Compare Database
Option Explicit

Public LanguageEventManager As New clsLanguageEventManager

2. Der "Zuhörer": Die Objekte, deren Sprache sich ändern soll
Code:
Private WithEvents objEvt As clsLanguageEventManager

Private Sub Form_Load()
    Set objEvt = LanguageEventManager
End Sub

Private Sub objEvt_LanguageChanged(strLanguage As String)
    Select Case strLanguage
      Case "DE"
        Me.lblTest.Caption = "Dies ist ein Testlabel"
        Me.cmdTest.Caption = "Testknopf"
      Case "EN"
        Me.lblTest.Caption = "This is a test label"
        Me.cmdTest.Caption = "Testbutton"
    End Select
End Sub
Beim Laden des Formulars, das aus einem Label und einem Button besteht, wird eine Referenz auf das oben im Modul instantiierte Objekt "LanguageEventManager" gelegt, und durch "WithEvents" ist gesichert, daß nun auch das Formular über einen ausgelösten Event benachrichtigt wird. Den Eventhandler kann man nun bequem aus dem VBA-Editor auswählen, genau wie bei allen Formular- und Controlobjekten. Er erzeugt die Handler-Sub "objEvt_LanguageChanged". Diese wird nun bei jeder Änderung der Sprache im Eventobjekt ausgeführt.
Der Code, der dort ausgeführt wird, ist wohl nicht schwer zu verstehen: Der Event, wenn er ausgelöst wird, überreicht hier den Namen der Sprache und nun muß man nur noch anhand der Sprache die Objekte richtig benennen (ggf. auch gleich deren Größe hier anpassen).

Kaum zu glauben - aber das war's schon. Wenn man nun die Sprache wechseln möchte, kann man an beliebiger Stelle in der Anwendung z.B. schreiben:
Code:
    LanguageEventManager.RaiseLanguageChanged "DE"
Und schon wird in allen Objekten, die diese Methode implementieren, die Sprache gewechselt.

Das ganze ist so natürlich noch etwas unbequem, sollte aber auch bewußt einfach gehalten sein, um das Prinzip klarzumachen. In der zweiten Beispieldatenbank im Anhang habe ich die Eventklasse so erweitert, daß sie über Enumerations gesteuert wird, so daß es einfacher zu programmieren ist (die verfügbaren Sprachen stehen einem dann per IntelliSense zur Verfügung).
Außerdem gibt es eine Translate-Funktion, die einen Key entgegennimmt (der hier der Übersicht halber auch aus einer Enumeration kommt), dann die gerade eingestellte Sprache verwendet, um den entsprechenden Text zurückzuliefern. So muß nicht in jedem Formular erst eine Sprachunterscheidung mit Select Case erstellt werden, sondern man kann es auf eine Zeile beschränken:
Code:
    Me.lblTest.Caption = objEvt.fnTranslate(enmLKeys_TestLabel)
Der Vorteil ist: Wenn man eine weitere Sprache einbauen möchte, muß man lediglich in der Eventklasse die Enumeration für verfügbare Sprachen eins erweitern und die entsprechenden Übersetzungen in der Translate-Funktion anbieten - das war's. Mit dem ursprünglichen Modell hätte man die Anpassungen zusätzlich in jedem Formular vornehmen müssen.

Statt der Enumeration für die Keys würde man in der Praxis dann stattdessen einen Stringkey verwenden, den man z.B. in der "Tag"-Eigenschaft jedes Controls speichern könnte. Dann braucht man lediglich die Formularreferenz an eine erweiterte Translate-Funktion zu übergeben, diese scannt dann mit einer ForEach-Schleife alle Controls der übergebenen Formularreferenz, sucht nach den Tag-Einträgen und ersetzt dann je nach Controltyp die Caption-Eigenschaft oder welche auch immer. Die Übersetzungsstrings kann man dann auch einfach in eine entsprechende Sprachentabelle schreiben, die aus den Spalten für Key und jeweils einer Spalte pro Sprache besteht. So lassen sich die Beschriftungen sogar in einem fertiggestellten Frontend jederzeit dynamisch ändern.

Das funktioniert auch mit Reporten, wie in der zweiten Demo-Datenbank gezeigt wird.

Viel Spaß beim Experimentieren

Christian

(Beispiele sind in den Formaten Access 2002-2007)



LanguageEvents.zip
 Beschreibung:
Zwei Beispieldatenbanken, zeigen, wie man Events nutzen kann, um jederzeit dynamisch die Anzeigesprache zu verändern.

Download
 Dateiname:  LanguageEvents.zip
 Dateigröße:  104.02 KB
 Heruntergeladen:  73 mal

Neues Thema eröffnen   Neue Antwort erstellen Alle Zeiten sind
GMT + 1 Stunde

Diese Seite Freunden empfehlen

Seite 1 von 1
Gehe zu:  
Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum nicht posten
Du kannst Dateien in diesem Forum herunterladen

Verwandte Themen
Forum / Themen   Antworten   Autor   Aufrufe   Letzter Beitrag 
Keine neuen Beiträge Access Tabellen & Abfragen: NZ-Funktion Anwendung 2 sarahbella 602 11. Okt 2008, 20:01
Willi Wipp NZ-Funktion Anwendung
Keine neuen Beiträge Access Tabellen & Abfragen: Problem mit UPDATE in Access und externer anwendung. 1 Zauberzunge 491 04. Dez 2007, 17:54
Willi Wipp Problem mit UPDATE in Access und externer anwendung.
Keine neuen Beiträge Access Tabellen & Abfragen: Datumsfuktionen nutzen und dynamisch vorausberechnen! 12 haukilein 1020 14. Jun 2007, 13:19
haukilein Datumsfuktionen nutzen und dynamisch vorausberechnen!
Keine neuen Beiträge Access Formulare: Formular dynamisch öffnen 3 Napoleon 712 02. Feb 2007, 10:50
Willi Wipp Formular dynamisch öffnen
Keine neuen Beiträge Access Formulare: Bilder dynamisch anzeigen OHNE festen Pfad 13 Aurelius 1736 27. Dez 2006, 15:49
JörgG Bilder dynamisch anzeigen OHNE festen Pfad
Keine neuen Beiträge Access Tabellen & Abfragen: Kriterien bei Queries dynamisch aendern 5 Matthias........ 809 19. Sep 2006, 21:09
Nouba Kriterien bei Queries dynamisch aendern
Keine neuen Beiträge Access Formulare: Kombinationsfeld dynamisch belegen 12 darkreeper 1301 14. Sep 2006, 16:24
jens05 Kombinationsfeld dynamisch belegen
Keine neuen Beiträge Access Formulare: Unterformular mit Click wechseln 5 derTomsen 707 26. Jun 2006, 13:24
rita2008 Unterformular mit Click wechseln
Keine neuen Beiträge Access Formulare: Ufo automatisiert wechseln 0 jeem 502 15. Mai 2006, 08:18
jeem Ufo automatisiert wechseln
Keine neuen Beiträge Access Formulare: Linienbreite dynamisch festlegen (ctl.width) 2 Torst 905 30. Jan 2006, 11:17
Torst Linienbreite dynamisch festlegen (ctl.width)
Keine neuen Beiträge Access Formulare: Anwendung starten mit entsprechender Textfile aus DB heraus. 1 Katermurr 992 17. Nov 2005, 21:01
jens05 Anwendung starten mit entsprechender Textfile aus DB heraus.
Keine neuen Beiträge Access Formulare: Datensatz nur bei Button-Klick wechseln 3 manuel.gosch 493 31. Okt 2005, 18:21
Florus Datensatz nur bei Button-Klick wechseln
 

----> Diese Seite Freunden empfehlen <------ Impressum - Besuchen Sie auch: Microsoft Excel-Formeln