Manager für mehrsprachigkeit für Anwendungen

    • Release

    Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von Artentus.

      Manager für mehrsprachigkeit für Anwendungen

      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

      VB.NET-Quellcode

      1. Namespace MultiLanguage
      2. Class LanguageManager
      3. Shared Sub LoadLanguageData(File As LanguageDataBase)
      4. MustInherit Class ControlManagerBase
      5. MustOverride ReadOnly Property WindowName As String
      6. ReadOnly Property MainControlGroup As ControlGroup
      7. Sub Load()
      8. Sub Unload()
      9. Class Translation
      10. ReadOnly Property WindowName As String
      11. ReadOnly Property ControlPath As IEnumerable(Of String)
      12. ReadOnly Property ControlProperties As IEnumerable(Of ControlProperty)
      13. Sub New(NewWindowName As String, NewControlPath As IEnumerable(Of String), NewControlProperties As IEnumerable(Of ControlProperty))
      14. Class ControlProperty
      15. ReadOnly Property PropertyName As String
      16. ReadOnly Property PropertyValue As String
      17. Sub New(NewPropertyName As String, NewPropertyValue As String)
      18. Class ControlGroup
      19. ReadOnly Property Name As String
      20. ReadOnly Property SubGroups As List(Of ControlGroup)
      21. ReadOnly Property ControlNames As List(Of ControlName)
      22. Sub New()
      23. Sub New(NewName As String)
      24. Class ControlName
      25. ReadOnly Property Name As String
      26. ReadOnly Property Control As System.Windows.Forms.Control
      27. Sub New(NewName As String, NewControl As System.Windows.Forms.Control)
      28. MustInherit Class LanguageDataBase
      29. ReadOnly Property Datas As IEnumerable(Of Translation)
      30. MustOverride Function GetDatas() As IEnumerable(Of Translation)
      31. Class LanguageDataFromFile : Inherits LanguageDataBase
      32. ReadOnly Property Path As String
      33. Sub new(NewPath As String)
      34. Class InvalidControlPathException : Inherits Exception
      35. ReadOnly Property Path As IEnumerable(Of String)
      36. ReadOnly Property FaultName As String
      37. ReadOnly Property FaultControlGroup As ControlGroup
      38. Sub New(NewPath As IEnumerable(Of String), NewFaultName As String, NewFaultControlGroup As ControlGroup)
      39. Class InvalidPropertyNameException : Inherits Exception
      40. ReadOnly Property ControlType As Type
      41. ReadOnly Property FaultControlProperty As ControlProperty
      42. Sub New(NewControlType As Type, NewFaultControlProperty As ControlProperty)
      43. Class InvalidPropertyValueExcepion : Inherits Exception
      44. ReadOnly Property PropertyType As Type
      45. ReadOnly Property FaultControlProperty As ControlProperty
      46. 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:
      Spoiler anzeigen
      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:

      VB.NET-Quellcode

      1. Public Class ControlManager_MainForm
      2. Inherits MultiLanguage.ControlManagerBase
      3. Public Overrides ReadOnly Property WindowName As String
      4. Get
      5. End Get
      6. End Property
      7. End Class
      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.

      VB.NET-Quellcode

      1. Public Sub New(Window As Form_Main)
      2. '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.
      3. Dim StuffPanel As New MultiLanguage.ControlGroup("StuffPanel")
      4. 'Dieser Gruppierung werden die Controls hinzugefügt. Damit die Controls identifiziert werden können, benötigen sie Namen.
      5. StuffPanel.ControlNames.Add(New MultiLanguage.ControlName("ShutdownCheckBox", Window.CheckBox_ShutdownOnFinish))
      6. 'Der Hauptgruppe wird die untergeordnete Gruppierung hinzugefügt.
      7. MainControlGroup.SubGroups.Add(StuffPanel)
      8. 'Weiters werden der hauptgruppe ihre Controls hinzugefügt. Diese Controls werden direkt mit ihrem Namen identifiziert, da sie keiner anderen Gruppe untergeordnet sind.
      9. MainControlGroup.ControlNames.Add(New MultiLanguage.ControlName("TestButton", Window.Button_DoATest))
      10. '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.
      11. '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.
      12. AddHandler Window.Disposed, Sub() Unload()
      13. 'Der Aufruf der Load-Methode signalisiert, dass ab jetzt Sprachdefinitionen auf diesen ControlManager angewandt werden können.
      14. Load()
      15. End Sub

      In der entsprechenden Form-Klasse muss nur noch die Instanz des ControlManagers erstellt werden:

      VB.NET-Quellcode

      1. Public Class Form_Main
      2. Dim ControlManager As ControlManager_MainForm
      3. Public Sub New()
      4. InitializeComponent()
      5. 'Wichtig ist, dass die Instanz des ControlManagers erst hier (oder später, z.B. wenn das OnShown-Event ausgelöst wird) erstellt wird.
      6. 'Erst beim Aufruf von InitializeComponent werden die Controls der Form instanziert und erst dann, können sie verwendet werden.
      7. ControlManager = New ControlManager_MainForm(Me)
      8. End Sub
      9. '....
      10. 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

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Niko Ortner“ ()