GetTextI18N : internationalisation
$ finger abelar_s• 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é
http://www.linkedin.com/in/sylvainabelard
Vue d’ensemble• 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
GNU GetText: GetText’s Never Useless
Rails I18N• 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
Pourquoi sortir du standard Rails ?
LinguistiqueC’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...
Que choisir ?• 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
Michael Grosser - FastGetText !
Setup• 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
How to GetText part 1
GetText.locale = "fr"init_gettext "my_app"
I18n.supported_locales = ["en", "fr", "de", "ar", "ru"] # mieux : faites-le lui deviner en listant les fichiersI18n.default_locale = "fr" # en par défaut
Usage• 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
How to GetText part II
Astuces• 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
How to GetText part III
Fichiers PO• 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
Les outils sont très bons pour ça.
Questions?On embauche, mais c’est le slide suivant.
http://ruby-i18n.org/wiki
http://www.gnu.org/software/gettext/manual/gettext.html