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 :




 * La macro ne fait rien, mais elle marque les textes qui seront repris plus tard par l'utilitaire . Comme elle ne fait rien, nous ne l'utilisons que dans des cas particuliers où FreeCAD s'occupe lui-même de tout.
 * Ajoutez le chemin vers votre dossier dans la fonction Initialized :




 * Le fichier n'a pas d'attribut file, il n'est donc pas facile de trouver l'emplacement relatif du dossier des traductions. Une façon simple de contourner ce problème est de faire en sorte qu'il importe un autre fichier du même dossier, et de faire dans ce fichier :



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

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




 * Traduire les et  de la commande comme ceci :




 * 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 distributions Linux, ils sont généralement fournis dans des paquets nommés  ou . Sur certains systèmes,  est nommé  ou  ou  ou similaire. Idem pour les autres outils. Vous pouvez utiliser la version Qt4 ou Qt5 à votre choix.
 * Si vous avez des fichiers, vous devez d'abord exécuter :




 * Cette méthode est récursive et trouvera les fichiers dans toute la structure de votre répertoire.


 * Si vous avez des fichiers, vous devez aussi exécuter :




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




 * Vérifiez le contenu des trois fichiers pour vous assurer qu'ils contiennent les chaînes de caractères, puis vous pouvez supprimer  et.
 * Vous pouvez faire tout cela dans un script bash comme celui-ci :



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 créer votre 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 vers une langue que vous avez traduite (par exemple l'Allemand)
 * 2) Chargez la traduction dans FreeCAD, par exemple
 * 3) Tester quelque chose, par exemple

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

Détails techniques et utilisation avancée
Dans les exemples ci-dessus, deux fonctions distinctes sont utilisées : et. Vous pouvez également rencontrer et, qui fournissent automatiquement l'argument "context" en fonction de l'emplacement de l'appel. Ces deux paires de fonctions sont fondamentalement différentes.

et accomplissent deux tâches distinctes : au moment de l'exécution, elles effectuent la traduction réelle de la chaîne qui leur est passée en chaîne traduite finale. Ceci est vrai qu'on leur fournisse une chaîne littérale, une variable ou une constante : la recherche est dynamique et en temps réel pendant l'exécution du code. Toutefois, elles fournissent une fonction supplémentaire hors temps d'exécution : elles sont reconnues par l'utilitaire. Si (et seulement si) elles contiennent une chaîne de caractères littérale, cette chaîne est extraite par l'utilitaire. SEULS les chaînes de caractères sont extraites par. Si une variable est passée, elle est ignorée par l'utilitaire. Qt essaiera de fournir une traduction au moment de l'exécution, mais cela ne fonctionnera que si un autre morceau de code a appelé une des fonctions de traduction avec la chaîne littérale qui doit être traduite, afin que puisse l'extraire. Notez que le code contenant la chaîne littérale ne doit jamais être exécuté, il doit simplement exister en tant que ligne de code dans un fichier quelque part : n'effectue aucune analyse ou exécution de code, il effectue simplement une recherche et une extraction de chaîne.

En revanche, et  ne font rien du tout à l'exécution : ce sont des "no-ops" littérales et sont complètement ignorées par le code en cours d'exécution. Leur seule utilité est de marquer une chaîne littérale pour qu'elle soit extraite par : il est inutile de placer une variable dans un appel à l'une de ces fonctions, cela n'aura aucun effet. Elles sont utilisées dans les cas où ou  seront appelées avec une variable contenant le texte à traduire. Par exemple, tout code utilisé pour créer une commande ou une propriété utilisera une fonction de type NOOP autour du texte ou de l'info-bulle du menu de la commande, ou de la docstring de la propriété : à l'exécution, lorsque FreeCAD affiche ces éléments à l'utilisateur, il appelle : les chaînes littérales doivent avoir été extraites par  au moment de la création, par exemple :

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.