# Traduction de la doc de Python et i18n ### J. Palard et C. Revillet # L'internationalisa- ### tion :( ## i18n :) ## [Citation du W3C](https://www.w3.org/International/questions/qa-i18n) > “Internationalization is the design and development of a product, application or document content that enables easy localization for target audiences that vary in culture, region, or language. ## [Citation du W3C](https://www.w3.org/International/questions/qa-i18n) > Localization refers to the adaptation of a product, application or document content to meet the language, cultural and other requirements of a specific target market (a locale).” ## Localisation La localisation ne concerne pas que la traduction, mais toutes les spécificités régionales, culturelles, telles que la monnaie, la disposition clavier, les symboles, icones, couleurs, formats numériques, formats de dates, ordre des caractères, lois, … ## i18n vs l10n - i18n : Rendre possible la traduction dans n’importe quelle langue - l10n : Ajouter une langue Notes: C'est de la préparation (~une fois pour toute), donner l'exemple de la traduction de la doc: la partie i18n à été faite par sphinx-doc, la l10n c'est nous. ## POSIX locale database https://docs.python.org/3/library/locale.html ## POSIX locale database Extrait de `/usr/share/i18n/locales/fr_FR` : ``` LC_MONETARY int_curr_symbol "" currency_symbol "" mon_decimal_point "" mon_thousands_sep "" mon_grouping 3 positive_sign "" negative_sign "" int_frac_digits 2 ``` ## POSIX locale database Liste des sections : - LC_CTYPE - LC_COLLATE - LC_MESSAGES - LC_MONETARY - LC_NUMERIC - LC_TIME - LC_ADDRESS - … ## POSIX locale database La traduction est une petite partie de l'internationalisation, définit par POSIX pour donner des idées de "qu'est-ce qu'on couvre quand on localise". Culture / Coutume. ## POSIX locale database Tout est documenté ! ``` man 5 locale ``` ## POSIX locale database ``` dpkg-reconfigure locales ``` ## POSIX locale database ```pycon >>> locale.setlocale(locale.LC_ALL, 'fr_FR.utf-8') 'fr_FR.utf-8' >>> datetime.datetime.now().strftime("%c") 'mer. 13 juil. 2016 00:36:05 ' ``` ## POSIX locale database ```pycon >>> locale.setlocale(locale.LC_ALL, 'en_US.utf-8') 'en_US.utf-8' >>> datetime.datetime.now().strftime("%c") 'Wed 13 Jul 2016 12:36:42 AM ' ``` # La traduction ![](static/2016-translation.png) (Image de http://www.sphinx-doc.org/en/stable/intl.html) ## Préparation (i18n) Marquer les chaînes : - Python ``` print(_('This is a translatable string.')) ``` - Jinja2 ```

{% trans %}Parts of the documentation:{% endtrans %}

``` - … ## Générer le `.po` - gettext - pybabel extract - django-admin.py makemessages - sphinx-build -b gettext - … ## fichier `.pot` ```po #: ../Doc/tutorial/appendix.rst:11 msgid "Interactive Mode" msgstr "" #: ../Doc/tutorial/appendix.rst:16 msgid "Error Handling" msgstr "" ``` ## Traduire ou faire traduire - poedit - transifex.com - Vé (Android) - gted - gtranslator - lokalize - betterpoeditor - … ## fichier `.po` traduit ``` #: ../Doc/tutorial/appendix.rst:11 msgid "Interactive Mode" msgstr "Mode interactif" #: ../Doc/tutorial/appendix.rst:16 msgid "Error Handling" msgstr "Gestion des erreurs" ``` ## Compiler le `.po` en `.mo` - msgfmt - django-admin compilemessages - … Notes: - le _ est une convention: (gettext, django.utils.translation.urgettext as _, ...) - `po` pour `portable object` - `mo` pour `machine object` ## gettext https://docs.python.org/3/library/gettext.html - from gettext import gettext as _ - ngettext - pgettext ? - … Notes: pgettext: Permet de donner du contexte à une traduction (Voir https://bugs.python.org/issue2504) Basiquement, le genre, l'emplacement (menu, ...), ou n'importe quel autre désambiguation, typiquement "date" pouvant être un fruit ou calendaire, un contexte est necessaire, car ces deux mots peuvent être différents dans d'autres langues. # potpie potpie génère des traductions de test, utiles pour trouver les appels manquants à gettext. ``` $ pip install potpie ``` ``` $ potpie --type unicode 3.5/tutorial.po potpie/tutorial.po ``` ``` #: ../Doc/tutorial/appendix.rst:5 msgid "Appendix" msgstr "Ȧƥƥḗƞḓīẋ" #: ../Doc/tutorial/appendix.rst:16 msgid "Error Handling" msgstr "Ḗřřǿř Ħȧƞḓŀīƞɠ" ``` # Formatage des chaînes ``` _("Hello {name}").format() ``` ou ``` _("Hello {name}".format()) ``` > EN : "Hello Guido" > FR : "Bonjour Guido" ## Formatage des chaînes ``` _("{} likes {}") ``` ou ``` _("{0} likes {1}") ``` > EN : "Guido likes Python" > FR : "Guido aime Python" ## Formatage des chaînes ``` _("Today is {0} {1}") ``` ou ``` _("Today is {month} {day}") ``` > EN : "Today is October 16" > FR : "Aujourd'hui c'est le 16 Octobre" ## Formatage des chaînes ``` _("That is a ") + car.color + $(" car") ``` > EN : "That is a blue car" > FR : "C'est une bleu voiture" # Faire, ne pas faire > Donner une chaîne formattée à gettext Pas bien: ``` _("Hello {name}".format()) ``` Bien: ``` _("Hello {name}").format() ``` ## Faire, ne pas faire > Penser que le pluriel se gère pareil dans toutes les langues Pas bien: ``` print(_("{} file{} deleted").format(n, "s" if n > 1 else "")) ``` Bien: ``` print(ngettext("{nb} file removed", "{nb} files removed", n).format(n)) ``` ## Faire, ne pas faire > Penser que les traducteurs pourront toujours mettre les mots dans le même ordre Pas bien: ``` print(_("%s %s %s").format( user_login, gettext("likes"), fav_ingredient)); ``` Bien: ``` print(_("{username} likes {ingredent}").format( user_login, fav_ingredient)); ``` # docs.python.org/fr Autres projets de traduction: - http://docs.python.jp/3/ - http://docs.python.org.ar/tutorial/3/real-index.html La doc de Python utilise `sphinx-doc`. ## Historique du projet - Projet né en 2012 (ou avant ?) - 2013, 2014 : au point mort - Fin 2015 : Projet relancé - 2016 : On avance pour pousser la traduction sur docs.python.org/fr/ http://bugs.python.org/issue26546 ## Pourquoi ![](static/2016-helping.jpg) ## Pourquoi - Je m'ennuie dans le RER, alors je traduis… - C'est un outil d'évangélisation - La langue ne devrait pas être un frein pour apprendre le Python, peu importe l'age et le niveau de scolarisation - Il n'y a aucune raison à ce que l'anglais soit un prérequis de Python, au contraire, Python pourrait être un moyen de se familiariser avec l'anglais - Apprendre deux langues en même temps, c'est un peu trop meta. ## Github https://github.com/AFPy/python_doc_fr/ ![](static/2016-python_doc_fr_github.png) ## Progression - 2016-01: 6% - 2016-02: 11% - 2016-03: 14% - 2016-04: 22% - 2016-05: 23% - 2016-06: Tentative de merge avec docs.python.org 12 contributeurs depuis 2012 ## Github Progression ![](static/2016-progression_100.png) ## Github Progression ![](static/2016-progression.png) ## Comment on fait ```bash $ git clone https://github.com/AFPy/python_doc_fr.git ``` … ```bash $ poedit 3.5/library.po ``` … ```bash $ make ``` ## Comment on fait ![](static/2016-pyfr.png) ## docs.python.org/fr/ En progrès: - https://github.com/python/docsbuild-scripts/pull/1 - http://bugs.python.org/issue26546 ## Et après ? - https://docs.python.org/jp/ - https://docs.python.org/es/ ## Et après ? Travailler sur quelques améliorations de sphinx-doc comme "Highlight untranslated paragraphs" : https://github.com/sphinx-doc/sphinx/issues/1246 # Questions ?