Traduire une application n'est pas facile.
GetText est une solution efficace et robuste, souvent ignorée.
Ces slides datent un peu mais restent pertinents. J'y mentionne quelques casse-têtes récurrents : avant de choisir une solution d'I18N, vérifiez bien que vos alternatives gèrent ces cas.
2. $ finger abelar_s
http://www.linkedin.com/in/sylvainabelard
•• EPITA MTI 2008
Utilise Rails depuis sept.2006 (rails 1.0.?)
•• Ingénieur R&D à Faveod
Nous développons et vendons la technologie Faveod Designer
• Vous permet de construire des applications complexes plus vite à partir des spécifications
• Les applications sont plus rapides, sécurisées, et de meilleure qualité
3. Vue d’ensemble
GNU GetText: GetText’s Never Useless
•• Pourquoi ?
Parce que vous voudrez utiliser plusieurs langues un jour
• GetText est un standard UNIX bien connu et maîtrisé
•• Comment ?
Quelques horreurs de traducteurs
• Montre-moi du code !
•• Avec quoi ?
Quelques outils autour de GetText
• Alternatives
4. Rails I18N
Pourquoi sortir du standard Rails ?
•• Simple
Il y a toujours une valeur par défaut
• Pas de clés complexes à retenir
• Jamais de « no translation found »
• Jamais de traductions approximatives
5. Linguistique
C’est dur.
• Un mot, une traduction ?
•• Nombre, genre et cas grammatical
Le nombre a l’air simple : car/cars, mais child/children et person/people
• De nombreuses langues (surtout slaves) différencient singulier, duel et pluriel, parfois plus.
• Le genre est souvent masculin, féminin et neutre (et rarement intuitif)
• D’autres langues différencient animé et inanimé, homme, animal et chose, etc.
•• Conjugaison: personne, temps, mode, voix... aspect ?
... je crois qu’on ne va même pas essayer...
6. Que choisir ?
Michael Grosser - FastGetText !
• github.com/grosser/fast_gettext
•• Améliorations
3.5x plus vite et 560x moins de consommation mémoire
• thread safety
• simple, et namespace propre
•• Backends
fichiers .mo et .po
• .yml
• DB
• ... codez le vôtre
7. Setup
How to GetText part 1
•• PO/MO files
Ce sont des fichiers qui stockent clé et valeur
• Beaucoup d’outils disponibles, y compris un mode emacs
•• Choisir la locale
À chaque utilisation, choisir la locale (en Rails, par requête le plus souvent)
• Setup
GetText.locale = "fr"
init_gettext "my_app"
I18n.supported_locales = ["en", "fr", "de", "ar", "ru"]
# mieux : faites-le lui deviner en listant les fichiers
I18n.default_locale = "fr" # en par défaut
8. Usage
How to GetText part II
•• La fonction « underscore »
_("string")
•• Variables, à la printf
_("string with %s") % "arg"
• _("string with %s and %s") % ["arg1", "arg2"]
•• Variables nommées
_("Could not find this %{obj}") % {:obj => _("stuff")}
• Et maintenant, les cas difficiles
9. Astuces
How to GetText part III
•• Singulier / pluriel
n_("File not found!", "%{n} files not found!", n) % {:n => n}
• Et pour les pluriels irréguliers ?
"Plural-Forms: nplurals=2; plural=n == 1 ? 0 : 1;n"
• FastGettext.pluralisation_rule = lambda{|count|
count > 5 ? 1 : (count > 2 ? 0 : 2)}
•• Contexte
s_("File|Open") # ouvrir
• s_("Sports|Open") # open
• s_("Even|More|Contexts|Open") # traduit uniquement ‘open‘
• p_("even more bindinds", "for contexts", "open") # open
10. Fichiers PO
Les outils sont très bons pour ça.
•• Mise à jour du PO
rake updatepo
• Note les obsolètes, ajoute les nouvelles et propose une traduction (« fuzzy »)
• Modification du fichier
# translator comments
#. extracted comments
#: reference
#, flag
msgid "One file removed"
msgid_plural "%d files removed"
msgstr[0] "%d slika uklonjenih"
msgstr[1] "%d slika uklonjenih"
msgstr[2] "%d slika uklonjenih"
•• Mise à jour des traductions effectuées
rake makemo
11. Questions?
On embauche, mais c’est le slide suivant.
http://ruby-i18n.org/wiki
http://www.gnu.org/software/gettext/manual/gettext.html