Translating an external workbench/de

In den folgenden Hinweisen sollte der Name Deiner Erweiterung oder Deines Arbeitsbereichs sein, z.B.  oder, oder was auch immer. Dieser Kontext macht es so, dass die gesamte Übersetzung deines Codes unter dem gleichen Namen zusammengefasst wird, um von den Übersetzern leichter identifiziert werden zu können. Das heißt, sie wissen genau, zu welcher Erweiterung oder welchem Arbeitsbereich eine bestimmte Zeichenkette gehört.

Hinweis: Hier ist ein Multifunktionsskript, das den kompletten unten beschriebenen Ablauf automatisiert (es wird angeraten, dass du trotzdem die Beschreibung liest, um zu wissen, was das Skrikt sollte): https://github.com/yorikvanhavre/BIM_Workbench/blob/master/utils/updateTranslations.py

Allgemeines

 * Füge einen Ordner hinzu. Du kannst es nach etwas anderem benennen, aber das wird einfacher sein, da es in FreeCAD gleich ist. In diesem Ordner werden die Dateien  (die "Quell" Übersetzungsdateien) und  Dateien (kompilierte Übersetzungsdateien) abgelegt.
 * Es sollte nur der Text übersetzt werden, der dem Benutzer in der FreeCAD Benutzeroberfläche angezeigt wird. Text, der nur in der Python Konsole angezeigt wird, sollte nicht übersetzt werden.
 * Text, der auf die gedruckt wird, wird in der "Reportansicht" angezeigt und sollte daher übersetzt werden. Die "Reportansicht" unterscheidet sich von der Python Konsole.

In jeder Python .py-Datei

 * In jeder Datei, in der Du Text übersetzen musst, musst Du eine Funktion definieren. Eine einfache Möglichkeit ist die Verwendung derjenigen aus dem Entwurf Arbeitsbereich:

Ab FreeCAD 0.19 definiert das FreeCAD-Modul auch eine translate-Funktion, es ist am besten, diese zu verwenden:


 * Alle zu übersetzenden Texte müssen über die Funktion übergeben werden.

wird zu




 * All text that must be translated must be passed through the function:




 * becomes:




 * Be aware that is not just a normal function: it also serves as a "tag" for the  text-processing utility, so must be named exactly "translate". The  program is a simple text processor, it does not execute your code. You must pass string literals directly to the  function: you cannot pass variables, constants, etc. For example:



Dies kann überall verwendet werden: in, in }, in Qt Dialogen, etc. Die Funktionen fügen das Zeilenumbruchzeichen  nicht automatisch hinzu, so dass dieses bei Bedarf am Ende hinzugefügt werden muss. Dieses Zeichen benötigt auch keine Übersetzung, so dass es außerhalb der Übersetzungsfunktion liegen kann: code code Verwende in diesem speziellen Fall nicht Deine eigenen. Behalte.
 * Wenn Du Dateien verwendest, die mit dem QtDesigner erstellt wurden, muss nichts Besonderes mit ihnen gemacht werden.
 * Beim Erstellen neuer Objekte darf der "Name" des Objekts nicht übersetzt werden. Übersetze vielmehr die "Beschriftung" des Objekts. Der Unterschied besteht darin, dass ein "Name" einzigartig ist; er bleibt über die gesamte Lebensdauer des Objekts gleich; andererseits kann eine "Beschriftung" vom Benutzer beliebig geändert werden.
 * Wenn Sie Eigenschaften für deine Objekte erstellst, übersetze den Eigenschaftsnamen nicht. Aber platziere die Beschreibung in :
 * Übersetze nicht den Text von Dokumenttransaktionen, die mit durchgeführt wurden.{




 * If you are using files made with QtDesigner, nothing special needs to be done with them.
 * When creating new objects, do not translate the object's "Name". Rather, translate the object's "Label". The difference is that a "Name" is unique; it stays the same throughout the life of the object; on the other hand, a "Label" can be changed by the user as desired.
 * When creating properties for your objects, don't translate the property name. But place the description inside :




 * Don't use your own in this specific case. Keep.


 * Do not translate the text of document transactions made with

In InitGui.py
code code code Die Datei hat kein Attribut file', so dass es nicht einfach ist, die relative Position des Übersetzungsordners zu finden. Eine einfache Möglichkeit, dies zu umgehen, besteht darin, dass es eine andere Datei aus dem gleichen Ordner importiert und in dieser Datei Folgendes tut {{{Code|code|code= FreeCADGui.addLanguagePath(os.path.join(os.path.dirname(((__file__), "translations"))) }}
 * Füge die folgende Zeile hinzu, die sich am Anfang der Datei befindet:
 * Um Menünamen zu übersetzen:
 * Das Makro macht nichts, aber es markiert Texte, die später vom Dienstprogramm } aufgenommen werden. Da es eigentlich nichts bewirkt, verwenden wir es nur in Sonderfällen, in denen FreeCAD sich selbst um alles kümmert.
 * Füge den Pfad zu deinem Ordner in der Funktion Initialized hinzu:




 * To translate menu names:




 * The macro doesn't do anything, but it marks texts to be picked up by the  utility later on. Since it doesn't actually do anything, we only use it in special cases where FreeCAD itself takes care of everything.
 * Add the path to your folder in the Initialized function:




 * The file has no file attribute, so it is not easy to find the translations folder's relative location. An easy way to work around this is to make it import another file from the same folder, and in that file do:



Innerhalb jeder FreeCAD-Befehlsklasse
code
 * Füge die folgende Zeile hinzu, die sich am Anfang der Datei befindet:
 * Übersetze den und  des Befehls wie folgt:




 * Translate the and  of the command like this:



wobei der Name des Befehls ist, definiert durch code



Sammle alle Zeichenketten von deinem Modul
code Dies ist rekursiv und findet Dateien in deiner gesamten Verzeichnisstruktur. code code
 * Du benötigst die, , und  Werkzeuge auf Deinem System. In Linux Distributionen gibt es sie in der Regel in Paketen mit den Namen  oder . Auf einigen Systemen wird   oder  oder  oder ähnlich genannt. Das Gleiche gilt für die anderen Werkzeuge. Du kannst die Qt4- oder Qt5 Version nach Wahl verwenden.
 * Wenn du Dateien hast, musst du sie zuerst  ausführen:
 * Wenn du Dateien hast, musst du sie auch  ausführen:
 * Wenn Du beide Operationen ausgeführt hast, musst Du nun diese beiden Dateien zu einer einzigen vereinheitlichen:
 * Überprüfe den Inhalt der drei Dateien, um sicherzustellen, dass sie die Zeichenketten enthalten, dann kannst Du sowohl  als auch  löschen.
 * Du kannst alles in einem Bash Skript wie diesem machen:




 * This is recursive and will find files inside your whole directory structure.


 * If you have files, you need to run  too:




 * If you ran both operations, you now need to unify these two files into one:




 * Check the contents of the three files to make sure that they contain the strings, then you can delete both  and.
 * You can do it all in one bash script like this:



Sende die .ts Datei an eine Übersetzungsplattform
Es ist an der Zeit, Deine Datei übersetzen zu lassen. Du kannst ein Konto auf einer öffentlichen Übersetzungsplattform wie Crowdin oder Transifex einrichten, oder Du kannst von unserem bestehenden FreeCAD-Addons-Konto bei Crowdin profitieren, das bereits viele Benutzer hat und somit die Chance hat, Deine Datei schnell und von Leuten, die FreeCAD kennen, übersetzen zu lassen.

Wenn Du Deine Datei auf dem FreeCAD Crowdin Konto unterbringen möchtest, wende Dich an Yorik im FreeCAD-Forum.

Einige Plattformen wie Crowdin können sich in GitHub integrieren und den gesamten Prozess von Punkt 2, 3 und 4 automatisch durchführen. Dazu kannst Du das FreeCAD Crowdin Konto nicht verwenden; Du musst Dein eigenes Konto einrichten.

Übersetzungen zusammenführen
Sobald deine Datei übersetzt wurde, wenn auch nur teilweise, kannst du die Übersetzungen von der Internetseite herunterladen:


 * Du wirst normalerweise eine Datei herunterladen, die eine  pro Sprache enthält.
 * Platziere alle übersetzten Dateien zusammen mit Deiner Basisdatei  im  Ordner.

Kompiliere die Übersetzungen
Führe nun das Programm auf jede Datei aus, die Du hast.

Du kannst den Prozess automatisieren.

Du solltest eine Datei für jede übersetzte  Datei finden. Die Dateien sind das, was von Qt und FreeCAD zur Laufzeit verwendet wird.

Das ist alles, was du brauchst. Beachte, dass bestimmte Teile Deines Arbeitsbereichs nicht sofort übersetzt werden können, wenn Du dich für einen Sprachenwechsel entscheidest. Wenn dies der Fall ist, musst Du FreeCAD neu starten, damit die neue Sprache wirksam wird.

Übersetzungen testen

 * 1) Wechsle in FreeCAD zu einer Sprache, in die du übersetzt hast (z.B. Deutsch)
 * 2) Lade die Übersetzung in FreeCAD, z.B.
 * 3) Teste etwas, z.B.

Ergebnis: Dies sollte die deutsche Übersetzung liefern. Wenn das funktioniert, ist die Basiseinstellung OK. Dann können wir etwas anderes ansehen. Bspw. sollten Befehlsnamen einen speziellen Kontext benutzen, das ist der in FreeCAD eingetragene Befehlsname.

Wichtige Anmerkungen

 * Stelle sicher, dass du einen *context* und *string* verwendest, der tatsächlich in der ts/qm-Datei vorhanden ist.

Convenience script
Yorik maintains a convenience script for the BIM workbench, that can gather, upload and download ts files. You can just copy and adapt that script for your workbench:

https://github.com/yorikvanhavre/BIM_Workbench/blob/master/utils/updateTranslations.py

Technical details and advanced usage
In the above examples there are two separate functions being used: and. You may also run across and, which automatically provide the "context" argument based on their calling location. These two pairs of functions are fundamentally different.

and accomplish two separate tasks: at runtime they perform the actual translation from the string passed into them to the final translated string. This is true whether they are provided a literal string, or a variable, or a constant: the lookup is dynamic and real-time during the run of the code. However, they provide an additional non-runtime function: they are recognized by the utility. If (and only if) they contain a string literal, that literal is extracted by the utility. ONLY string literals are extracted by -- if a variable is passed it is ignored by the  utility. Qt will attempt to provide a translation at runtime, but this will only work if some other piece of code called one of the translation functions with the literal string that needs to be translated, so that can extract it. Note that the code with the string literal need not actually ever execute, it must simply exist as a line of code in a file somewhere: performs no analysis or code execution, it is simply performing a string search and extraction.

In contrast, and  do nothing at all at runtime: they are literal "no-ops", and are completely ignored by running code. Their only use is to mark a literal string for extraction by : it never makes sense to place a variable within a call to one of these functions, it will have no effect. They are used in circumstances where or  will be called with a variable containing the text to translate. For example, any code that is used to create a Command or a Property will use a NOOP-type function around the command menu text or tooltip, or the property docstring: at runtime when FreeCAD displays these items to the user it calls : the literal strings must have been extracted by at the point of creation, for example:

In this usage, at runtime the dictionary returned by this function is literally:

There is no reference to any type of translation information. When FreeCAD actually displays this information to the user, the pseudo-code is:

In this case, cannot extract any string from the call to  because it refers to a variable. So ignores that call, but at runtime Qt searches for the string that's passed to it. As long as someplace in the code there is a call to one of the translation functions with a matching literal string (in this case, in the function), this translation call will succeed.

To verify that the expected strings are being extracted, you can manually run the command:

The file will contain the set of strings that are uploaded to CrowdIn for translation.

Wichtige Verweise

 * Warum und wie man Funktionen übersetzen sollte (forum thread)

Verwandte Seiten

 * Externe Arbeitsbereiche
 * Lokalisierung
 * Für weitere Informationen stelle deine Anfragen hier Übersetzen externer Arbeitsbereiche