Traduire sous Linux avec `gettext`
29 gennaio 2008, 15:54 Lieu , Shell , Trucs & Astuces 29 janvier 2008, 15:54La fonction `gettext` est conçu pour permettre la traduction de l'ensemble du système GNU / Linux. C'est précisément pour cette raison, il est 100% compatible avec un grand nombre de langages de programmation et des langages de script: C, C + +, C #, Bash, Python, GNU clsip, Emacs Lisp, GNU Smalltalk, Java, GNU awk, Pascal, wxWidgets, YCp , Tcl, PHP, Pike, et d'autres.
D'abord nous allons voir comment utiliser `gettext` dans le code source. Les modalités d'application varient en fonction du langage de programmation utilisé pour votre projet, mais la syntaxe est presque toujours la même, du moins pour les langages de programmation populaires: la fonction contient simplement la chaîne de message à traduire. Il convient de noter que presque toujours utilise la forme courte, ce qui correspond simplement à un trait de soulignement. De cette façon, le code suivant dans C:
printf(gettext("My name is %s\n"), mio_nome);
devient:
printf(_("My name is %s\n"), mio_nome);
Plus tard, la commande sera xgettext filtrer le code pour trouver le gettext fonction venez d'insérer, pour créer le fichier de modèle. Pot sur la base des chaînes extraites de la source. . Un exemple d'un pot de fichier pour un code contenant les lignes ci-dessus est la suivante:
#: include/myname.php:36
msgid "My name is %s\n"
msgstr ""
Pour commencer la traduction est utilisée dans le programme `` msginit. Déplacement du fichier. Petite `et` msginit est possible de générer un nouveau fichier contenant le squelette de la nouvelle. Bit dans la langue cible. Par exemple, pour traduire le fichier en italien en_EN.po il suffit d'exécuter la commande suivante:
locale = fr_FR-msginit-entrée = en_EN.po
Le programme permettra de créer le fichier, it_IT.po dont le contenu sera similaire à ce qui suit:
#: include/myname.php:36
msgid "My name is %s\n"
msgstr "My name is %s\n"
À ce stade, le traducteur n'a pas à faire est de traduire la chaîne à la suite de la msgstr. La traduction peut être fait avec n'importe quel éditeur de directement à partir de la ligne de commande, ou en utilisant des programmes spécifiques comme poEdit . Le résultat ressemblera à ce qui suit:
#: include/myname.php:36
msgid "My name is %s\n"
msgstr "Mi chiamo %s\n"
. Une fois les fichiers de traduction Po doivent être compilées dans le fichier binaire Mo par l'intermédiaire du msgfmt `.:
msgfmt it_IT.po















10 octobre 2008 à 15:48
Bonjour, j'ai fait il ya quelque temps servicemenus pour kde3.
Maintenant, je vais les porter à kde4 et je voulais ajouter le support pour les langues barbares
Dans la pratique, le menu 'appelle un script bash et initialement j'avais saisi toutes les chaînes déjà «traduits dans le même script:
par exemple
-----------------
en_msg_savefile = "Enregistrer le fichier ..."
it_msg_savefile = "Enregistrer le fichier ..."
etc ..
msg_SaveFile eval = \ $ $ (echo $ {lang} _msg_SaveFile)
puis echo "$ {} msg_SaveFile"
----------------
Maintenant je me demande, pensez-vous que vous pouvez «facilement adopter la procédure décrite ci-dessus vous pour localiser le scriptino en bash?
Merci
10 octobre 2008 à 21:25
J'ai trouvé ce que je cherchais, merci.
Je voudrais vous demander une chose, il ya quelques mots en anglais est scivono d'une certaine manière, mais non dans les langues italienne ou autre.
par exemple: Fait
J'écris en italien ou fini fini, selon l'opération effectuée précédemment.
Si par exemple je faire pivoter une image sera «une fenêtre qui dit:" Rotation de l'image casa.jpg "" Terminé "
Écrire en anglais toujours "Terminé"!
Vous savez comment je peux faire pour corriger cela?
Je vous remercie à l'avance.
Nombreux sont ceux qui commencent à utiliser kde4 et j'ai écrit plusieurs mails qui ont été dans l'espoir d'un port des scripts. Sauf que jusqu'à présent il ya 8 langues, mais plus «hors pourrait augmenter.
Goofy Salutations
13 octobre 2008 à 10:05
Bonjour Joseph,
excuser le retard, ils sont très occupés. Première réponse à votre deuxième question: Si vous choisissez d'utiliser gettext la correspondance entre la langue de base et les diverses traductions doivent nécessairement être unique sur tous les mots et, dans le cas où la langue de traduction est plus articulé que celui de départ, est d'être bijective, lorsque cela est possible. Si vous parlez de la biunivocità est impossible, donc vous avez juste à traduire des blocs de phrases plutôt que des mots simples. Ou, comme tous les bon traducteur, il vous suffit de prendre un certain ruse petite. Dans votre cas, je voudrais traduire "Done" avec "... Fait" au lieu de "Terminé / à». Mais je suis sûr que vous avez des exemples plus complexes où cette solution simple ne suffit pas, girameli ici que nous en discuter ensemble.
En ce qui concerne votre première question, savez aussi que vous avez trouvé la solution seul, je vous dis que l'utilisation de gettext est la plus simple et rapide et vous fera économiser à invoquer eval et autres "trucs"
Trouver un exemple concret de très important à cette adresse:
http://tldp.org/LDP/abs/html/localization.html~~V
Mais ... je suis sûr que vous l'avez déjà vu, alors je vous invite à publier ici un court exemple de la façon dont vous l'avez mis en œuvre pour le bénéfice de tous
Bye! Ivan
13 octobre 2008 à 10:24
Bonjour Ivan, Merci pour la réponse.
Donne-moi le temps de donner un bon nom pour les variables et de fixer quelque chose d'autre peu et puis après un peu plus comme «complexe.
Quoi qu'il en soit, quand je les faire fonctionner sur kde-look.org publique, comme je l'ai fait avec ceux de kde3 ici: http://www.kde-look.org/content/show.php/konq-pdf?content=37321
bientôt
13 octobre 2008 à 23:55
En parlant de trucs que vous avez mentionné ... pour maintenir une traduction complète de tous les dettaggli une langue, il suffit d'utiliser le coma clé clé de hachage créée par vous, et non la traduction elle-même. Par exemple:
dans le fichier source "gettext (msg_saveFile_title)"
puis nous créons le fichier en.po, etc it.po
de cette manière le message et «unique et plus» me permet d'utiliser les fonctionnalités masculin, féminin ou neutre, et d'autres.
Que pensez-vous?
bonjour
15 octobre 2008 à 12:31
En ce qui concerne les scripts que vous publiez sur kde-look.org, laissez-moi savoir quand vous faites, je suis curieux. Le deuxième message (en utilisant la clé de hachage avec gettext) Je suis sûr qu'il serait pratiquement impossible à réaliser: les langues sont très différents les uns des autres à la fois morphologique et syntaxique point de vue, la seule solution est de produire toutes les phrases nécessaires dans la langue source et de générer des phrases correspondantes dans les langues traduites. Il est une source de licenciements sans fin, mais croyez-moi, il n'ya pas de solution alternative en utilisant un simple mais très efficace comme gettext. Mais il peut toujours en parler, c'est peut-être moi que je n'ai pas rattrapé dans la plénitude de leur sens de votre message.
au revoir
Ivan
15 octobre 2008 à 15:40
Tournant un peu vers les canaux des développeurs sont au courant de l'internationalisation qui i18nc contextualisée. Dans la pratique, il vous permet de spécifier un message basé sur le contexte. Je n'ai pas de profondeur parce que «je» a été dit qu'il serait mieux que tous les logiciels a dans les messages sorgento fr_FR soo en anglais, puis, par le biais lacoalizzazione, d'autres langues. Donc, à la lumière de cela, je ne peux pas utiliser la technique mentionnée ci-dessus.
En tout cas je l'ai également dit que vous ne devriez pas utiliser gettext directement, afin que je puisse l'utiliser pour bash.
Après cette introduction, j'ai décidé de faire ces choses avec la technologie "eval", et "comment utiliser les pointeurs en bash
Je viens de terminer servicemenus aujourd'hui et avoir une mer de fonctions pour travailler avec les PDF. J'ai ajouté certains que la version précédente. Me manque encore les traductions, nous devons donc «attendre pour moi riconsegnino diverses sources par des traducteurs phrases traduites et je pense que ça va aller» un peu de temps (il ya environ 8 langues).
J'ai promis à un peu plus comme un «complexe, puis va prendre« l'un des servicemenus que j'ai écrit, sera coupé "toutes les fonctions, sauf un, et d'autres commentaires" sommairement que la partie relative à l'internationalisation.
Sujet:
Un Servicemenü qui extrait les images d'un document pdf. (Le programme qui ne c'est ce qu'on appelle pdfimages et e 'contenue dans poppler-utils).
Il servira 'un ordinateur de bureau le fichier. De mettre en ~ ou .kde/share/kde4/services/ServiceMenus ou l'équivalent du système (tous les utilisateurs).
Barbatrucco: J'ai remarqué que vous pouvez également créer un sous-dossier, si vous avez plus 'ordre.
Le fichier que nous appelons pdfimages.desktop (nom arbitraire) et contient:
Lorsque vous cliquez sur une entrée, exécutez kde qu'il n'y a dans la ligne Exec [lang], où lang et «la langue définie pour KDE lui-même.
Comme vous le voyez, est appelé un sm_pdfimages.sh scriptino des paramètres nommés et certains sont passés: la langue, l'action, le fichier sur lequel travailler.
Laissez le scriptino, qui contiendra:
Maintenant, nous allons voir ce qui se passe lorsque vous appelez le script en question:
tout d'abord je dois dire que je utiliser le contenu de l'action variable, directement comme un appel de fonction
De cette façon, si les économies sur les maisons, etc ... 

Lors de l'exécution d'une fonction (par exemple tous), le bash remplace les variables avec la valeur. Analizziamone un seul: "$ {} msg_imagesRootName_title"
Cette variable contient le titre d'une boîte de dialogue, spécifiez la langue n'est cependant pas
La phrase correcte est obtenu avec un petit jeu qui m'a intrigué dans un premier temps, vous préparer! une école élémentaire pointeur (très basique)
First things first, tout d'abord définir les variables des messages dans n'importe quelle langue qui m'intéresse et je appeler les variables elles-mêmes avec un nom qui contient la chaîne de la langue utilisée.
Donc, pour le titre:
Comme vous pouvez voir la différence de nom n'est que le début.
Ensuite, définissez une variable dont le nom et «même que celle décrite ci-dessus, mais sans le" lang "de cette manière:
msg_imagesRootName_title eval = \ $ $ (echo $ {lang} _msg_imagesRootName_title)Si nous supposons que la langue d'usage est-il, avec cette procédure, la coquille dit msg_imagesRootName_title de prendre la valeur en $ it_msg_imagesRootName_title et le jeu et «fait.
Dans la pratique, la variable contiendra msg_imagesRootName_title 'le bon message basé sur le langage utilisé.
Terminé.
Après avoir évalué plusieurs solutions de rechange, de sorte cela semblait le plus «facile à internationaliser le script. Bien sûr, si quelqu'un a une autre idée, serait la bienvenue.
Fiuu .. plus «facile à mettre en œuvre ce que d'expliquer.
Comme mentionné ci-dessus, il faudra encore un certain temps avant de publier, même si je pouvais le faire maintenant et traductions seront ajoutés plus tard.
PS si vous voulez mettre la balise pour le code pour le rendre plus «lisible, aller de l'avant.
Bonne journée à tous
Joseph
15 octobre 2008 à 16:13
Cocotte, ce n'est pas un simple commentaire, mais un poste avec controfiocchi! Compliments
J'avoue que je n'ai pas eu le temps de tester votre code, mais la logique est là et l'explication est claire.
Vous êtes le premier à gagner l'entrée dans ma blogroll! 
Ivan
15 octobre 2008 à 21:42
Bonjour Ivan, merci pour la blogroll.
. 
Le commentaire semble long, car le code
Je n'ai pas encore de comprendre pourquoi «vous ne devriez pas utiliser gettext directement, il semblait très simple et facilement extensible.
Dans tous les cas, ces menus services sont une chose pas fini, avec peu de contrôle sur le flux de commandes.
Maintenant que j'ai tout mis dans un script, j'ai la chance »dans le temps pour inclure beaucoup plus de contrôles des. Si vous regardez dans le menu je l'avais fait, le flux est séquentiel puisque chaque commande dans les fichiers. Bureau je ne pouvais pas profiter de si ou de variables. En fait, je m'en souviens galipettes afin de ne pas recourir à des fichiers externes
J'espère que les stimuli, par exemple posté un peu de gens à créer des menus contextuels. Après tout, nous nous-mêmes que nous allons améliorer notre kde4, ou du moins je l'ai fait avec le mien et je suis bien là.
Si je puis-je essayer de mettre ce travail sur kde.org pdf donc n'importe qui peut travailler sur facilement sans avoir besoin d'installer quoi que ce soit.
Pour tous:
Conseils et suggestions pour de nouvelles fonctionnalités sont les bienvenus.
Je ne suis pas un programmeur et vous n'avez même pas besoin d'être à y participer. Malgré cela, beaucoup de gens à travers le monde m'ont remercié pour quelque chose, j'ai même cru possible.
Je souhaite bonne affaire de tous avec leur kde4 ou tout autre chose. (Toujours sur des systèmes ouverts).
Joseph
24 novembre 2008 à 1:03
Bien qu'avec un certain retard, j'ai publié hier Servicemenü J'ai travaillé sur.
J'ai placé l'annonce est sur kde-look.org celle de http://www.egregorion.net
Il ya le tar.gz et deb pour Intrepid.
Amusez-vous
Joseph