diff --git a/2016-pyconfr-i18n.md b/2016-pyconfr-i18n.md new file mode 100644 index 0000000..de6eb47 --- /dev/null +++ b/2016-pyconfr-i18n.md @@ -0,0 +1,384 @@ +# 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 ? diff --git a/static/2016-helping.jpg b/static/2016-helping.jpg new file mode 100644 index 0000000..bf3d9ad Binary files /dev/null and b/static/2016-helping.jpg differ diff --git a/static/2016-progression.png b/static/2016-progression.png new file mode 100644 index 0000000..657defe Binary files /dev/null and b/static/2016-progression.png differ diff --git a/static/2016-progression_100.png b/static/2016-progression_100.png new file mode 100644 index 0000000..a9bb418 Binary files /dev/null and b/static/2016-progression_100.png differ diff --git a/static/2016-pyfr.png b/static/2016-pyfr.png new file mode 100644 index 0000000..5f785f5 Binary files /dev/null and b/static/2016-pyfr.png differ diff --git a/static/2016-python_doc_fr_github.png b/static/2016-python_doc_fr_github.png new file mode 100644 index 0000000..dc2c0b9 Binary files /dev/null and b/static/2016-python_doc_fr_github.png differ diff --git a/static/2016-translation.png b/static/2016-translation.png new file mode 100644 index 0000000..347e287 Binary files /dev/null and b/static/2016-translation.png differ