Gettext + Poedit + Nette – konečné řešení lokalizace
- norbe
- Backer | 405
Můžu potvrdit, že použitím jiné funkce, než je addslashes se problém vyřeší… Konkrétně na to používám následující jednoduchou fci:
/**
* Add slashes to string
* @param string $string
* @return string
*/
public function addSlashes($string)
{
return preg_replace('/([\"\\\])/i', '\\${1}', $string);
}
- Karel Klíma
- Člen | 31
wotaen napsal(a):
poedit používá utilitu msgcat na merge dvou .po souborů. Například když se přidá nějaký nový překlad.
Gettextextractor volá addslashes při zápisu výstupního souboru (ten slouží jako jako INPUTFILE pro msgcat), tj. escapují se např. apostrofy. Imho to je správně, msgcat ale zařve při merge „invalid control sequence“ na řádku a znaku kde je apostrof. Řešení ve stylu odstranění volání addslashes v extractoru se mi moc nelíbí. Setkal jste se s tím někdo?
Ahoj, možná by pomohla jednoduchá úprava: nechat GettextExtractor vytvořit „.pot“ soubor, což je jakási šablona pro „.po“. V Poeditu se pak dá Soubor → Nový katalog z POT souboru, což by mělo případné problémy odstranit.
Co se týče addslashes
, tak to bych tam spíš nechal.
- wotaen
- Člen | 82
Karel Klíma napsal(a):
wotaen napsal(a):
poedit používá utilitu msgcat na merge dvou .po souborů. Například když se přidá nějaký nový překlad.
Gettextextractor volá addslashes při zápisu výstupního souboru (ten slouží jako jako INPUTFILE pro msgcat), tj. escapují se např. apostrofy. Imho to je správně, msgcat ale zařve při merge „invalid control sequence“ na řádku a znaku kde je apostrof. Řešení ve stylu odstranění volání addslashes v extractoru se mi moc nelíbí. Setkal jste se s tím někdo?Ahoj, možná by pomohla jednoduchá úprava: nechat GettextExtractor vytvořit „.pot“ soubor, což je jakási šablona pro „.po“. V Poeditu se pak dá Soubor → Nový katalog z POT souboru, což by mělo případné problémy odstranit.
Co se týče
addslashes
, tak to bych tam spíš nechal.
Tohle myslím nepůjde, „Soubor->nový katalog z POT“ mi při updatu
moc nepomůže a dokonce (a to je nějaké divné) i „Catalog->Update from
POT file“ mi zobrazí jenom stringy z toho POT souboru. Jediná cesta
k mergi existujících stringů a nových je přes „Catalog->Update from
sources“ (nebo ikonka glóbu) a ta dělá problémy s escapovanýma
apostrofama.
Vzhledem k tomu, že addslashes escapuje jenom ' " \ NUL, tak použítím
addcslashes a vynecháním ' se funkčnost tvého extractoru nezmění a opraví
se chyba pri mergi katalogů.
Takže nesouhlasím :), přijde mi čistější použít addcslashes a escapovat jenom " \ NUL…prostě vynechat
Editoval wotaen (21. 10. 2009 8:45)
- Karel Klíma
- Člen | 31
wotaen napsal(a):
Karel Klíma napsal(a):
wotaen napsal(a):
poedit používá utilitu msgcat na merge dvou .po souborů. Například když se přidá nějaký nový překlad.
Gettextextractor volá addslashes při zápisu výstupního souboru (ten slouží jako jako INPUTFILE pro msgcat), tj. escapují se např. apostrofy. Imho to je správně, msgcat ale zařve při merge „invalid control sequence“ na řádku a znaku kde je apostrof. Řešení ve stylu odstranění volání addslashes v extractoru se mi moc nelíbí. Setkal jste se s tím někdo?Ahoj, možná by pomohla jednoduchá úprava: nechat GettextExtractor vytvořit „.pot“ soubor, což je jakási šablona pro „.po“. V Poeditu se pak dá Soubor → Nový katalog z POT souboru, což by mělo případné problémy odstranit.
Co se týče
addslashes
, tak to bych tam spíš nechal.Tohle myslím nepůjde, „Soubor->nový katalog z POT“ mi při updatu moc nepomůže a dokonce (a to je nějaké divné) i „Catalog->Update from POT file“ mi zobrazí jenom stringy z toho POT souboru. Jediná cesta k mergi existujících stringů a nových je přes „Catalog->Update from sources“ (nebo ikonka glóbu) a ta dělá problémy s escapovanýma apostrofama.
Vzhledem k tomu, že addslashes escapuje jenom ' " \ NUL, tak použítím addcslashes a vynecháním ' se funkčnost tvého extractoru nezmění a opraví se chyba pri mergi katalogů.Takže nesouhlasím :), přijde mi čistější použít addcslashes a escapovat jenom " \ NUL…prostě vynechat
S tím pot
em – ono to nedělá merge, ale v podstatě to
vezme (imho) msgid
z pot
u a přiřadí mu to
msgstr
, přebývající klíče z původního souboru se prostě
vymažou.
Co se týče těch addcslashes
, tak je to skvělý nápad.
Momentálně GettextExtractor docela drasticky upravuji, tohle jsem již
implementoval. Další verze bude zas o trochu použitelnější.
A navíc – upravuji filtry tak, aby byly schopné kompletně lokalizovat i formuláře. S trochou štěstí tak během pár dnů vznikne řešení, které bude moci naprosto automaticky vytahovat řetězce pro překlad z celé aplikace.
Mám akorát jediné dilema, a to, jak se postavit k plurálům… Asi je
zatím nebudu vůbec řešit, vždycky se to dá hardcodovat přímo do
po
souboru.
- wotaen
- Člen | 82
Karel:
S tím POTem je to stejně divné, páč bych čekal, že update from source a
update from POT se bude chovat stejně (akorát zdroj dat bude jiný), tohle je
ale výtka pro tvůrce Poeditu…
Možná by stálo za zvážení jestli k tomu extractoru neudělat nějaký jednoduchý PO editor, ať překladatel nemusí nic instalovat ;)
Editoval wotaen (22. 10. 2009 11:04)
- Karel Klíma
- Člen | 31
wotaen napsal(a):
Možná by stálo za zvážení jestli k tomu extractoru neudělat nějaký jednoduchý PO editor, ať překladatel nemusí nic instalovat ;)
To už by pak bylo řešení, které by s gettextem mělo opravdu pramálo společného :-) Uvažoval jsem v minulosti nad něčím podobným, ale nechci zbytečně přicházet s novým standardem. Navíc je tady opět ten faktor kompilace kódu do binární podoby. Jak tak o tom přemýšlím, tak nejlepší by bylo udělat klasickou array syntax s editorem – sice by se to bez editoru upravovalo hůř, ale běhalo by to daleko rychleji než tohle binární parsování.
Ještě bych rád upozornil, že vyšla nová verze GettextExtractoru, viz Kompletní lokalizace Nette aplikací – GettextExtractor v2
- iguana007
- Člen | 970
Podařilo se Vám někomu rozchodit aktualizaci katalogu v Poeditu pod Win 7 ? Myslím tím problém s CLI … výše uvedené návody mi nepomohly …
Používám XAMPP 1.7.1 s PHP 5.2.9 – zkoušel jsem nahradit knihovny mysqli a mysql z balíčku PHP 5.2.12 zip package
igi
Editoval iguana007 (11. 1. 2010 1:50)
- musa
- Člen | 28
Ahoj, u GettextTranslatoru se píše, že není vhodný pro produkční nasazení. Jaké úpravy je nutné tedy udělat pro produkční nasazení? Jaký translator použít, když v celé aplikaci používám právě GettextTranslator?
Druhý dotaz, je nějak v dohlednu zanesení parametrizovaných překladů (například u validačních pravidel – „Vstup musí být mezi %d a %d“). Pokud ne, jak to řešíte?
Díky!
- redhead
- Člen | 1313
co se týče první otázky: je dobré celý objekt cachovat, aby neparsovala ten soubor při každém requestu, např.:
public function getTranslator()
{
$cache = Environment::getCache('myApp');
if(!$cache['translator']) {
$translator = new GettextTranslator('locale.cs.mo');
$cache['translator'] = $translator;
}
return $cache['translator'];
}
snad je to dobře…
- iguana007
- Člen | 970
Chtěl bych se zeptat, zda-li někdo netušíte, proč mi POEdit někdy nenajde změněné fráze v templatech? Např. dnes jsem změnil v jedne template toto:
<h3>{!_"Galerie"}:</h3>
za toto
<h3>{!_"Galerie nejpovedenějších výtvorů"}:</h3>
… a po aktualizaci katalogu v POEditu mi to nahlásilo, že jsem odstranil frázi „Galerie“, ale to, že tam mám nově tu druhou už neřešil. Toto se mi stává docela často, netušíte co s tím?
Používám postup uvedený v návodu na začátku tohoto vlákna a GettextExtractor revize 2, 16.2.2009
Díky za každou radu …
- saamo
- Člen | 1
iguana007 napsal(a):
Chtěl bych se zeptat, zda-li někdo netušíte, proč mi POEdit někdy nenajde změněné fráze v templatech? Např. dnes jsem změnil v jedne template toto:
<h3>{!_"Galerie"}:</h3>
za toto
<h3>{!_"Galerie nejpovedenějších výtvorů"}:</h3>
… a po aktualizaci katalogu v POEditu mi to nahlásilo, že jsem odstranil frázi „Galerie“, ale to, že tam mám nově tu druhou už neřešil. Toto se mi stává docela často, netušíte co s tím?
Používám postup uvedený v návodu na začátku tohoto vlákna a GettextExtractor revize 2, 16.2.2009
Díky za každou radu …
Nevím, jestli to je už OT, ale zjistil jsem, že to nenajde řetězce, které
- obsahují slovo delší než 14 znaků (což se vztahuje k tomu „nejpovedenějších“),
- když je na jednom řádku více než jeden překlad (ale jsou tam výjimky…).
Nezbývá nic jiného, než upravit si ten regulární výraz ;-)