Name des Programms:
MultiLanguage.dll
Beschreibung:
Dieser Thread hat mich auf die Idee gebracht, eine Sprachverwaltung selbst zu programmieren. Das Ganze ist nicht sehr groß, deshalb hab ich das im Kleinkram-Bereich gepostet, und nicht im Libraries/Controls-Bereich.
Diese Dll enthält einen Manager, der Sprachdefinitionen verwaltet. Für jede Form wird ein ControlManager von der Basisklasse abgeleitet. Dieser ControlManager verwaltet die Zugriffe auf die Controls der Form.
Übersetzungen können aus unterschiedlichen Quellen geladen werden (die Anwendung muss nicht neu gestartet werden). Es gibe eine Basisklasse, von der Quellen abgeleitet werden können. Eine Quelle für Dateien ist bereits implementiert.
Klassendiagramm:
Friend und Private Member sind nicht aufgelistet.
Spoiler anzeigen
Screenshot von einer Testanwendung:
Programmiersprache / IDE:
z.B. Visual Basic .NET / Microsoft Visual Basic 2010 Express
Tutorial zur Verwendung:
Spoiler anzeigen
Systemanforderungen:
.Net Framework 4.0 (3.5 wäre theoretisch noch möglich, aber 4.0 sollte sowieso schon jeder haben)
Download:
MultiLanguage v1.0.zip (10KB gepackt, 31KB entpackt)
Englisch.txt (Beispiel für Sprachdefinition in Kombination mit LanguageDataFromFile) (107 Bytes)
Lizenz/Weitergabe:
Lizenziert unter der WTFPL.
Sollte das tatsächlich mal jemand verwenden, würde ich mich natürlich freuen, wenn man mich informieren würde.
MultiLanguage.dll
Beschreibung:
Dieser Thread hat mich auf die Idee gebracht, eine Sprachverwaltung selbst zu programmieren. Das Ganze ist nicht sehr groß, deshalb hab ich das im Kleinkram-Bereich gepostet, und nicht im Libraries/Controls-Bereich.
Diese Dll enthält einen Manager, der Sprachdefinitionen verwaltet. Für jede Form wird ein ControlManager von der Basisklasse abgeleitet. Dieser ControlManager verwaltet die Zugriffe auf die Controls der Form.
Übersetzungen können aus unterschiedlichen Quellen geladen werden (die Anwendung muss nicht neu gestartet werden). Es gibe eine Basisklasse, von der Quellen abgeleitet werden können. Eine Quelle für Dateien ist bereits implementiert.
Klassendiagramm:
Friend und Private Member sind nicht aufgelistet.
VB.NET-Quellcode
- Namespace MultiLanguage
- Class LanguageManager
- Shared Sub LoadLanguageData(File As LanguageDataBase)
- MustInherit Class ControlManagerBase
- MustOverride ReadOnly Property WindowName As String
- ReadOnly Property MainControlGroup As ControlGroup
- Sub Load()
- Sub Unload()
- Class Translation
- ReadOnly Property WindowName As String
- ReadOnly Property ControlPath As IEnumerable(Of String)
- ReadOnly Property ControlProperties As IEnumerable(Of ControlProperty)
- Sub New(NewWindowName As String, NewControlPath As IEnumerable(Of String), NewControlProperties As IEnumerable(Of ControlProperty))
- Class ControlProperty
- ReadOnly Property PropertyName As String
- ReadOnly Property PropertyValue As String
- Sub New(NewPropertyName As String, NewPropertyValue As String)
- Class ControlGroup
- ReadOnly Property Name As String
- ReadOnly Property SubGroups As List(Of ControlGroup)
- ReadOnly Property ControlNames As List(Of ControlName)
- Sub New()
- Sub New(NewName As String)
- Class ControlName
- ReadOnly Property Name As String
- ReadOnly Property Control As System.Windows.Forms.Control
- Sub New(NewName As String, NewControl As System.Windows.Forms.Control)
- MustInherit Class LanguageDataBase
- ReadOnly Property Datas As IEnumerable(Of Translation)
- MustOverride Function GetDatas() As IEnumerable(Of Translation)
- Class LanguageDataFromFile : Inherits LanguageDataBase
- ReadOnly Property Path As String
- Sub new(NewPath As String)
- Class InvalidControlPathException : Inherits Exception
- ReadOnly Property Path As IEnumerable(Of String)
- ReadOnly Property FaultName As String
- ReadOnly Property FaultControlGroup As ControlGroup
- Sub New(NewPath As IEnumerable(Of String), NewFaultName As String, NewFaultControlGroup As ControlGroup)
- Class InvalidPropertyNameException : Inherits Exception
- ReadOnly Property ControlType As Type
- ReadOnly Property FaultControlProperty As ControlProperty
- Sub New(NewControlType As Type, NewFaultControlProperty As ControlProperty)
- Class InvalidPropertyValueExcepion : Inherits Exception
- ReadOnly Property PropertyType As Type
- ReadOnly Property FaultControlProperty As ControlProperty
- Sub New(NewPropertyType As Type, NewFaultControlProperty As ControlProperty)
Screenshot von einer Testanwendung:
Programmiersprache / IDE:
z.B. Visual Basic .NET / Microsoft Visual Basic 2010 Express
Tutorial zur Verwendung:
Archiv herunterladen und die Dateien MultiLanguage.dll und MultiLanguage.xml in einen geeigneten Ordner entpacken. (Üblicherweise nicht der Desktop )
In Visual Studio, wenn das betreffende Projekt geöffnet ist, oben auf "Projekt" und dort auf "<Projektname>-Eigenschaften..." klicken. Zur Registerkarte "Verweise" wechseln. Auf "Hinzufügen..." klicken. Auf die Registerkarte "Durchsuchen" wechseln. Zur Dll navigieren und doppelklick darauf.
Optional: In der unteren Liste einen Haken bei "MultiLanguage" setzen, damit der Namespace global importiert ist. Dadurch muss man den Standardnamespace nicht vor jeder Klasse angeben... jeder wie er 's braucht.
Für alle Forms, die anpassbar sein sollen, eine neue Klassen-Datei mit einem aussagekräftigen Namen (z.B. ControlManager_MainForm) anlegen. Dazu bietet sich an, alle ControlManager-Ableitungen in einem separaten Ordner unterzubringen, falls es sich um mehrere handelt (dazu Rechtsklick auf das Projekt im Projektmappenexplorer -> "Hinzufügen" -> "Neuer Ordner").
Die Klasse muss von ControlManagerBase erben. Der Code, den Visual Studio generiert sollte in etwa so aussehen:
Hier wird als erstes bei der WindowName-Property ein String zurückgegeben. Dieser String gibt an, wie Instanzen dieses ControlManagers (sprich: wie entsprechende Fenster) in der Sprachdefinition bezeichnet werden müssen. Ein Beispiel wäre "MainWindow", um das Hauptfenster anzugeben.
Jetzt wird noch ein Konstruktor benötigt. Dieser nimmt eine Instanz der zugehörigen Form entgegen, damit auf die Controls der Form zugegriffen werden kann.
In der entsprechenden Form-Klasse muss nur noch die Instanz des ControlManagers erstellt werden:
Jetzt kann beliebig im Programm
In Visual Studio, wenn das betreffende Projekt geöffnet ist, oben auf "Projekt" und dort auf "<Projektname>-Eigenschaften..." klicken. Zur Registerkarte "Verweise" wechseln. Auf "Hinzufügen..." klicken. Auf die Registerkarte "Durchsuchen" wechseln. Zur Dll navigieren und doppelklick darauf.
Optional: In der unteren Liste einen Haken bei "MultiLanguage" setzen, damit der Namespace global importiert ist. Dadurch muss man den Standardnamespace nicht vor jeder Klasse angeben... jeder wie er 's braucht.
Für alle Forms, die anpassbar sein sollen, eine neue Klassen-Datei mit einem aussagekräftigen Namen (z.B. ControlManager_MainForm) anlegen. Dazu bietet sich an, alle ControlManager-Ableitungen in einem separaten Ordner unterzubringen, falls es sich um mehrere handelt (dazu Rechtsklick auf das Projekt im Projektmappenexplorer -> "Hinzufügen" -> "Neuer Ordner").
Die Klasse muss von ControlManagerBase erben. Der Code, den Visual Studio generiert sollte in etwa so aussehen:
Jetzt wird noch ein Konstruktor benötigt. Dieser nimmt eine Instanz der zugehörigen Form entgegen, damit auf die Controls der Form zugegriffen werden kann.
VB.NET-Quellcode
- Public Sub New(Window As Form_Main)
- 'Alle Controls, die sich in dieser Gruppierung befinden, werden mit "StuffPanel.<Name>" identifiziert. Dadurch lassen sich Controls nach Verwendungszwecken gruppieren. ControlGroups können auch weiter geschachtelt werden.
- Dim StuffPanel As New MultiLanguage.ControlGroup("StuffPanel")
- 'Dieser Gruppierung werden die Controls hinzugefügt. Damit die Controls identifiziert werden können, benötigen sie Namen.
- StuffPanel.ControlNames.Add(New MultiLanguage.ControlName("ShutdownCheckBox", Window.CheckBox_ShutdownOnFinish))
- 'Der Hauptgruppe wird die untergeordnete Gruppierung hinzugefügt.
- MainControlGroup.SubGroups.Add(StuffPanel)
- 'Weiters werden der hauptgruppe ihre Controls hinzugefügt. Diese Controls werden direkt mit ihrem Namen identifiziert, da sie keiner anderen Gruppe untergeordnet sind.
- MainControlGroup.ControlNames.Add(New MultiLanguage.ControlName("TestButton", Window.Button_DoATest))
- 'Die Unload-Methode muss aufgerufen werden, sobald ein Fenster nicht mehr aktualisiert werden soll. Das Disposed-Event bietet sich hierfür an. Die Methode kann aber auch anders aufgerufen werden.
- 'Wenn die Unload-Methode nicht aufgerufen wird, sobald das Fenster nicht mehr verfügbar ist, wird beim nächsten Laden einer Sprachdefinition versucht, auf nicht mehr existierende Controls zugegriffen, was zu einer Exception führt.
- AddHandler Window.Disposed, Sub() Unload()
- 'Der Aufruf der Load-Methode signalisiert, dass ab jetzt Sprachdefinitionen auf diesen ControlManager angewandt werden können.
- Load()
- End Sub
In der entsprechenden Form-Klasse muss nur noch die Instanz des ControlManagers erstellt werden:
VB.NET-Quellcode
- Public Class Form_Main
- Dim ControlManager As ControlManager_MainForm
- Public Sub New()
- InitializeComponent()
- 'Wichtig ist, dass die Instanz des ControlManagers erst hier (oder später, z.B. wenn das OnShown-Event ausgelöst wird) erstellt wird.
- 'Erst beim Aufruf von InitializeComponent werden die Controls der Form instanziert und erst dann, können sie verwendet werden.
- ControlManager = New ControlManager_MainForm(Me)
- End Sub
- '....
- End Class
Jetzt kann beliebig im Programm
MultiLanguage.LanguageManager.LoadLanguageData()
aufgerufen werden. Zum Beispiel mit einer Instanz von MultiLanguage.LanguageDataFromFile. Sprachdefinitionen können auch in den Ressourcen des Programmes hinterlegt werden (wobei es wahrscheinlich wartungsfreundlicher ist, wenn die Dateien im Programmordner liegen). Systemanforderungen:
.Net Framework 4.0 (3.5 wäre theoretisch noch möglich, aber 4.0 sollte sowieso schon jeder haben)
Download:
MultiLanguage v1.0.zip (10KB gepackt, 31KB entpackt)
Englisch.txt (Beispiel für Sprachdefinition in Kombination mit LanguageDataFromFile) (107 Bytes)
Lizenz/Weitergabe:
Lizenziert unter der WTFPL.
Sollte das tatsächlich mal jemand verwenden, würde ich mich natürlich freuen, wenn man mich informieren würde.
"Luckily luh... luckily it wasn't poi-"
-- Brady in Wonderland, 23. Februar 2015, 1:56
Desktop Pinner | ApplicationSettings | OnUtils
-- Brady in Wonderland, 23. Februar 2015, 1:56
Desktop Pinner | ApplicationSettings | OnUtils
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Niko Ortner“ ()