Loading...
 

Multi-Language Add-In für Visual Studio

Kurzanleitung (Windows Forms)

Multi-Language Add-In aktivieren

Nachdem Sie das Add-In installiert haben, gibt es einen neuen Menüeintrag im Werkzeuge-Menü in Visual Studio.

Image
Dieser Menüeintrag aktiviert das Add-In und zeigt es im Werkzeug-Fenster an. Sie können dieses Fenster an der Seite des Visual Studio-Hauptfensters andocken oder Sie ziehen es in eine "tab group", genau wie andere Werkzeug-Fenster in Visual Studio. Eine Platzierung unten, im weiten Format, ist empfehlenswert.
Image

Ein Projekt auswählen

EIne Visual Studio Lösung kann mehrere Projekte enthalten. Das Multi-Language Add-In aber arbeitet jeweils nur mit einzelnen Projekten. Zuerst muss daher das Projekt ausgewählt werden. Es gibt zwei Möglichkeiten, dies zu tun.

aus einem DialogWenn Sie das Add-In im Werkzeug-Menü auswählen, wird normalerweise eine Liste der Projekte in einem Dialog angezeigt.
Wählen Sie einfach das Projekt aus und klicken Sie auf OK.
Image
Dieser Dialog kann ausgeschaltet werden. Falls also schon jemand anderes mit dem Add-In gearbeitet hat, erscheint der Dialog unter Umständen nicht.
aus einer AuswahllisteOben im Hauptfenster des Add-In, direkt unter der Werkzeugleiste, ist eine Auswahlliste
Image
Sie können zu jeder Zeit ein anderes Projekt aus dieser Liste auswählen.

Initialisierung des Projektes zur Lokalisierung

Wenn Sie ein Projekt zum eratem Mal auswählen, müssen Sie die Originalsprache des Projektes Angeben. Das Add-In zeigt eine Liste der von Windows unterstützten Sprachen.
Image
Wählen Sie die Originalsprache aus un klicken Sie auf OK.
(Die Knöpfe unterhalb der Liste ändern das Aussehen der Liste. Der Knopf English zeigt also nur die Namen der Sprachen in Englisch an, er wählt nicht Englisch aus der Liste aus).

Auf diesen Dialog folgt normalerweise ein zweiter Dialog mit Optionen zum Scannen des Projektes. Klicken Sie einfach auf OK um die vorgegebenen Optionen zu akzeptieren.
Image

Das Add-In fügt Ihrem Projekt nun zwei neue Dateien hinzu.

<project name>_ml.mlbDies ist die vom Add-In benutzte Projektdatenbank. Sie wird zum Projekt hinzugefügt mit BuildAction=None.
mlstring.vb oder
mlstring.cs oder
mlstring.h + .cpp
Dieses Modul enthält Hilfsfunktionen, insbesondere die Funktion ml_string(), welche zum Laden der lokalisierten Zeichnketten benötigt wird.

Das Projekt scannen

Das Add-In scannt nun das Projekt. Dies geschieht in zwei Phasen:

  • scannen der Steuerelemente
  • Scannen des Programmcodes

In der ersten Phase werden die Steuerelemente in jedem Form und jedem ))UserControl(( nach Eigenschaften mit dem Attribut localizable durchsucht. In der zweiten Phase wird der Programmcode nach Texten durchsucht, die evtl. übersetzt werden müssen.

Die Ergebnisse dieses Scans werden in zwei separaten Tabellen im Add-In-Fenster angezeigt. Zwischen diesen Tabellen können Sie mit Hilfe der Register unten im Fenster wechseln.
Image

Eine neue Sprache hinzufügen

Um eine neue Sprache zum Projekt hinzuzufügen, klicken Sie auf das Image Symbol in der Werkzeugleitse des Add-In.

Es erscheint ein Dialog, der sehr ähnlich ist zu dem Dialog zur Auswahl der Originalsprache des Porjektes.
Image
Image
Wählen Sie eine neue Sprache aus und klicken Sie auf OK um diese Sprache dem Projekt hizuzufügen.

Manche Sprachen, so wie Deutsch oder Französisch, werden als neutrale Sprachen angesehen. Regionale Variationen, so wie Deutsch(Deutschland), Deutsch(Österreich), Französisch(Frankreich), oder Französisch(Kanada) werden als spezifische Sprachen bezeichnet. Sie sollten immer die neutrale Sprache vor der spezifischen Sprache hinzufügen. Wenn Sie eine 'spezifische Sprache auswählen, gibt Ihnen das Add-In die Auswahlmöglichkeit beide Varianten hinzuzufügen oder nur die neutrale'' Sprache.

Nachdem die zweite Sprache hinzugefügt ist, wird das Add-In

  • für die neue Sprache eine neue Spalte zu den Tabellen hinzufügen
  • nach Übersetzungen für allgemeine Texte wie OK und Cancel in der globalen Übersetzungsdatenbank suchen


Schauen wir uns die beiden Tabellen genauer an.

Steuerelemente-Tabelle

Um die Steuerelement-Tabelle anzuzeigen, muss unten in Fenster das Steuerelemente-Register ausgewählt sein. Die Tabelle sieht in etwa wie die folgende Abbildung aus.
Image
Standarmässig werden die Eigenschaften hierarchisch angezeigt, wobei die Verbindung zwischen Eigenschaften und Steuerelementen dargestellt wird. Alternativ können Sie die Eigenschaften zu jedem Form oder ))UserControl(( in einer einfachen Liste anzeigen. Um diesen Modua auszuwählen, klicken Sie auf den Image Knopf in der Werkzeugleiste und wählen dann Flat List aus dem Menü aus.
Image
Die Steuerelemente-Tabelle sieht dann wie folgt aus:
Image
Um eine Übersetzung einzugeben, klicken Sie einfach auf die Zelle und tragen den neuen Text ein. Wenn Sie die Übersetzung selber durchführen können, ist dies der einfachste Weg.

Ein Text, welcher in hellgrau angezeigt wird, ist der Text, der zur Laufzeit über den resource fallback Mechanismus ausgewählt wird. Generell heisst das Folgendes: Ist ein Text nicht definiert für eine spezifische Sprache (z.B. Spanisch(Mexiko)), dann wird der Text der neutralen Sprache benutzt (z.B. Spanisch). Ist dieser auch nicht definiert, so wird der Originaltext des Projektes verwendet

Das Auswahlkästchen links neben dem Eigenschafts-Namen zeigt an, das der Text zur Übersetzung ausgewählt wurde. Standardmässig werden alle Eigenschaften, die nicht leere Zeichenketten enthalten, ausgewählt. In der Abbildung oben sehen Sie zwei Menüseparatoren mit dem Text "-". Diese müssen nicht übersetzt werden, also wird die Auswahl durch klicken auf das Auswahlkästchen ausgehoben.
Image
Eigentlich wollen wir diese Eigenschaften nie wieder sehen, daher können wir einen Schritt weiter gehen und sie komplett verstecken. Um dies zu tun, klicken wir auf das Sonnensymbol Image am linken Rand. Das Sonnensymbol wird durch ein Mondsymbol ersetzt Image .
Image
Um die ganze Zeile zu verstecken, klicken Sie auf das Maskensymbol in der Werkzeugleiste Image . Um die versteckten Eigenschaften wieder zu sehen, klicken Sie auf den Image Knopf in der Werkzeugleiste und wählen Sie "Show hidden properties" im Menü aus.

Standardmässig werden Eigenschaften, welche leere Zeichenketten enthalten, nicht in der Tabelle angezeigt. Nur sehr selten ist es sinnvoll, leere Zeichenketten zu übersetzen, daher ist das eine vernünftige Einstellung. Wenn Sie lokalisierbare Eigenschaften, die leere Zeichenketten enthalten, anzeigen möchten, dann können Sie diese Option im Einstellungsdialog ändern. Um diesen Dialog anzuzeigen kklicken Sie auf den Einstallungen-Knopf Image in der Werkzeugleiste. Details dazu un dzu weiteren Optionen finden Sie in der Online-Hilfedatei.

Programmcode-Tabelle

Um die Programmcode-Tabelle anzuzeigen, muss unten in Fenster das Programmcode-Register ausgewählt sein. Die Tabelle sieht in etwa wie die folgende Abbildung aus.
Image
Wie in der Steuerelemente-Tabelle kann ein Text durch klicken auf das Auswahlkästchen links von der Zeilennummer zur Übersetzung ausgewählt werden. Im Gegensatz zur Steuerelemente-Tabelle sind aber keine Texte automatisch ausgewählt.

Wenn Sie auf eine Zeile in der Programmcode-Tabelle klicken, wird die entsprechende Programmzeile im Programmeditor angezeigt. Alternativ können Sie eine ausgewählte Zeile im Programmeditor, welche eine Zeichenkette enthält, durch klicken auf den goto line Knopf Image in der Werkzeugleiste in der Programmcode-Tabelle finden.
Image
Wenn Sie eine Zeichenkette zur Übersetzung durch klicken auf das Auswahlkästchen auswählen, erzeugt das Add-In eine ID Nummer für den Text und fügt einen Aufruf der Function ml_string() im Programmcode ein.
Image
Wie Sie sehen, hat die Funktion zwei Parameter:

  • die ID Nummer der Zeichenkette und
  • den Originaltext

Nur die ID Nummer wird wirklich benutzt, man kann also den Originaltext als Kommentar ansehen. Durch das Belassen des Originaltextes im Programmcode wird das Programm allerdings "lesbarer".

Das exakte Format der Funktion ml_string hängt von der im Projekt benutzten Computersprache ab.

C#OpenFile.Title = ml.ml_string(27, "Open") ;
VB.NETOpenFile.Title = ml_string(27,"Open")
C++OpenFile->Title = ML_STRING(28, "Open") ;

Die Funktion ml_string ist implementiert im Modul mlstring, welches aus einer Template-Datei zum Projekt hinzugefügt (normalerweise im Verzeichnis C:\Program Files\MultiLang2005\Templates).

Wurde eine Zeichenkette zur Übersetzng ausgewählt, so können Sie die Übersetzung einfach in die Tabelle eintragen.

Wie in der Steuerelemente-Tabelle auch, haben wir die Möglichkeit, nicht benötigte Texte zu verstecken. Z.B. muss keiner der Texte in dem Modul AssemblyInfo.cs übersetzt werden.
Auch hier verstecken wir eine Zeichenkette durch klicken auf das Sonnensymbol Image am linken Rand, welches dann durch das Mondsymbol Image ersetzt wird. Gleichzeitig wird der Kommentar //MLHIDE ('MLHIDE in VB.NET) am Ende der Programmzeile eingefügt, um den Text als "versteckt" zu kennzeichnen.
Image
Um die Zeile ganz zu verstecken, klicken Sie auf das Maskensymbol in der Image . Dies funktioniert etwas anders als in der Steuerelemente-Tabelle. Die versteckten Elemente verschwinden hinter einem neuen Knoten hidden und können einfach durch Aufklappen dieses Knotens angesehen werden.
Image
Es ist sinnvoll, jeden Text im Projekt entweder auszuwählen oder zu verstecken. Im Programmcode neu hinzugefügte Zeichenketten können so sehr viel einfacher in der Tabelle gefunden werden. Natürlich können Sie auch den Kommentar MLHIDE an Zeilen im Programmcode-Editor anhängen. Wenn das Add-In das Projekt scannt, werden diese Zeichenketten automatisch versteckt.

Programmcode-Zeichenketten mithilfe von regulären Ausdrücken herausfiltern

In vielen Fällen können Sie anhand von einfachen Regeln Texte im Programmcode auswählen oder verstecken. Z.B. wollen Sie wahrscheinlich SQL-Abfragen oder die Parameter einer event logging Funktion nicht übersetzen. Andererseits wollen Sie wahrscheinlich immer die Parameter zu einer MessageBox-Funktion übersetzen.

Solche Fälle können sehr einfach über "Programmcode-Zeichenketten mithilfe von regulären Ausdrücken herausfiltern" bearbeitet werden. Diese Option kann über das Werkzeug-Menü ausgewählt werden (siehe unten) oder aus dem Kontext-Menü in der Steuerelemente-Tabelle.
Image
Dieser Befehl zeigt den Filterdialog, in dem Sie einen Suchbegriff als regulären Ausdruck eingeben können. Das Beispiel in der Abbildung unten zeigt den Suchbegriff "^select ", womit alle Zeichenketten gesucht werden, die mit dem Wort select anfangen. Die Option zum Verstecken der Zeichenkette wurde gewählt.
Image
In dem Dialog besteht die Möglichkeit, nur die Zeichenkette oder die komplette Programmcodezeile zu vergleichen. Durch den Vergleich der kompletten Programmzeile lassen sich z.B. Zeichenketten in bestimmten Funktionsaufrufen einfach finden..

Wurde die Zeichenkette gefunden, so fragt das Add-In, ob diese spezifische Zeichenkette versteckt werden soll.
Image

Das Übersetzungsgedächtnis

Ausser in der Projektdatenbank, die zum Speichern der Übersetzungen für individuelle Projekte benutzt wird, speichert das Multi-Language Add-In alle Übersetzungen in der globalen Datenbank für allgemeine Übersetzungen. Wenn es eine exakte Übereinstimmung zwischen einem neuen Text und einem Eintrag in der globalen Datanbank findet, wird die Übersetzung automatisch eingefügt. Dies vereinfacht die Übersetzung von häufig genutzten Begriffen wie OK und Cancel.

Wenn Sie die Übersetzung der Texte selber durchführen können, stellt das Übersetzungsgedächtnis, basierend auf den in der globalen Datenbank gespeicherten Einträgen, eine weitere Hilfe dar. Zur Benutzung des Übersetzungsgedächtnisses klicken Sie in die Zelle, die Sie editieren möchten und drücken dann F3 oder F12. Die folgende Abbildung zeigt den Übersetungegedächtnis-Dialog mit dem Text Add a new language to the project, welcher ins Deutsche übersetzt werden soll.
Image
Im unteren Teil des Dialoges sehen Sie eine Liste existierender Übersetzungen, welche ganz oder teilweise mit dem zu übersetzenden Text übereinstimmen. Die Liste ist nach der Anzahl der übereinstimmenden Worte sortiert, so dass die nützlichsten Übersetzungen oben stehen sollten. Sie können Worte aus der Tabelle kopieren und die neue Übersetzung in dem mit Translation markierten Eingabefeld eintragen.

Oft genutzte Worte wie "a", "to" und "the" helfen hier kaum. Über das Register Ignored words können Sie worte auswählen, welche ignoriert werden sollen. Das Add-In speichert eine Liste der zu ignorierenden Worte in der globalen Datenbank und ignoriert diese in Zukunft.

Das Übersetzungsgedächtnis ist besonders nützlich für technische Begriffe, bei denen Ihnen die korrekte Übersetzung nicht geläufig ist und die Begriffsverwendung konsistent sein soll.

Benutzung des Spreadsheet-Export

Wenn Sie Texte nicht selber übersetzen können, müssen Sie diese an einen Übersetzer geben. Dafür können Sie den Spreadsheet Export/Import nutzen.
Es gibt zwei Versionen dieses Werkzeuges:

  • die einfache Version mit einem Worksheet und ohne Makros (für Excel oder OpenOffice)
  • den strukturierten Export mit drei Worksheete und mit Makrounterstützung (für Excel)

Beide Versionen werden über das Excel-Symbol Image in der Werkzeugleiste aufgerufen.

Die Abbildung unten zeigt das Format der einfachen Spreadsheet-Datei. Wie Sie sehen, enthält die erste Spalte die ID Nummer, gefolgt von einer Spalte für jede Sprache. Die ersten beiden SPalten enthalten die Namen der Sprachen und die lokalen ID-Nummern.
Image
Der Übersetzer sollte die Texte in des richtigen Sprachspalten anpassen, ohne das Format der Datei zu verändern. Ist die Übersetzung beendet, so können die Übersetzungen zurück in das Projekt importiert werden.

Das Format mit drei Worksheets enthält zwei zusätzliche Worksheets, welche der Steuerelemente-Tabelle und der Programmcode-Tabelle ähneln. Diese Worksheets stellen dem Übersetzer mehr Kontextinformation zur Verfügung. Da alle Texte aus den zusätzlichen Worksheets auch im dritten Worksheet vorhanden sind, werden Excel-Makros benutzt, um die Daten in der Datei konsistent zu halten. Die Makros stellen zusätzlich noch andere Funktionen zur Verfügung, ähnlich einigen vom Add-In zu Verfügung gestellten Funktionen.

Die Nutzung der strukurierten Version mit drei Worksheets wird empfohlen, ausser Ihre Firma leht die Benutzung von Makros strikt ab.

Zur Nutzung der Excel-Unterstützung muss Excel auf dem PC installiert sein. Die OpenOffice-Unterstützung benutzt die AODL Bibliothek, wofür OpenOffice nicht installiert sein muss.

Export der Texte in Resource-Dateien

Um die Übersetzungen in Ihrem Projekt zu benutzen, müssen Sie:

  • das Localizable Attribut in jedem Form und jedem Steuerelement
  • die Texte in Resource-Dateien im ResX-Format exportieren
Dazu klicken Sie auf das Laufzeitunterstützungssymbol Image in der Werkzeugleiste und wählen Sie das Kommando Native Runtime Support aus der Auswahlliste.
Image
Image
Es erscheint ein Dialog, in dem Sie die zu exportierenden Sprachen und einige andere Optionen auswählen können. Durch klicken auf Export wird die Operation gestartet.
Nach Beendigung sehen Sie im SolutionExplorer-Fenster, dass eine Anzahl von ResX-Dateien Ihrem Projekt hinzugefügt wurden. Alle diese Dateien haben das Attribut BuildAction=EmbeddedResource.

Wenn Sie Ihr Projekt compilieren werden zusätzlichen sogenannte Satelitten-Dlls generiert. Diese Dlls werden in Unterverzeichnissen der bin\Debug oderr bin\Release Verzeichnisse erzeugt und entsprechend der Abkürzug der Sprache benannt (ISO 639-1 und ISO 3166, früher RFC 1766).
Image

Image

Die Satelitten-Dlls müssen mit Ihrer Applikation ausgeliefert werden und genau so in Unterverzeichnissen installiert werden, wie sei von Visual Studion generiert wurden.

Das Colpilierte Projekt ist nun lokalisiert. Windows wird die Applikation so initialisieren, dass die gleiche Sprache benutzt wird, die auch für die Benutzeroberfläche benutzt wird. Wenn Sie z.B. Unterstützung für Deutsch hinzugefügt haben und Ihre Applikation wird (mit den Satelitten-Dlls) auf einem Computer mit einer deutschen Windows-Version gestartet, dann werden automatisch die deutschen Resourcen benutzt.

Die Sprache der Applikation auswählen

Es ist günstig, die Sprache Ihrer Applikation unabhängig von der von Windows benutzten Sprache auswählen zu können. Das ist nicht nur essentiell zum Testen, Sie wollen es vielleicht zu einem permanenten Merkmal Ihrer Applikation machen.
Wir müssen zwei Fälle separat behandeln:

  • die Sprache beim Programmstart auswählen
  • die Sprache während der Lufzeit ändern


Es ist technisch sehr einfach, die Sprache des Programms beim Start zu setzen. Dafür muss nur die CurrentUICulture Eigenschaft des Haupt-Thread gesetzt werden, bevor das Haupt-Form des Programms aufgerufen wird.

Image
Das Multi-Language Add-In kann zu Ihrem Projekt ein Form hizufügen, welches dem Benutzer erlaubt, bei Programmstart eine Sprache auszuwählen (siehe Abbildung unten).

Mit diesem Dialog kann die Sprache ausgewählt und festgelegt werden, ob der Dialog beim nächsten Programmstart angezeigt werden soll.
Um dieses Merkmal hinzuzufügen, klicken SIe auf das Laufzeitunterstützungssymbol Image in der Werkzeigleiste und wählen Sie den Befehl Add language selection form to your project aus der Auswahlliste.
Image
Image
Es erscheint ein Dialog, der zeigt, welche Aktionen notwendig sind, um den Dialog Ihrem Projekt hinzuzufügen.

Zum Starten auf Add Now klicken.

Es wird ein Form mit dem Namen SelectLanguage dem Projekt hinzugefügt, ebenso wie etwas Programmcode um das Form bei Programmstart anzuzeigen.

Die Sprache bei laufendem Programm wechseln

Etwas mehr Aufwand ist notwendig um die Sprache zu ändern, nachdem die Benutzeroberfläche initialisiert wurde. Dazu sind drei Schritte notwendig:

Eine neue Sprache auswählenUm eine neue Sprache auszuwählen ist es nur notwendig, das oben beschriebene SelectLanguage-Form anzuzeigen. Dies kann einfach in einen Menü-Befehl in Ihrer Applikation eingebunden werden.
Ereignisse übertragenIhre Applikation kann mehrere Forms enthalten, die wiederum Steuerelemente enthalten. Wenn die Sprache geändert muss die Benutzeroberfläche jeder aktiven Komponente aktualisiert werden. Der beste Weg dazu ist ein Ereignis-Mechanismus.

Normalerweise benutzen Sie Steuerelemente in vielen, separat compilierten Komponenten. Dafür müssen Ereignisse über eine öffentliche Schnittstelle generiert werden. Am einfachsten werden dazu die Ereignisse über ein Singleton Objekt erzeugt, welches in einem separaten Projekt compiliert wird.
Aktualisieren der BenutzeroberflächeJedes Form und jedes Steuerelement braucht einen Event-Handler, der die Benutzeroberfläche aktualisiert, wenn die Spraceh geändert wird. Die Funktion InitializeComponent, generiert von Visual Studio, ist nicht dafür ausgelegt, wiederholt aufgerufen zu werden. Zur Aktualisierung der Benutzeroberfläche kann das Add-In die Funktion ml_UpdateControls erstellen, um die Eigenschaften der Benutzeroberfläche zu reinitialisieren.
Das Multi-Language Add-In kann den Code für die letzten beiden Punkte automatisch erzeugen über den Menübefehl
Support for Runtime Language Switching.

Eine kleine Änderung im SelectLanguage Form ist notwendig, um das language changed-Ereignis zu erzeugen.

Dies ist in einem Tutorial in den Hilfedateien des Add-Ins beschrieben.
Image
Created by Sabine. Last Modification: Saturday 04 of July, 2009 14:11:51 GMT by Sabine.