Gettext + Poedit + Nette – konečné řešení lokalizace

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
norbe
Backer | 405
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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 potem – ono to nedělá merge, ale v podstatě to vezme (imho) msgid z potu 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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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!

norbe
Backer | 405
+
0
-

Já to řeším pomocí vsprintf("Zadali jste %s", $string)

redhead
Člen | 1313
+
0
-

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
+
0
-

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
+
0
-

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é

  1. obsahují slovo delší než 14 znaků (což se vztahuje k tomu „nejpovedenějších“),
  2. 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 ;-)

pjoter
Člen | 118
+
0
-

Nikde jsem nenasel jestli je mozne pri generovani po souboru neprepisovat u shodnych polozek preklady. Cloveka docela nebavi prekladat vsechno znovu kdyz napriklad prida pouze novy formular.

Neporadil by nekdo jak na to prosim?

voda
Člen | 561
+
0
-

@pjoter: Nevím jak to generuješ, ale normálně se samozřejmě nic nepřepisuje. Správně by sis měl nejdřív vygenerovat .pot šablonu (všechny texty ze zdrojáků) a potom aktualizovat .po soubor s překlady (msgmerge).