Laden...

Translator, (GUI-)Texte einfach und schnell übersetzen

Erstellt von Easyrider vor 14 Jahren Letzter Beitrag vor 11 Jahren 15.064 Views
E
Easyrider Themenstarter:in
200 Beiträge seit 2006
vor 14 Jahren
Translator, (GUI-)Texte einfach und schnell übersetzen
**Übersetzungstool + DLL für Programme**
**Einleitung** Aus eigenen projektspezifischen Anforderungen entstand ein kleines Übersetzungs-Tool. Und das möchte ich euch nicht vorenthalten. Vielleicht hilft es ja dem einen oder anderen. Ziel des ganzen war es, eine einfache, schnelle und leichte Anwendung für Übersetzungen und deren Implementation zu schaffen. **Features:** - Eigener Editor - Suchfunktion - Einfache Übersetzungen - Pro Sprache eine Datei - Einfache Integration - Übersetzung zur Laufzeit möglich - Unterstützt WeifeLuo (Aktuelle Version:){darkblue} DLL: (1.1.0.0 ::: GUI: (1.1.0.0 ::: **Arbeitsliste:** - Automatisierung zum erstellen der ersten Übersetzung - Erstellen eine import / export Funktion für externe Übersetzungsbüros **XML:** Die Übersetzungen werden in einer XML-Datei gespeichert. ++Der Dateiname der Übersetzungsdatei muss wie folgt aufgebaut sein:++ <Assemblyname>.<CultureInfo>.xml. Beispiel: Translator.exe, Translator.de-DE.xml. Der eigentliche Dateiaufbau ist recht simpel gestaltet:

<Translation>
  <GUI>
    <Translation name="mnuFile">
      <Value>&amp;File</Value>
      <Description>Menupoint File.</Description>
    </Translation>
  </GUI>
</Translation>

Die XML-Datei hat drei unterschiedliche Kategorien: GUI für die Oberfläche, Message für Nachrichten, Code für Quellcode-Übersetzungen. Jeder einzelne Eintrag hat den key, also den Namen des Controls, in einem XMLAttribute namens "name". Die eigentliche Übersetzung ist in zwei weitere Nodes aufgeteilt, Value und Description. Aus der Value wird der Text (bzw. TabText) eines Controls, aus der Description der ToolTip.

Editor:
Der Editor ist einfach, dafür aber leicht zu handeln. Man kann mit ihm neben den Standardfunktionen "Neu / Öffnen / Schließen / Speichern / Speichern unter" auch Sonderfunktionen aufrufen. Eine davon wäre "Referenz öffnen". Im Standard hat man fünf Spalten auf der Oberfläche: Schlüssel, Referenz Übersetzung, Übersetzung, Referenz Beschreibung und Beschreibung. Mit "Referenz öffnen" kann man sich die Übersetzung von einer bereits vorhandenen einblenden lassen.

Eine weitere Sonderfunktion ist "Aktualisieren". Anhand einer anderen Übersetzungsdatei können so fehlende Übersetzungen (z. B. neu hinzugekommene Controls) in die gerade geöffnete übernommen werden.

Quellcode:

  • Es muss zuerst ein Verweis auf die Datei "TranslatorDLL.dll" gesetzt werden.
  • In der entsprechenden Datei muss ein "Imports Translator;" eingebaut werden.

Eine zu übersetzende Form leitet man von "frmTranslatedForm" bzw. "frmTranslatedDockContent" ab.

Für ein initiales Übersetzen der Form muss this.InitializeTranslations aufgerufen werden. Beim ändern der Übersetzung zur Laufzeit muss wiederum InitializeTranslations sowie clsTranslator.SetTranslationForControls(this) aufgerufen werden.

Übersetzungen für Messageboxen und Code können über "clsTranslator.GetMessage" bzw. "clsTranslator.GetCodeText" und danach jeweils den entsprechenden Key geladen werden.

Anbei sind die binären Dateien. Weiter unten könnt ihr eine beispielhafte Implementierung dazu finden.

Wenns sonstige Fragen oder Diskussion gibt, könnt ihr mich auch gerne unter Stefan-Aigner@web.de erreichen...

Update 1: (Mai 09) Rechtschreibfehler + Überschrift korrigiert
Update 2: (Mai 09) Hinweis zum Dateinamen hinzugefügt.
Update 3: (Mai 09) Neue Version 1.0.1.0 veröffentlicht.
Update 4: (Jun 09) Arbeitsliste eingefügt.
Update 5: (Jun 09) Versionen aktualisiert, Neuen Todo-Punkt eingetragen.
Update 6: (Sep 09) Versionen aktualisiert, Dateiaufbau + Editor überarbeitet, Datum zu der Updatelist hinzugefügt.
Update 7: (Okt 09) Arbeitsliste aktualisiert.
Update 8: (Jun 12) Veraltete Links entfernt, Text angepasst, Beispielimplementierung angehängt.

E
Easyrider Themenstarter:in
200 Beiträge seit 2006
vor 14 Jahren

Hier nochmal ein Screenshot des Editors:

76 Beiträge seit 2007
vor 14 Jahren

Hab mir dein Tool grade mal angesehen. Gefällt mir echt gut 😮

Die einzige Frage die ich mir gestellt habe ist, wie das ganze Lizenzmäßig aussieht?
Wäre nett wenn du ein/zwei Worte dazu schreiben könntest.

Ansonsten noch mal: Gute Arbeit 😃

E
Easyrider Themenstarter:in
200 Beiträge seit 2006
vor 14 Jahren

Hallo Zony,

solche Antworten gefallen mir, dankeschön.

Zu den Lizenzen: Die Software besitzt derzeit keine Hinweise auf irgendwelche Lizenzen, das habe ich leider übersehen. Das Projekt war bis jetzt nur ein "Nebenprodukt" meines anderen Projekts "Teams and Tactics". In Zukunft wird der Translator unter der GNU (General Public License) stehen. Du kannst also damit machen was du willst.

Auch habe ich schon weitere Funktionen in meiner Aufgabenliste, die ich umsetzen werde:

  • farbiges Hervorheben von fehlenden Übersetzungen.
  • Eine Funktion, eine bestehende Übersetzung anhand einer Referenz zu "aktualisieren" (alle fehlenden Einträge werden neu erstellt, vor allem für Updates bequem).

Wenn jemand noch Vorschläge oder Ideen hat, nur her damit.

76 Beiträge seit 2007
vor 14 Jahren

Freut mich zu hören. Wollte es eventuell in ein paar (geplanten) Freeware Projekten einsetzen.

Werde das ganze jetzt mal ausführlich testen.
Die noch geplanten Features finde ich persönlich auch sinnvoll.
Sollte mir noch was auffallen melde ich mich bei dir 😃

E
Easyrider Themenstarter:in
200 Beiträge seit 2006
vor 14 Jahren

Hallo,

hatte heute ein wenig Zeit, an dem Tool weiter zu arbeiten. Folgende Punkte sind gemacht worden:

  • Neu: Fehlende Übersetzungen werden nun mit einem leichten Rot hervorgehoben.
  • Neu: Es ist jetzt möglich, eine Übersetzung zu aktualisieren. Dazu muss eine (alte) Übersetzung geladen werden, dann klickt auf in Datei -> Aktualisieren... und gibt die (aktuellere) Übersetzung an. Das Programm merged automatisch die fehlenden Schlüssel ein und hinterlegt sie rot.
  • Fixed: Eine fehlende Übersetzung wurde korrigiert.

Dann ist mir noch die Idee mit einer Suche eingefallen. Bis jetzt ist es etwas schwer, bestimmte Übersetzungen zu finden. Mit einer kleinen Suche würde das leichter gehen. Habs mal in die Feature-Liste mit aufgenommen.

76 Beiträge seit 2007
vor 14 Jahren

Hi Easyrider,

hab das ganze jetzt schon mal in ein neues Projekt von mir eingebunden.
Was mir jetzt aufgefallen ist:

Ich habe mein Form von deinem frmTranslatedForm abgeleitet und der Inhalt wird auch übersetzt. Das einzige was nicht übersetzt wird ist der Text eines Buttons in einem ToolStrip. Hast du das schon mal getestet oder hast du eventuell einen Tipp für mich?

Danke schon mal

E
Easyrider Themenstarter:in
200 Beiträge seit 2006
vor 14 Jahren

Hallo Zony,

hab das ganze gerade mal in einem kleinen Testprojekt ausprobiert. Das Übersetzen des Tool-Strip-Buttons ging bei mir. Hier kannst du dir auch mein Beispielprojekt (VS 2008) downloaden.

Überprüf doch bitte noch mal die Namen des Controls bzw. den Key in den Übersetzungsdateien, vielleicht hast du einen Rechtschreibfehler, Zahlendreher oder unsichtbare Zeichen drin. Ist mir schon des öfteren passiert...

Was mir aufgefallen ist: Ein Label in einem ToolStrip wird nicht übersetzt. Hab das mal auf meine Bugliste im Mantis geschrieben.

mfg

Stefan

76 Beiträge seit 2007
vor 14 Jahren

Hallo,

ich muss mich noch ein mal korrigieren. Die Buttontexte werden übersetzt das ist richtig. Was ich allerdings in meinem vorherigen Post eigentlich meinte ist das DropDownItem in einem ToolStrip. Hatte ich bei einem schnellen Blick in mein Projekt vor dem Post übersehen.

Hab es jetzt auch mal in deinem Testprojekt eingebaut und auch hier hat es bei mir nicht funktioniert. Eventuell kannst du es ja auch noch mal testen.

Viele Grüße

E
Easyrider Themenstarter:in
200 Beiträge seit 2006
vor 14 Jahren

Hallo Zony,

diesen Fehler habe ich heute Abend auch bemerkt, als ich deine Button-Geschichte getestet habe. Komisch das es mir bis jetzt noch nicht aufgefallen ist.

Hab den Fehler gefunden und auch gleich gefixt, da ich dieselben Probleme in einem anderen Projekt von mir hatte. Ab der Version 1.0.2.0 funktionieren auch ToolStripDropDownButtons sowie ToolStripSplitButtons. Hab das ganze mit Untermenüpunkten getestet, das geht auch soweit. Die Dateien findest du an gewohnter Stelle.

Um ein zuspamen dieses Threads zu vermeiden, bitte ich euch zukünftige Fehler / Kritik / Featurewünsche über das Bugtracking-Tool Mantis (siehe erster Post) zu melden. Das erhöht die Übersichtlichkeit dieses Threads und gibt mir mehr Möglichkeiten bei der Kontrolle der offenen Punkte.

mfg

Stefan

E
Easyrider Themenstarter:in
200 Beiträge seit 2006
vor 14 Jahren

Servus,

hatte gerade ein wenig Wartezeit, und da hab ich mir gedacht ich übersetze meinen Translator mal ins Niederbayrische:

Unter teamsandtactics.de/downloads findet ihr die Datei "Translator.de-AT.xml". Diese müsst ihr downloaden und ins Anwendungsverzeichnis unter "C:\Programme\Translator\Translations&quot; kopieren. Dann die Anwendung neustarten, voila.

Das ganze ist ein nicht allzu ernst gemeinter Versuch, ich hoffe der eine oder andere freut sich daran.

mfg

Easy

P.S.: Das de-AT.xml im Namen wurde nur benutzt, um eine gültige CultureInfo bekommen zu können. Es soll keine Anspielung oder sonstiges in Richtung Österreich sein! de-DE.xml war halt schonmal vergeben...

M
11 Beiträge seit 2009
vor 14 Jahren

Sehr gut das Programm
Gute Arbeit....

Viele Grüße

C
401 Beiträge seit 2007
vor 14 Jahren

Kann das gerade leider nicht testen, ist aber ne tolle Sache. Kenne das schon von Qt, da gibt es so ziemlich das gleiche und da gefiel mir das schon. Werde ich bei Gelegenheit mal benutzen.

D
91 Beiträge seit 2005
vor 14 Jahren

Hallo Easyrider!

Ich finde dein Programm ganz nützlich. Danke, dass du es zur Verfügung stellst.
Einen Hinweis hätte ich noch:
Es wäre "besser", die XML-Struktur wie folgt aufzubauen (siehe Vergleich unten).
Damit erleichterst eine programmatische Verarbeitung, die bspw. auf xsd basiert.
In deiner Implementierung gibst du den Unterknoten, die die Übersetzung enthalten, einen Namen; besser wäre jedoch, wenn diese vom gleichen Typ wären und den Key als Attribut des XML-Elements enthalten würden.


<Translation>
  <GUI>
    <mnuFile>
      <Value>&Datei</Value> 
      <Description>Menüpunkt Datei.</Description> 
    </mnuFile>
  </GUI>
</Translation>


<Translation>
  <GUI>
    <guiTranslation key="mnuFile">
      <Value>&Datei</Value> 
      <Description>Menüpunkt Datei.</Description> 
    </mnuFile>
  </GUI>
</Translation>

Interessant wäre hierzu für dich vielleicht linq2xsd. Damit kann man ein xsd-Schema zu einem .net-Projekt hinzufügen und erhält nach einmaligem Kompilieren eine Objektstruktur, die auf diesem Schema basiert.
Man kann XML-Dateien einlesen, neue erstellen etc. alles auf Basis der Objektstruktur. Ist also vergleichbar mit einem OR-Mapper.

Viele Grüße,
Florian

E
Easyrider Themenstarter:in
200 Beiträge seit 2006
vor 14 Jahren

Hallo deerhunter,

dein Hinweis wurde aufgenommen und wird in der nächsten Version auch so umgesetzt. Guter Tip 👍

In meinem Bugtracker findest du ein entsprechendes Ticket dazu:
0000034: Change XML structure to "better" xml.

Der Link zum linqtoxsd ist auch sehr interessant, das werde ich mir noch genauer anschauen. Sieht auf den ersten Blick zwar etwas "overweight" aus, aber mal gucken. Mir ist wichtig, das mein Tool schlank, einfach zu bedienen und leicht zu benutzen ist.

Als nächsten Release-Termin mit allen drei offenen Tickets plane ich Ende September. Es ist zwar nicht so viel Arbeit für dieses Tool, aber die normale Arbeit sowie andere private Projekte wollen auch noch gemacht werden. Und zusätzlich habe ich gerade Urlaub, was meinen Anreiz vor dem PC zu sitzen noch weiter minimiert. 😉

mfg

Easy

P.S.: Über weitere Verbesserungsvorschläge würde ich mich freuen!

E
Easyrider Themenstarter:in
200 Beiträge seit 2006
vor 14 Jahren

Hallo zusammen,

soeben habe ich die letzten Tests abgeschlossen und die aktuellen Dateien hochgeladen. Folgende Punkte wurden implementiert:

mfg

Easy

S
322 Beiträge seit 2007
vor 14 Jahren

Hallo Easyrider,

tolle Arbeit hast Du da geleistet. Ich habe bei mir in einem etwas größerem Projekt auch eine Mehrsprachigkeit drin, allerdings ganz simpel auf INI-Datei Basis.

Ich spiele nun mit dem Gedanken auf dein Tool umzusteigen und hätte da noch ein paar Fragen zu deinem Translator.

Wie geht man vor wenn man deinen Translator nun in ein bestehendes Projekt einbauen möchte? Ich meine, muss man die erste Sprachdatei manuell erstellen oder kann man es generieren lassen? D.h. dass dann die ControlNamen und texte einfach übernommen werden und daraus eine Sprachdatei erstellt wird!?

Was passiert den eigentlich wenn man nun zwei gleichnamige Controls hat in verschiedenen Forms? Die würden dann ja alle identisch übersetzt oder?

Kann Dein Translator auch mit "{0}" umgehen?
Beispielsweise wird folgendes in einer Messagebox angezeigt:
"Möchten Sie den Benutzer {0} wirklisch löschen?"
Der ganze string wird dann mit String.Format zusammengesetzt.

Wie geht dein Tool mit Umlauten und Sonderzeichen um?
Könnte man mit deinem Tool auch Chinesische oder Russische Sprache abdecken?

Gibt es vielleicht eine Import/Export Funktion damit man die Sprachdatei ganz simpel als Text abspeichern kann (damit das Übersetzungsbüro es leichter hat)?

Ich danke dir für deine Mühe 😃

Viele Grüße
Steffen

E
Easyrider Themenstarter:in
200 Beiträge seit 2006
vor 14 Jahren

Hallo Steffen,

erstmal danke für das Lob, sowas hört man gerne.

Automatisierungsfunktion
Also deine Idee für eine Automatisierungsfunktion zum erstellen der ersten Übersetzungsdatei gefällt mir. Hab dazu gleich mal ein Ticket erstellt und für die nächste Version zugewiesen.
0000035: Extend GUI for automatic creating the first translation file

Übersetzung von gleichnamigen Controls
Ja, bis jetzt werden diese gleich übersetzt. Hab schon mit dem Gedanken gespielt, eine eigene Spalte für den vollen Namespace oder den Namen des Forms / Controls mit anzugeben. Wäre zwar möglich, sieht aber dann auf der Oberfläche wieder etwas "overweight" aus. Wenn zwingend benötigt könnte man sowas aber innerhalb von einem Manntag implementieren. Aber in ca. 90% der Fälle (persönlicher Erfahrungswert) ist es sowieso erwünscht, das die Controls den gleichen übersetzten Text haben. Das erspart viel Arbeit.

Kann Dein Translator auch mit "{0}" umgehen?
Jup, kann er. Derzeit keine Probleme bekannt.

Wie geht dein Tool mit Umlauten und Sonderzeichen um?
(Russisch, Chinesisch)

Das weiß ich leider noch nicht. Mein Tool wird zwar gerade ins Russische übersetzt, aber ich hab diese Datei noch nicht gesehen. Und bei Chinesisch tu ich mich leider noch härter, wenn man sowas nicht spricht und nicht mal schreiben kann.

An diesem Punkt würde ich mich sehr über die Mithilfe der Community freuen. Wenn jemand eine kurze Übersetzung auf Chinesisch machen kann respektive auf Chinesisch testen könnte, wäre das super!

Import / Export Funktion
Derzeit gibt es noch keine Import- / Export-Möglichkeit. Für solche externen Übersetzungen macht das ganze aber Sinn. Was wäre den hier benötigt? Excel? Access-MDB? Hab dafür gleich mal ein Ticket erstellt: 0000036: Create an import / export function

Sind schon mal zwei super Vorschläge, die mir gefallen. Jetzt kommts drauf an, was ihr brauchen würdet bzw. wie eure Vorstellungen davon sind. Hab für dieses Jahr immer noch 30 Tage Urlaub, somit wäre eine eingermaßen "Zeitnahe" implementierung auch möglich 😉.

mfg

Easy

P.S.: Welche der Punkte sind für euch die wichtigsten, damit ihr dieses Tool benutzen würdet?

E
Easyrider Themenstarter:in
200 Beiträge seit 2006
vor 14 Jahren

Hallo Steffen,

hab soeben die russische Übersetzung bekommen. Sieht recht gut aus. Du kannst Sie dir hier downloaden.

Um das Chinesisch zu testen bräuchte ich jemanden, der es mir übersetzt.

mfg

Stefan

*edit: Dummes Rechtschreibfehler weggewischt.

E
Easyrider Themenstarter:in
200 Beiträge seit 2006
vor 11 Jahren

Beispielprojekt siehe Anhang