Translating an external workbench/fr

Dans les notes suivantes, doit être le nom de votre addon ou de votre atelier, par exemple,  ou, etc. Ce contexte permet de regrouper toutes les traductions de votre code sous le même nom, afin qu'elles soient plus facilement identifiables par les traducteurs. C'est-à-dire qu'ils sauront exactement à quel addon ou atelier une chaîne particulière appartient.

Remarque : Voici un script tout-en-un qui automatise la procédure complète mentionnée ci-dessous (il est tout de même conseillé de lire la procédure pour savoir ce que le script doit faire) : https://github.com/yorikvanhavre/BIM_Workbench/blob/master/utils/updateTranslations.py.

Généralités

 * Ajouter un dossier . Vous pouvez le nommer autrement, mais ce sera plus facile car c'est la même chose dans FreeCAD. Dans ce dossier, vous placerez les fichiers (les fichiers de traduction "source") et les fichiers  (fichiers de traduction compilés).
 * Seul le texte affiché pour l'utilisateur dans l'interface de FreeCAD doit être traduit. Le texte affiché uniquement dans la console Python ne doit pas être traduit.
 * Le texte imprimé sur apparaît dans la "Vue Rapport" et doit donc être traduit. La "vue Rapport" est différente depuis la console Python.

Dans chaque fichier Python .py

 * Dans chaque fichier où vous devez traduire du texte, vous devez définir une fonction . Vous pouvez utiliser le nom entièrement qualifié de Qt, mais c'est un peu plus propre d'utiliser :




 * Tout le texte qui doit être traduit doit être passé par la fonction :




 * devient :




 * Sachez que n'est pas seulement une fonction normale : elle sert également de "balise" (tag) pour l'utilitaire de traitement de texte, et doit donc être nommée exactement "translate". Le programme  est un simple processeur de texte, il n'exécute pas votre code. Vous devez passer des chaînes de caractères directement à la fonction  : vous ne pouvez pas passer de variables, de constantes, etc. Par exemple :




 * Ceci peut être utilisé partout : dans, dans , dans les dialogues Qt, etc. Les fonctions n'ajoutent pas automatiquement le caractère de nouvelle ligne , qui doit donc être ajouté à la fin si vous le souhaitez. Ce caractère n'a pas besoin d'être traduit non plus, il peut donc se trouver en dehors de la fonction de traduction :




 * Si vous utilisez des fichiers réalisés avec QtDesigner, vous n'avez rien à faire de spécial avec eux.
 * Lorsque vous créez de nouveaux objets, ne traduisez pas le "Name" de l'objet. Traduisez plutôt le "Label" de l'objet. La différence est qu'un "Nom" est unique ; il reste le même pendant toute la durée de vie de l'objet ; en revanche, une "Étiquette" peut être modifiée par l'utilisateur comme il le souhaite.
 * Lorsque vous créez des propriétés pour vos objets, ne traduisez pas le nom de la propriété. Mais placez la description dans :




 * N'utilisez pas votre propre dans ce cas précis. Gardez.


 * Ne traduisez pas le texte des opérations sur les documents effectuées à l'aide de la fonction.

Dans InitGui.py

 * Ajouter la ligne suivante, près du début du fichier :




 * Pour traduire les noms des menus :




 * 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:



À l'intérieur de chaque classe de commande de FreeCAD

 * Ajoutez la ligne suivante, près du haut du fichier :
 * Traduisez les et  de la commande comme ceci :




 * Translate the and  of the command like this:



Où est le nom de la commande, défini par



Rassemblez toutes les chaînes de votre module

 * Vous aurez besoin des outils, , et  installés sur votre système. Dans les distribution Linux, ils viennent généralement avec des paquets nommés   ou . Sur certains systèmes  est nommé  ou  ou . Même chose pour les autres outils. Vous pouvez généralement utiliser la version qt4 ou qt5 à votre choix.
 * Si vous avez des fichiers, vous devez d’abord exécuter :

Ceci est récursif et trouvera des fichiers dans toute la structure de vos répertoires.
 * Si vous avez des fichiers, vous devez également exécuter :


 * Si vous avez exécuté les deux opérations, vous devez maintenant unifier ces deux fichiers en un :


 * Vérifiez le contenu des trois fichiers pour vous assurer qu'ils contiennent les chaînes, puis supprimez  et.
 * Vous pouvez tout faire dans un script bash comme ceci :




 * 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:



Envoyer le fichier .ts à une plateforme de traduction
Il est temps de faire traduire votre fichier. Vous pouvez choisir de créer un compte sur une plateforme de traduction publique telle que Crowdin ou Transifex, ou vous pouvez bénéficier de notre compte FreeCAD existant sur Crowdin, qui compte déjà de nombreux utilisateurs et qui a donc plus de chance de faire traduire votre fichier rapidement par des personnes connaissant FreeCAD.

Si vous souhaitez héberger votre fichier sur le compte FreeCAD Crowdin, contactez Yorik sur le forum FreeCAD.

certaines plates-formes comme Crowdin peuvent s'intégrer à GitHub et effectuer automatiquement tout le processus à partir des points 2, 3 et 4. Pour cela, vous ne pouvez pas utiliser le compte FreeCAD Crowdin ; vous devrez configurer vôtre propre compte.

Fusionner les traductions
Une fois que votre fichier a été traduit, même partiellement, vous pouvez télécharger les traductions à partir du site :


 * Vous téléchargerez généralement un fichier contenant un  par langue
 * Placez tous les fichiers traduits, ainsi que votre fichier  de base, dans le dossier

Compiler les traductions
Maintenant, lancez le programme sur chaque fichier que vous avez.

Vous pouvez automatiser le processus

Vous devriez trouver un fichier pour chaque fichier  traduit. Les fichiers sont ceux qui seront utilisés par Qt et FreeCAD au moment de l'exécution.

C'est tout ce dont vous avez besoin. Notez que certaines parties de votre atelier ne peuvent pas être traduites à la volée si vous décidez de changer de langue. Si tel est le cas, vous devrez redémarrer FreeCAD pour que la nouvelle langue prenne effet.

Tester les traductions

 * 1) Basculez FreeCAD dans une langue que vous avez traduite (ex. Allemand)
 * 2) Chargez la traduction dans FreeCAD, ex.
 * 3) Tester quelque chose, ex.

Résultat : Cela devrait vous donner la traduction allemande. Si cela fonctionne bien, alors la configuration de base est correcte. Alors nous pouvons regarder autre chose. Par exemple, les noms des commandes devraient toujours utiliser un contexte spécial qui est le nom de la commande telle qu'elle est enregistrée dans FreeCAD.

Remarques importantes

 * Assurez-vous que vous utilisez un *contexte* et une *chaîne* qui se trouvent réellement dans le fichier ts/qm bien sûr.

Script pratique
Yorik maintient un script pratique pour l'atelier BIM, qui peut rassembler, charger et télécharger des fichiers ts. Vous pouvez simplement copier et adapter ce script à votre atelier :

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.

Références importantes

 * Pourquoi et comment traduire les fonctions (fil de discussion)

Pages en relation

 * Ateliers externes
 * Localisation
 * Pour plus d'informations faites vos demandes ici sur le forum : Translating external workbenches.