Starší komentáře ke článku: GNU Gettext - první kroky

Zpět na článek | Úvodní stránka Interval.cz

Avatar

Autor komentáře: Roman Dagi Pichlik

Datum vložení: 15.3.2005 8:56:58

Je to velice podobny mechanismus, ktery ma Java v java.util.ResourceBundle a java.util.Locale, ale tam se mi to zda mnohem propracovanejsi. Zvazte priklad, kdy mate aplikaci s takto vyextrahovanymi a prelozenymi texty, ktera putuje k zakaznikovi. Zakaznikovi se nektere preklady nebo texty nemusi libit a vetsinou se mu ani nelibi, potom si tedy rucne edituje soubor s temi messagemi. Problem nastane s dalsi verzi aplikace, kdy mu sice poslete novou verzi message souboru, ale tim mu prekryjete to co on si zmenil. V Jave muzu ResourceBundle (abstraktni trida) napojit na zminneny soubor (PropertyResourceBundle) a nebo muzu ResourceBundle implemntovat po svem, aby se koukal napriklad do databaze, kde mi problemy s aktualizaci textu odpadnou resp. velsie se usnadni. Navic budu moci zakaznikovi nabidnout user friendly nastroj pro vlastni zmeny textu. Nemusim dodavat, ze pro klienty se nic nememni a volaji porad obdobu gettext.

Avatar

Autor komentáře: Pachollini

Datum vložení: 15.3.2005 10:20:33

Mně přijde, že všechny tyhle nevýhody se dají snadno odstranit, pokud gettext obalím ještě nějakou vlastní funkcí, která buď zavolá gettext, nebo jukne do db.

Avatar

Autor komentáře: Jirka Kosek

Datum vložení: 15.3.2005 10:56:55

Situaci s lokálními úpravai jde vyřešit přes gettext. Funkce dgettext si umí sáhnout do jiného souboru s překlady, kde mohou být pouze změny od zákazníka. Stačilo by si pak předefinovat funkci _: function _($msg) { $local = dgettext("zakaznickepreklady", $msg); if ($local == $msg) return gettext($msg); //zákazník si to nepřeložil else return $local; // zákazník si to přeložil } BTW: Na lokalizaci v Javě jsem už dlouho nekoukal. Pořád se zpráva identifikuje jen nějakým umělým identifikátorem, nebo jde použít přímo plný text jako u gettextu?

Avatar

Autor komentáře: Roman Dagi Pichlik

Datum vložení: 15.3.2005 12:18:24

Ano message musi byt urcena identifikatorem, ale nikdo vam nebrani si tam dat puvodni text, i kdyz mi to neprijde jako dobre reseni.

Avatar

Autor komentáře: Jirka Kosek

Datum vložení: 15.3.2005 13:13:50

Mě zase připadá dost neintuitivní psát print MSG_HELLO; a někde bokem mít, že MSG_HELLO = "Hello!" místo print _("Hello!"); To je podle mne největší krása gettextu, protože rovnou vidím, co má aplikace v daném místě vypsat a nemusím odskakovat někam do resources. Ale je to samozřejmě otázka vkusu.

Avatar

Autor komentáře: DaM

Datum vložení: 15.3.2005 14:22:16

není špatné, že na první pohled vidím defaultní text přímo ve zdrojovém kódu, namísto pouhého umělého klíče do resourců, ale jsou nějak v gettextu řešeny tyto případy? - např. v anglické verzi chci sice na dvou místech zobrazit slovo Hello, ale v české verzi chci na jedné stránce překlad Ahoj a na druhé stránce třeba Dobrý den? Prostě dva různé české výrazy, mající stejný anglický překlad - co když slovo Hello používám v celém projektu na padesáti místech a najednou bych na přání zákazníka měl použít o něco formálnější Good morning? Znamenalo by to prohledávat celý projekt a nahrazovat ? - co v případě, že v české verzi chci zobrazit text Ahoj, ale v anglické verzi ho nechci zobrazovat vůbec? Mám použít syntaxi _("") ? - lze do gettextu umělé klíče zavést, tj. definovat překladový slovník i pro výchozí kulturu ? DaM

Avatar

Autor komentáře: Jakub Vrána

Datum vložení: 15.3.2005 15:27:56

Nikde není řečeno, že identifikátory jsou v angličtině. Řečeno je pouze tolik, že se použijí, pokud pro ně neexistuje překlad. Nic vám tedy nebrání vytvořit si překlad i pro angličtinu a tím všechny tyhle problémy vyřešit.

Avatar

Autor komentáře: DaM

Datum vložení: 15.3.2005 16:41:30

tak v tom případě ok, chtěl jsem spíše naznačit, proč považuji použití umělých identifikátorů za mnohem vhodnější

Avatar

Autor komentáře: Palko

Datum vložení: 15.3.2005 8:58:16

Jak byste nejlépe vyřešili lokalizaci v aplikaci, kde se používají šablony? Tam mi Gettext asi moc nepomůže, ne?

Avatar

Autor komentáře: Bauer

Datum vložení: 15.3.2005 9:14:26

No ja to v php vyresil dle obrázku dole - php stránka volá script - kterej dodá text jakej je v překladatelskym centru - takže korektor textu - případně člověk kterej překladá ma taky pěkný a příjemny rozhraní kdyz přidám jazyk (treba madarštinu) automaticky si zvolim jaký text se má zobrazovat neni-li preklad pro danný jazyk. pak jen dám heslo a jméno človekovi, kterej to do madarstiny přeloží - neposilam mu vůbec žadnej log pro přepis - vše zmení pěkně z prohlížece a link na slibovaný obrázek? http://www.delcomp.cz/temp/preklad.png

Avatar

Autor komentáře: Petr

Datum vložení: 15.3.2005 10:00:55

Ten system vypada zajimave, hlavne propracovane. Muzete o nem napsat vice informaci? To je Vase dilo nebo je to nejaky volne siritelny projekt?

Avatar

Autor komentáře: Bauer

Datum vložení: 15.3.2005 15:35:34

Omlouvám se všem kterých se toto netýka: -------------- Zatim to vyvíjím - je to placený publikační systém - screenshot je z druhé verze, v prodeji je zatim jen ta prvni. V součastné době se uvazuje o free verzi v ramci domény třetího řádu (neco jako wz.cz ale s publikačním systémem) - takže pokud Vás to zajímá, kontaktujte icq 79343471 rád sezbírám argumenty pro svoje vedení -------- omlouvám se za nesouvisející přízpěvek bylo to naposledy

Avatar

Autor komentáře: Jirka Kosek

Datum vložení: 15.3.2005 13:20:57

Teoreticky by mělo jít engine šablonovacího systému upravit tak, aby texty ze šablony nasekal na menší kusy (třeba po elementech) a ty pak předával gettextu k překladu.

Avatar

Autor komentáře: Jakub Vrána

Datum vložení: 15.3.2005 15:29:50

Např. HTMLTmpl http://htmltmpl.sourceforge.net/gettext.html#syntax podporu pro Gettext (a jakékoliv další překladové funkce) má.

Avatar

Autor komentáře: Martin Koníček

Datum vložení: 15.3.2005 17:04:06

Zejména ve Smarty je to naprosto primitivní. Celou výslednou stránku projedete přes regulární výrazy a nalezenete shody, které lze zaznamenat do databáze a poté k nim přidat překlady. U šablon je navíc ta výhoda, že slovníky lze tvořit dynamicky. Minimálně ve Smarty je to řešitelné velmi jednoduše. Hlavně oproti zde zmíněnému gettextu má Smarty tu výhodu, že projíždíš až výstupní stránku, lze tedy překládat data načítaná třeba přes XML-RPC apod.

Avatar

Autor komentáře: spaze

Datum vložení: 18.3.2005 12:50:11

Ve Smarty pouzivam vlastni odvozenou tridu (castecne zalozenou na IntSmarty a jeste nejakem kodu z tusim Smarty Wiki), kde je uvedeno {l}tohle preloz{/l}, pri kompilaci sablony se kompilator (resp. prefilter plugin) podiva do souboru a nahradi "tohle preloz" za zvoleny retezec a zkompilovanou sablonu ulozi. Takze pokud mam tri jazykovy verze, mam tri zkompilovany sablony, neprobiha zadna nahrada on-the-fly. Uvazoval jsem i nad tim, ze do toho nejak gettext zapojim taky, ale asi jsem z toho nakonec upustil, kdysi kdyz jsem gettext zkousel, mel jsem spis problemy (nedokazal vytahnout vsehcny texty, coz je pochopitelne). Cili resume: podle compile ID si vytahnu text a zkompiluju sablonu a ulozim k ostatnim jazykovym verzim te konkretni sablony.

Avatar

Autor komentáře: zajdee

Datum vložení: 15.3.2005 11:21:57

Autor bohuzel nezminil, ze gettext se stava nepouzitelnym v safe mode, kdy nelze nastavit systemove promenne... :( A protoze hosting bez safe mode dnes kvuli "bezpecnosti" php nesezenete (pokud si ho nevytvorite sami), ztraci gettext svuj puvab :(

Avatar

Autor komentáře: ondra

Datum vložení: 15.3.2005 11:57:32

to nemate zcela pravdu, pouzivam gettext na dvou hostingach(linux) a jeden windows v safe modu a bezi to uplne bez problemu. BTW hosting bez safe modu se da najit bez problemu, staci se podivat na RIP(na lupe) nebo do tabulky nejvetsich webhosteru v CR a zeptat se...

Avatar

Autor komentáře: Tomas Stryja

Datum vložení: 4.7.2008 22:54:28

Pokud je funkční gettext() v safe mode, tak je zaručeně v php.ini přidán LANG: safe_mode_allowed_env_vars = PHP_,LANG. Pokud však hosting zakazuje funkci putenv(), nelze gettext() provozovat, tečka.

Avatar

Autor komentáře: Jirka Kosek

Datum vložení: 15.3.2005 12:49:18

Proměnnou LANG není potřeba nastavovat, pokud je prázdná, jazyk se pak bere z locales. Záleží na konkrétním OS z jakých míst bere nastavení aktuálního jazyka pro gettext.

Avatar

Autor komentáře: Petr

Datum vložení: 24.8.2006 21:10:53

Můžete to prosím trochu rozvést? Gettext mi nejede právě kvůli funkci putenv která neprojde přes safe mode.

Avatar

Autor komentáře: Milan

Datum vložení: 15.3.2005 12:17:23

V clanku jse pise: Chceme-li nyní stránku přeložit do dalších jazyků, musíme z ní nejprve vytáhnout všechny texty k přeložení. Toho dosáhneme jednoduchým příkazem: [b]xgettext --from-code=cp1250 gettext.php[/b] Kde a jak mam zadat tenhleten prikaz? A kde jse mi vygeneruje vysledek?

Avatar

Autor komentáře: Jirka Kosek

Datum vložení: 15.3.2005 13:18:32

Příkaz se píše na příkazovém řádku vašeho operačního systému. Např. ve Windows se na příkazový řádek dostanete pomocí Start -> Spustit, napíšete cmd a zmáčknete Enter.

Avatar

Autor komentáře: denn

Datum vložení: 27.3.2005 18:55:34

dobry den, zkousim cmd, ale pisemi to ze msgfmt nebo xgettext neni nazvem vnitrniho ani vnejsiho prikazu; to pouziti jste mohl vice rozvezst diky

Avatar

Autor komentáře: Jirka Kosek

Datum vložení: 28.3.2005 21:15:22

Předpokládám, že někdo, kdo vyvíjí aplikace v PHP, umí nainstalovat a spustit program určený pro jeho operační systém. To mi nepřipadá jako přehnaný požadavek. Pracujete-li ve Windows je skutečně nejjednodušší si nainstalovat Cygwin. Všechny potřebné programy se vám přidají do cesty (proměnná prostředí PATH), kde je Windows hledají.

Avatar

Autor komentáře: Lukas

Datum vložení: 31.3.2006 17:55:32

Kéž by tomu tak opravdu bylo...

Avatar

Autor komentáře: Fak

Datum vložení: 20.7.2006 11:16:32

hledal jsem to jako pako a nakonec jsem našel kde to PAth změnit Tento počítač > Vlastnosti > Upřesnit > Proměnné Systému tam najít "Path" a k tomu přidat třeba ;C:\CYGWIN\BIN podle toho kde cygwin je...

Avatar

Autor komentáře: Petr 'PePa' Pavel

Datum vložení: 15.3.2005 14:11:29

Tak jsem si to rozběhal pod Windows 2000, Apache 2.0.50, PHP 4.3.10-dev a gettext 0.13.1, jenže i když mám český text v iso-8859-2 a v messages.po/mo to mám v Content-Type nastavené, tak se mi nabodeníčka přes PHP vrátí v cp1250. Není to záležitostí Apache, zkoušel jsem i volat přímo: php -fgettext.php >test.html Nemáte s tím někdo zkušenosti? BTW: rozchodit php_gettext.dll není jen záležitostí odkomentování řádky v php.ini :) Záleží na verzi PHP - konkrétně viz http://www.php.net/manual/en/ref.gettext.php Starou verzi gettextu jsem instaloval, protože se mi nechtělo hledat zkompilovanou aktuální (v oficiálních mirrorech není) - nemáte někdo tip?

Avatar

Autor komentáře: Jirka Kosek

Datum vložení: 15.3.2005 17:38:03

Je mnoho míst, kde mohlo dojít k nechtěnému překódování. Jestli jste si jist, že na vině je opravdu gettext, zkuste před prvním voláním funkce gettext() použít ještě funkci bind_textdomain_codeset(), která umožňuje zadat kódování, ve kterém gettext texty vrací.

Avatar

Autor komentáře: Petr 'PePa' Pavel

Datum vložení: 15.3.2005 23:09:53

Výborně! Bylo to tím. Stačilo přidat: bind_textdomain_codeset("messages","iso-8859-2"); Díky za radu.

Avatar

Autor komentáře: Zak

Datum vložení: 4.4.2005 11:34:05

Dobry den, jen tak zbezne ctu o gettextu a uvazuji o jeho pouziti pro help. Napadlo me, co ma clovek delat, pokud mam napr v HTML textu zvyraznene rekneme nejake akce spanem. Takze uprostred vety je tag span. Kdyz oznacim celou vetu vcetne formatovaciho tagu, tak pocitam, ze mi gettext vytahne text vcetne toho tagu, coz cini preklad mene prehlednym. Pokud bych rozdelil vetu na tri gettexty, tak se zase ztrati kontext a vysledny preklad nemusi davat smysl. Diky za Vase tipy, Z

Avatar

Autor komentáře: Jirka Kosek

Datum vložení: 4.4.2005 22:19:56

Jestli by se kontext ztratil, nezbude vám nic jiného, než tam ten span nechat a překládat to i s tím. Nicméně pro překlad helpu a dokumentace obecně je lepší ji vytvářet v XML (např. v DocBooku) a pro překlad využít nějaký systém s překladovou pamětí, který podporuje XML. Z komerčních produktů to umí třeba Trados, vývojáři KDE si pro sebe vytvořili nějaký open-source nástroj, ale na jméno si už nevzpomínám.

Avatar

Autor komentáře: Michal

Datum vložení: 11.4.2005 11:52:32

Getttext používám, používám ale unikátní msgid, protože jsme chtěl mít aplikaci primárně v češtině a až jako druhý azyk dát angličtinu, ale gettext neumí překládat, pokud je v msgid diakritika např.: msgid "Vítejte!" msgstr "Welcome!" ...nepřeloží. Což je asi možná logické, takže pozor na to ....

Avatar

Autor komentáře: Patrick

Datum vložení: 25.9.2006 14:23:37

Já češtinu v msgid používám a funguje... mám to v kódování UTF-8

Avatar

Autor komentáře: Jarda Plzák

Datum vložení: 22.12.2005 12:22:59

Dobrý den. Měl bych otázku, jestli je nějaký způsob v PHP, jak ověřovat, že string který chceme gettextem překládat je v .po souboru přeložený. Jelikož fce gettext() vrací zaslaný řetězec, i když lokalizovanou alternativu nenajde v .po souboru, tak nevím, co s tím.

Avatar

Autor komentáře: Laco

Datum vložení: 14.2.2006 16:31:28

prosim Vas, vie mi niekto poradit ohladom gettextu pod win32? Nainstaloval som ho, pridal do %PATH%, zmenil som php.ini a nakopiroval prislusne dll subory do system32. Napriek vsetkemu stale dostavam chybovu hlasku typu: fatal error:call to undefined function: (niektora metoda gettextu) za radu dakujem

Avatar

Autor komentáře: Unambiguous

Datum vložení: 9.8.2006 12:19:02

Gettext používam pomerne často na preklad krátkych reťazcov (slová), resp. celých viet. Momentálne, ale riešim nasledovný problém. Mám stránku, na ktorej sa vyskytuje pár slov a pár celých textových blokov, ktoré treba preložiť. V prípade jednotlivých slov je gettext ideálne riešenie. Čo ale v prípade textových blokov? Ide rádovo o desiatky viet, ktoré by bolo treba preložiť. V tomto prípade sa mi zdá gettext nepoužiteľný, pretože msgid by bol príliš dlhý a podľa môjho názoru by to malo negatívny vplyv (okrem iného) aj na výkonnosť. Predpokladám, že najlepšie riešenie by bolo použitie gettextu v kombinácii s lokalizovanými šablónami. Aký je váš názor?

Avatar

Autor komentáře: Jirka Kosek

Datum vložení: 9.8.2006 20:38:10

Naopak, gettextem není vhodné označovat jednotlivý slova, protože v různých kontextech mohou mít různý překlad. Váš případ by mohlo jít vyřešit rozdělením textu na menší části, ideálně věty. Jinak vám samozřejmě nic nebrání v použití krátkého msgid, které bude i pro angličtinu "přeloženo" na plný dlouhý text v msgstr.

Zpět na článek | Úvodní stránka Interval.cz