Traducerea Linux cu `gettext`
29 gennaio 2008, 15:54 Locaţie , Shell , Sfaturi şi trucuri 29 ianuarie, 2008, 15:54Funcţia `gettext` este conceput pentru a permite traducerea întreg sistem de operare GNU / Linux. Tocmai pentru acest motiv, este 100% compatibil cu un număr mare de limbaje de programare şi limbaje de scripting: C, C + +, C #, Bash, Python, GNU clsip, Emacs Lisp, GNU Smalltalk, Java, GNU awk, Pascal, wxWidgets, PCI , Tcl, PHP, Pike, şi altele.
În primul rând să vedem cum să folosiţi `gettext` în codul sursă. Normele de aplicare variază în funcţie de limbajul de programare folosit pentru proiectul dumneavoastră, dar sintaxa este aproape întotdeauna acelaşi, cel puţin pentru limbaje de programare populare: pur şi simplu funcţia conţine şirul mesajul să fie tradus. Trebuie remarcat faptul că aproape întotdeauna utilizează formularul de scurt, care pur şi simplu corespunde la o liniuţă de subliniere. În acest fel, următorul cod în C:
printf(gettext("My name is %s\n"), mio_nome);
devine:
printf(_("My name is %s\n"), mio_nome);
Mai târziu, xgettext comanda va filtra pentru a găsi codul de gettext funcţia de doar introduce, pentru a crea fişierul şablon. Pot pe baza de siruri de caractere extrase de la sursa. . Un exemplu de un vas de fişier pentru un cod care conţine rândurile de mai sus este, după cum urmează:
#: include/myname.php:36
msgid "My name is %s\n"
msgstr ""
Pentru a începe traducerea este utilizat în programul de `` msginit. Mutarea fişierului. Mic `a` msginit este posibil pentru a genera un nou dosar care conţine scheletul noului Bit în limba ţintă.. De exemplu, pentru a traduce în limba italiană fişierul en_EN.po doar să rulaţi următoarea comandă:
locale = ro-msginit de intrare = en_EN.po
Programul va crea fişierul it_IT.po, al căror conţinut va fi similar cu următorul:
#: include/myname.php:36
msgid "My name is %s\n"
msgstr "My name is %s\n"
În acest moment, traducător nu trebuie să faceţi este să traducă următorul şir msgstr. Traducere se poate face cu orice editor de direct din linia de comandă, sau folosind programe specifice, cum ar fi poEdit . Rezultatul va arata astfel:
#: include/myname.php:36
msgid "My name is %s\n"
msgstr "Mi chiamo %s\n"
. Odata ce fisierele de traducere Po ar trebui să fie compilate într-un fişier binar Mo prin msgfmt ``.:
msgfmt it_IT.po















10 octombrie 2008 la 15:48
Buna ziua, am făcut ceva timp în urmă servicemenus pentru KDE3.
Acum, am să le aduc KDE4 şi am vrut să adăugaţi suport pentru limbile barbare
În practică, meniul ", este de asteptare un script bash si initial am intrat deja toate siruri de caractere", traduse în acelaşi script:
de exemplu
-----------------
en_msg_savefile = "Salvaţi fişierul ..."
it_msg_savefile = "Salvaţi fişierul ..."
, etc ..
msg_SaveFile eval = \ $ $ (echo $ lang {} _msg_SaveFile)
şi apoi echo "$ {} msg_SaveFile"
----------------
Acum mă întreb, crezi că poate "adopta cu uşurinţă procedura de ati descris mai sus pentru a localiza scriptino în bash?
Mulţumiri
10 octombrie 2008 la 21:25
Am găsit ceea ce căutam, mulţumesc.
Aş dori să vă întreb un singur lucru, există unele cuvinte în limba engleză este scivono într-un anumit fel, dar nu şi în limbile italiană sau alta.
de exemplu: Done
Eu scriu în finit, italiană sau finisate, în funcţie de operaţiunea efectuată anterior.
Dacă, de exemplu, am roti o imagine va fi "o fereastra care spune" Imagine de rotaţie casa.jpg "" Completed "
Scrie în limba engleză întotdeauna "Done"!
Ştii cum am putea face pentru a remedia acest lucru?
Va multumesc anticipat.
Mulţi au început să folosească KDE4 si am scris mai multe e-mailuri care au fost în speranţa pentru un port de scripturile. Cu excepţia faptului că până în prezent există 8 limbi, dar mai mult "afară ar putea creşte.
Salutări Goofy
13 octombrie 2008 la 10:05
Buna ziua Joseph,
scuza întârziere, sunt foarte ocupat. Primul răspuns la întrebarea de-a doua: Dacă alegeţi să utilizaţi gettext corespondenţa dintre limba de baza, precum şi traduceri diferite trebuie neapărat să fie unic pentru toate cuvintele şi, în cazul în care limba de traducere este mai articulat decât cel de plecare, trebuie să fie bijectivă, acolo unde este posibil. Dacă este vorba despre biunivocità este imposibil, deci trebuie doar să traducă blocuri de fraze, mai degrabă decât cuvinte simple. Sau, ca orice bun traducător, veţi lua doar un mic viclean. În cazul în care dumneavoastră mi-ar traduce "Done", cu "... Done" în loc de "Finalizat / a". Dar eu sunt sigur că aveţi exemple mai complexe în cazul în care această soluţie simplă nu este suficient, girameli aici, că le-am discuta împreună.
În ceea ce priveşte prima întrebare, ştiu, de asemenea, aţi găsit soluţia singur, am să vă spun că utilizarea gettext este cel mai simplu şi rapid şi se vor salva pentru a invoca eval si alte "trucuri"
Găsiţi un exemplu practic de foarte semnificativ la aceasta adresa:
http://tldp.org/LDP/abs/html/localization.html~~V
Dar ... eu sunt sigur că deja aţi văzut, atunci vă invit să publicaţi aici un exemplu scurt de cum l-aţi pus în aplicare pentru beneficiul tuturor
Pa! Ivan
13 octombrie 2008 la 10:24
Salut Ivan, mulţumesc pentru răspuns.
Dă-mi timp pentru a da un nume bun pentru a variabilelor şi să stabilească un alt lucru mic si apoi posta ceva mai mult ca "complex.
Oricum, atunci când le-am rula pe kde-look.org publică, aşa cum am făcut cu cele pentru KDE3 aici: http://www.kde-look.org/content/show.php/konq-pdf?content=37321
curând
13 octombrie 2008 la 23:55
Vorbind de trucuri pe care le menţionat ... pentru a menţine o traducere completă a tuturor dettaggli o limbă, folosiţi doar comă tasta tasta Diez creat de tine, şi nu traducerea în sine. De exemplu:
în fişierul sursă "gettext (msg_saveFile_title)"
şi apoi vom crea en.po fişierul, etc it.po
în acest fel şi mesajul "unic şi mai mult", îmi permite să utilizaţi caracteristici masculine, feminine sau neutre, şi altele.
Ce crezi?
Alo
15 octombrie 2008 la 12:31
În ceea ce pentru script-urile pe care le publică pe KDE-look.org, lasă-mă să ştiu când faci, eu sunt curios. Al doilea mesaj (folosind tasta diez cu gettext) Sunt sigur ca ar fi practic imposibil de realizat: de limbi sunt foarte diferite una de alta, atât morfologică şi sintactică punct de vedere, singura soluţie este de a produce toate frazele necesare în limba-sursă şi de a genera frazele corespunzătoare din limbile traduse. Este o sursă de concedieri interminabile, dar credeti-ma, nu există nici o soluţie alternativă folosind un simplu, dar foarte eficient ca gettext. Dar el poate vorbi mereu, poate ca mi-e că nu am prins în sensul cel mai deplin al tău post.
pa
Ivan
15 octombrie 2008 la 15:40
Revenind un pic la canalele de dezvoltatorii sunt conştienţi de faptul că ar fi internaţionalizarea i18nc contextualizate. În practică, aceasta vă permite să specificaţi un mesaj bazat pe context. Nu am nici o adâncime pentru că "I", sa spus că ar fi mai bine că fiecare software-ul are în sorgento Soo mesaje en_gb în limba engleză şi, apoi, prin lacoalizzazione, alte limbi. Deci, în acest context, eu nu pot folosi tehnica de mai sus.
În orice caz, am spus, de asemenea, că nu ar trebui să utilizaţi gettext direct, aşa că am putea folosi pentru a bash.
După această introducere, am decis să fac aceste lucruri cu tehnologie "eval", şi "Cum să utilizaţi indicatori în bash
Tocmai am terminat servicemenus de azi şi au o mare de funcţii pentru lucrul cu PDF. Am adăugat câteva decât versiunea anterioară. Mi-e dor încă traduceri, aşa că ar trebui să aştept pentru mine riconsegnino diverse surse de traducători fraze traduse şi cred că va merge ", un pic de timp (sunt in jur de 8 limbi).
I-am promis un pic mai mult ca un "complex, apoi va lua", una dintre servicemenus am scris, se va tăia ", toate funcţiile cu excepţia uneia şi comenta în continuare" sumar numai partea referitoare la internaţionalizare.
Subiect:
Un servicemenu care extrage imagini dintr-un document PDF. (Program care face acest lucru este numit pdfimages şi e ", cuprinse în poppler-utils).
Acesta va servi "un desktop fişier. Pentru a pune în ~~~HEAD=NNS / .kde/share/kde4/services/ServiceMenus sau echivalentul a sistemului (tuturor utilizatorilor).
Barbatrucco: Am observat, de asemenea, puteţi crea un subfolder, astfel încât să aveţi mai multă ordine ".
Fişier numim pdfimages.desktop (nume arbitrar) şi conţine:
Când faceţi clic pe o intrare, executaţi kde că nu e în linia Exec [lang], în cazul în care Lang şi "limba setată pentru KDE sine.
După cum vedeţi, se numeşte sm_pdfimages.sh scriptino numit şi anumiţi parametri sunt transmise: limba, de acţiune, dosar pe care să lucreze.
Să scriptino, care va cuprinde:
Acum, să vedem ce se întâmplă atunci când apelaţi script-ul în cauză:
în primul rând trebuie să spun că am folosi conţinutul de acţiune variabilă, direct, ca un apel de funcţie
În acest fel, în cazul în care economiile de pe case, etc ... 

Când se execută o funcţie (de exemplu, toate), bash-ul înlocuieşte variabilele cu valoarea. Analizziamone doar unul: "$ {} msg_imagesRootName_title"
Această variabilă conţine titlul de o casetă de dialog, specificaţi limba nu este însă
Teză corectă se obţine cu un mic joc care mi-a intrigat la început, voi bloca! un pointer elementar (foarte de bază)
Primele lucruri în primul rând, definiţi variabilele de mesaje, în orice limbă care mă intereselor şi eu numesc variabile în sine, cu un nume care conţine şirul de limba folosită.
Deci, pentru titlu:
După cum se poate vedea diferenta de nume este doar începutul.
Apoi, defini o variabilă ale cărei nume şi "identice cu cele descrise mai sus, dar fără" lang "în acest fel:
msg_imagesRootName_title eval = \ $ $ (echo $ lang {} _msg_imagesRootName_title)Dacă presupunem că limba în uz este ea, cu această procedură, coajă spune msg_imagesRootName_title să ia valoarea de la $ it_msg_imagesRootName_title şi joc şi "făcut.
În practică, variabila va conţine "msg_imagesRootName_title mesajul corect bazat pe limbajul folosit.
Terminat.
Dupa evaluarea mai multe alternative, astfel încât aceasta pare cea mai "uşor de a internaţionaliza script. Desigur, dacă cineva are o altă idee, ar fi binevenit.
Fiuu .. mai "uşor să pună în aplicare o decât pentru a explica.
După cum sa menţionat mai sus, va dura ceva timp înainte de publicare, chiar dacă am putea să o facă acum şi traducerile vor fi adăugate mai târziu.
PS daca vrei sa pui eticheta de cod pentru a face mai "uşor de citit, merge mai departe.
Buna ziua tuturor
Joseph
15 octombrie 2008 la 16:13
Caserola, acest lucru nu este un comentariu simplu, ci un post cu controfiocchi! Complimente
Eu recunosc ca nu am avut timp pentru a testa codul, dar logica este acolo şi explicaţia este clară.
Sunteti prima pentru a câştiga intrarea în Blogroll mea! 
Ivan
15 octombrie 2008 la 21:42
Salut Ivan, multumesc pentru blogroll.
. 
Comentariu pare mult timp, deoarece a codului
Încă nu am înţeles de ce "nu trebuie să utilizaţi gettext direct, mi se părea foarte simplă şi uşor de upgrade.
În orice caz, aceste meniuri de servicii sunt un lucru nu sa terminat, cu un control redus asupra fluxului de comenzi.
Acum, că am pus totul într-un script am ocazia ", în timp, pentru a include mai multe cecuri. Daca te uiti la meniul am făcut, debitul este secvenţială, deoarece fiecare comandă în fişierele de pe Desktop nu am putut profita de cazul sau variabile.. Îmi amintesc de fapt, fac tumbe, în scopul de a nu recurge la fişiere externe
Sper că stimulii exemplu postat un pic de oameni pentru a crea meniuri contextuale. După toate, noi înşine, care ne va imbunatati KDE4 nostru, sau cel puţin am făcut-o cu a mea şi eu sunt bine acolo.
Dacă eu pot încerca să pun acest lucru pe kde.org PDF, astfel încât oricine poate lucra cu uşurinţă pe fără a avea nevoie să instalaţi nimic.
Pentru toate:
Sfaturi şi sugestii pentru noi funcţionalităţi sunt binevenite.
Eu nu sunt un programator şi nu au chiar pentru a putea participa. În ciuda acestui fapt mulţi oameni din întreaga lume s-au mi-a mulţumit pentru ceva ce chiar am crezut că a fost posibil.
Doresc loc de muncă bine cu toată lumea KDE4 lor sau orice altceva. (Întotdeauna în sisteme deschise).
Joseph
24 noiembrie 2008 la 01:03
Deşi cu o oarecare întârziere, am publicat servicemenu ieri am lucrat.
Am pus un anunţ pe kde-look.org care a http://www.egregorion.net
Nu e tar.gz şi deb pentru Intrepid.
Se distra
Joseph