Překlady s vloženou proměnnou

ondrejd
Člen | 22
+
+1
-

Dobrý den, můžu se zeptat, jak v Latte/Nette použít něco, co např. v šabloně pro Zend Framework napíšu takto:

Pro jednoduchou věc je např. toto:

<p><?= sprintf( _( "Some translation with number %d", "namespace" ), 15 ) ) ?></p>

Pro plurály toto:

<p><?= sprintf( _n( '%s item', '%s items', $total_items, "namespace" ), number_format_i18n( $total_items ) ) ?></p>

Mám zděděnou aplikace, která je založena na Latte/Nette a protože předchozí aplikace (ze které jsou použity kusy kódů) používá gettext, tak i tady bych velmi rád použil kombinaci Gettext+Poedit (protože, jak tady někdo ve fóru zmínil, tak řešení, kdy do jakéhosi neonu strkám překlady mi přijde velmi nešťastný (viz. zde) – potřebuji aplikaci překládat pro více jazyků a nejlepší je rozeslat prostě po/mo soubory a lidé si to v gettextu přeloží a mně pošlou nazpět).

Editoval ondrejd (18. 2. 2019 16:15)

Kamil Valenta
Člen | 758
+
0
-

Napiš si vlastní Translator, který implementuje \Nette\Localization\ITranslator.

V metodě translate si předávej translate($message, …$replacements)

a na jejím konci si vrať:

if (count($replacements) > 0)
{
    $replace_message = vsprintf($message, $replacements);
    if ($replace_message !== false)
    {
        $message = $replace_message;
    }
}

V šabloně pak budeš mít:

{_"Toto je číslo %d, které není součástí překladu.", 15}

Editoval kamil_v (18. 2. 2019 15:30)

ondrejd
Člen | 22
+
0
-

kamil_v napsal(a):

Napiš si vlastní Translator, který implementuje \Nette\Localization\ITranslator.

Dobře, díky, sice přesně tomu jsem se chtěl vyhnout, ale když to jinak nepůjde…

Ještě bych měl jeden dotaz, v normálním PHP projektu si připravím POT file, kde je v hlavičce i toto (viz. např. zde):

`
„X-Poedit-KeywordsList: "
“__;_e;esc_html_e;„
"esc_html_x:1,2c;“
„esc_html__;esc_attr_e;“
„esc_attr_x:1,2c;“
„esc_attr__;_ex:1,2c;“
„_nx:4c,1,2;“
„_nx_noop:4c,1,2;_x:1,2c;“
„_n:1,2;_n_noop:1,2;“
„__ngettext:1,2;“
„__ngettext_noop:1,2;_c,“
„_nc:4c,1,2\n“
`

Což mi označuje funkce, které pak gettext bere, jako ty, které nesou překlad (i s rozlišením plurálu, komentáři atp…) → nevíte, jak toto funguje pro Latte?

Editoval ondrejd (18. 2. 2019 15:37)

neznamy_uzivatel
Člen | 115
+
+1
-

Používám Kdyby/Translation (https://github.com/…/Translation)
překlady v neonech:
blbiny.neon:

prekladneceho: "Budeš vydělávat %masakry% Kč každej měsíc!"

latte:

<p>
  {_blbiny.prekladneceho,  ['masakry' => '1.50']}
</p>
ondrejd
Člen | 22
+
0
-

neznamy_uzivatel napsal(a):

Používám Kdyby/Translation (https://github.com/…/Translation)
překlady v neonech:
blbiny.neon:

prekladneceho: "Budeš vydělávat %masakry% Kč každej měsíc!"

latte:

<p>
  {_blbiny.prekladneceho,  ['masakry' => '1.50']}
</p>

Jak jsem psal v úvodním dotazu, velmi rád bych zachoval systém PO/MO souborů → pokud lokalizátorovi pošlu NEON, tak to skončí katastrofou, protože jsou všichni zvyklí na Poedit.

Nehledě na to, že Gettext toho umí prostě víc → v tom Poeditu mají i vizuálně krásně ukázány verze s plurály, mohu tam i do zdrojáků přidat poznámku, která se pak lokalizátorovi v Poeditu znovu objeví (např. Nepřekládat atp.)

Navíc je Gettext de facto průmyslový standard pro překlady ve světě open-source → nerad bych vymýšlel znovu kolo, obzvláště pokud bude mít místo gumy jen dřevěný ráfky…

Editoval ondrejd (18. 2. 2019 15:41)

neznamy_uzivatel
Člen | 115
+
0
-

Ono to je založené na Symfony/Translation a .mo .po tam lze použít.
Já to používám s tím neonem, protože je generujeme z administrace z blbuvzdorného prostředí pro překlady :)

Editoval neznamy_uzivatel (18. 2. 2019 15:54)

ondrejd
Člen | 22
+
0
-

neznamy_uzivatel napsal(a):

Ono to je založené na Symfony/Translation a .mo .po tam lze použít.
Já to používám s tím neonem, protože je generujeme je z administrace z blbuvzdorného prostředí pro překlady :)

V zásadě jde po/mo použít, to vím, ale u jiných projektů, prostě otevřu Poedit, nastavím nový projekt, nastavím jazyk, kódování a cestu ke zdrojákům. Dle keywords mi to ty zdrojáky projde a vytvoří základní POT soubor → při změně ve zdrojácích, to zase v Poeditu jen aktualizuju a hned vidím (a překladatelé) řetězce k přeložení. Nešlo by něco takto jednoduchého?

Editoval ondrejd (18. 2. 2019 16:15)

Milo
Nette Core | 1283
+
0
-

Asi by šlo napsat vlastní makro, které se bude překládat na gettext funkce a potom scanovat zkompilovane sablony.

Ale to jen střílím od boku, gettext jsem nikdy poradne nepouzil.

ondrejd
Člen | 22
+
0
-

Rozumím, díky všem za odpovědi, holt s tím budu muset bojovat sám. Velká škoda, že někdo považoval za zlepšení narvat Nette/Latte do čistého Zend Framework projektu – ale s tím už nic nenadělám.

Martk
Člen | 652
+
+1
-

Máš několik možností:

  1. Extrahovat přes svůj skript překlady do .php souboru

„Vytvořit“ si vlastní extrátor v po editu a

  1. Vytvořit si makro a můžeš psát takhle
{_ 'Some translation with number %d', [15]}
  1. Psát to takhle
<p>{ sprintf( _( "Some translation with number %d", "namespace" ), 15 ) ) }</p>

A asi nejlepší řešením je inspirovat se a napsat podle tohoto extrátor pro latte, imho to bude velmi podobné.

Editoval Martk (19. 2. 2019 13:26)

ondrejd
Člen | 22
+
0
-

Martk napsal(a):

Máš několik možností:

  1. Extrahovat přes svůj skript překlady do .php souboru

„Vytvořit“ si vlastní extrátor v po editu a

  1. Vytvořit si makro a můžeš psát takhle
{_ 'Some translation with number %d', [15]}
  1. Psát to takhle
<p>{ sprintf( _( "Some translation with number %d", "namespace" ), 15 ) ) }</p>

A asi nejlepší řešením je inspirovat se a napsat podle tohoto extrátor pro latte, imho to bude velmi podobné.

Díky za odpověď, nicméně:

add 1) přesně tohle dělal gettext sám o sobě, ne nutnost psát další PHP skript (protože už i tak mám práce dost)
add 2) tak toto by mě zajímalo, ale jen ze zvědavosti – znovu psát extraktor je vynalézání kola, které už fungovalo
add 3) takto to řeším teď, jen by mě zajímalo, na co mi vlastně to Latte je, když ho budu obcházet :( → ale zatím to tak nadále řešit budu, protože stále trvám na tom, že nechci vynalézat nové kolo (extraktor), ale použít normálně fungující Gettext, který PHP běžně zpracovává.

Bohužel toto je nevýhoda frameworků dělaných na koleni jedním člověkem – tam, kde existuje nějaký standard (gettext), by měl být použit, ovšem autor frameworku má pochopitelně právo si to „dělat po svém“… já pak musím prostě zatnout zuby. Jen nepochopím, proč někdo z neznalosti angličtiny a neschopnosti naučit se profesionální framework, který notabene dělá stejná firma, jako nejpoužívanější PHP interpret, tam našroubuje jiný, a když zjistí, že to nezvládne tak zdrhne a někdo jiný to pak musí řešit a nachází věci, které prostě dobré řešení nemají, protože každý asi chápe, že ve firmě mi nedají rok na to, abych to zase přepsal.

Každopádně, ať nevypadám tak mrzoutsky → děkuju za snahu mi odpovědět → tzn. díky.

Editoval ondrejd (19. 2. 2019 13:49)

ondrejd
Člen | 22
+
0
-

Martk napsal(a):

A asi nejlepší řešením je inspirovat se a napsat podle tohoto extrátor pro latte, imho to bude velmi podobné.

Jo, toto bude možná nejlepší → asi to opravdu ve volném čase adaptuju na Latte. Díky!

Martk
Člen | 652
+
0
-

Mimo téma

Není to vynalézání kola, protože žádný extrátor pro latte neexistuje.

Pleteš si to, latte není gettext extrátor, ale template engine, takže nevím o jakém obcházení tu je řeč. Když jsem se v rychlosti podíval na zend 3, tak to jsou php soubory, a dávají tam jen funkce navíc… Proto poedit to extrahuje bez problému, kdyby používal template engine, tak si taky musí (někdo z komunity) vytvořit vlastní extrátor.

Další důležitá věc, že zend framework nevede vývoj php.

K tématu

Potřebovat to, tak to klidně vytvořím, takhle nemám důvod. Funguje to na úplně jednoduchém principu, nástroj zkompiluje přes template engine soubory do *.php a pak to projede jen xgettextem.

ondrejd
Člen | 22
+
-7
-

Martk napsal(a):

Mimo téma

Není to vynalézání kola, protože žádný extrátor pro latte neexistuje.

Pleteš si to, latte není gettext extrátor, ale template engine, takže nevím o jakém obcházení tu je řeč. Když jsem se v rychlosti podíval na zend 3, tak to jsou php soubory, a dávají tam jen funkce navíc… Proto poedit to extrahuje bez problému, kdyby používal template engine, tak si taky musí (někdo z komunity) vytvořit vlastní extrátor.

Další důležitá věc, že zend framework nevede vývoj php.

K tématu

Potřebovat to, tak to klidně vytvořím, takhle nemám důvod. Funguje to na úplně jednoduchém principu, nástroj zkompiluje přes template engine soubory do *.php a pak to projede jen xgettextem.

Právě, tady jde o to, že Gettext samotný mi rozhodně Latte nepřečte a musím vymýšlet jakýsi workaround, ZF používá normální PHP soubory jako šablony, tam to funguje bez problémů → ostatně nerozumím tomu, proč v šablonovacím jazyce (a tím PHP de facto je) ještě vynalézat šablony, když vše zvládne PHP samotné. A pokud někdo bude jako důvod uvádět to, že nechce aby se mu frontenďáci hrabali v PHP tak se můžu jen smát, protože Latte je rozhodně výrazně méně přehledné (včetně chybějícího/nevyhovujícího syntaxhiglightingu ve většině editorů/IDE), takže běžnej frontenďák rozhodně bude radši za pěkně napsané HTML + PHP než za Latte (dle mé zkušenosti). Stejně tak i důvod bezpečnosti je passé → každá další vrstva přináší dle Murphyho zákonů další chyby…

Ale máš pravdu, moje stížnosti jsou naprosto zbytečné, stav je takový, že se s tím poprat musím a také to udělám.

Editoval ondrejd (19. 2. 2019 14:48)

David Matějka
Moderator | 6445
+
+1
-

proč v šablonovacím jazyce (a tím PHP de facto je) ještě vynalézat šablony, když vše zvládne PHP samotné

protože PHP je velmi špatný jazyk pro psaní šablon. proto skoro každý (člověk i fw) používá nějaký šablonovací systém – ať už latte, twig nebo blade.

včetně chybějícího/nevyhovujícího syntaxhiglightingu ve většině editorů/IDE

ve kterých?

takže běžnej frontenďák rozhodně bude radši za pěkně napsané HTML + PHP než za Latte (dle mé zkušenosti).

dle mé zkušenosti je to naopak. a označovat šablony napsané v čistém html + php za pěkné.. no..

Stejně tak i důvod bezpečnosti je passé → každá další vrstva přináší dle Murphyho zákonů další chyby…

tak tahle poznámka už je úplně mimo.


opravdu ti připadá následující kód přehlednější:

<?php if ($items): ?>
	<?php $counter = 1 ?>
	<ul>
	<?php foreach ($items as $item): ?>
		<li id="item-<?php echo $counter++ ?>"><?php
		echo htmlSpecialChars(mb_convert_case($item, MB_CASE_TITLE)) ?>
		</li>
	<?php endforeach ?>
	</ul>
<?php endif?>

než

<ul n:if="$items">
{foreach $items as $item}
	<li id="item-{$iterator->counter}">{$item|capitalize}</li>
{/foreach}
</ul>
ondrejd
Člen | 22
+
0
-

K těm editorům – nejlepších výsledků jsem dosáhl v Netbeans (ale i ten mi občas ukazuje chybu i když mi to normálně v aplikaci projde), ale jakých? Gedit, Geany, Visual Studio Code, Vim → více jich nepoužívám.

Šablony → na to má každý jiný názor, nikomu jeho neberu.

A Murphyho zákony, že jsou mimo? V každém kusu kódu je chyba, tzn. více kusů kódů znamená více chyb.

Ten tvůj první kód bych napsal mírně jinak:

<?php if ($items): $counter = 1 ?>
	<ul>
	<?php foreach ($items as $item): ?>
		<li id="item-<?= $counter++ ?>">
			<?= htmlSpecialChars(mb_convert_case($item, MB_CASE_TITLE)) ?>
 		</li>
 	<?php endforeach ?>
 	</ul>
<?php endif?>

A pak ano, přijde :) … ale zase, je to jen věc subjektivního názoru.

Jinak, já tu nechci rozpoutat nějaké flame wars, takže všem díky za radu a pokud jsem se někoho dotkl svým negativním přístupem k Nette/Latte, které prostě bohužel musím teď používat, tak se omlouvám. Prostě po letech se ZF, čistým PHP (i na konfigurační soubory) jsem mírně alergický na vynálezy jako je Neon či Latte. Tak to prostě je → ale jak píšu, nikomu jeho názor neberu a uznávám, že v ČR je Nette používané a v zásadě je i použitelné (např. chybové hlášky, když něco dělám špatně, nebo postaru, jsou opravdu výborné).

Ještě dodám, že s PHP jsem začal někdy okolo 2002, je mi 37 a když přišel ZF1, tak už jsem žádný jiný framework používat nechtěl (nepočítaje Slim :)).

Také mám jednoznačný názor, že je lepší používat framework od firmy, která dělá i nejpoužívanější PHP interpret a hlavně Nette se nikdy nemůže rovnat ZF v počtu vývojářů, scénářů použití, dokumentaci atp. → tam to prostě je jiná liga. A pokud mi pak kolega v práci začne vykládat, že Laďenka je lepší než Zend Debugger, no tak to jdu do kolen… :)

Editoval ondrejd (19. 2. 2019 15:43)

David Matějka
Moderator | 6445
+
0
-

A Murphyho zákony, že jsou mimo? V každém kusu kódu je chyba, tzn. více kusů kódů znamená více chyb.

skoro bych řekl, že jen tím, že šablony neobsahují milionkrát htmlSpecialChars, tak to ušetřilo víc kódu, než je v celém latte :)

ondrejd
Člen | 22
+
0
-

David Matějka napsal(a):

A Murphyho zákony, že jsou mimo? V každém kusu kódu je chyba, tzn. více kusů kódů znamená více chyb.

skoro bych řekl, že jen tím, že šablony neobsahují milionkrát htmlSpecialChars, tak to ušetřilo víc kódu, než je v celém latte :)

:) no, tak o tom pochybuju, ale jak jsem psal, ctím tvůj názor, i když s ním nesouhlasím.

David Matějka
Moderator | 6445
+
0
-

že je lepší používat framework od firmy, která dělá i nejpoužívanější PHP interpret

role zendu ve vývoji php engine není (již) tak významná, doporučuji přečíst http://zsuraski.blogspot.com/…nd-zend.html … navíc je to úplně nerelevantní argument k nette vs zend fw

A pokud mi pak kolega v práci začne vykládat, že Laďenka je lepší než Zend Debugger, no tak to jdu do kolen

tim je myšlený ta php extension, co řeší debugging? to je ale docela jiný use case, než co řeší laděnka

ondrejd
Člen | 22
+
0
-

David Matějka napsal(a):

že je lepší používat framework od firmy, která dělá i nejpoužívanější PHP interpret

role zendu ve vývoji php engine není (již) tak významná, doporučuji přečíst http://zsuraski.blogspot.com/…nd-zend.html … navíc je to úplně nerelevantní argument k nette vs zend fw

A pokud mi pak kolega v práci začne vykládat, že Laďenka je lepší než Zend Debugger, no tak to jdu do kolen

tim je myšlený ta php extension, co řeší debugging? to je ale docela jiný use case, než co řeší laděnka

Že je to nerelevantní argument? Myslím si pravý opak… Že je nerelativní množství vývojářů, testerů, použití, dokumentace atp., to si také nemyslím, právě naopak…

Ten post jsem si přečetl (ale to o té akvizici jsem už věděl), ale i pak nebudu přecházet od ZF k něčemu, co vyvíjí pár lidí, takže budu doufat, že Zend Framework či na něm postavený Zend Expressive bude nadále vyvíjen, v opačném případě si pak udělám rešerši, co použít… Tak jako tak hlavní kritéria jsou tyto:

  • množství použití (https://packagist.org/ naštěstí má statistiky)
  • množství vývojářů podílejících se na vývoji (a zastřešující organizace)
  • množství dostupnosti dokumentace v EN

Editoval ondrejd (19. 2. 2019 16:10)

David Grudl
Nette Core | 8111
+
+4
-

Pokud si chceš něco přečíst o výhodách Latte, doporučuji https://latte.nette.org/. Má skvělou dokumentaci, stejně jako zbytek Nette. Během existence Nette v něm bylo objeveno naprosté jen minimum bezpečnostních chyb. Jak vidíš, i v malém týmu se dá dělat framework, který si nic nezadá se světovou konkurencí.

h4kuna
Backer | 740
+
+1
-

@ondrejd Aby jsi nezačínal se psaním na zelený louce mám tu vytvořený překladač pro gettext, ale už ho nepoužívám takže není udržovaný. Nicméně řeší spoustu věcí co jsi psal
Pokud chceš klidně ti repozitář přenechám nebo odbavím PR.

Osobně bych použil symfony/translator má výhody v tom že s těmy slovníky se lépe manipuluje.

ondrejd
Člen | 22
+
0
-

David Grudl napsal(a):

Pokud si chceš něco přečíst o výhodách Latte, doporučuji https://latte.nette.org/. Má skvělou dokumentaci, stejně jako zbytek Nette. Během existence Nette v něm bylo objeveno naprosté jen minimum bezpečnostních chyb. Jak vidíš, i v malém týmu se dá dělat framework, který si nic nezadá se světovou konkurencí.

V tomto vaše úsilí vůbec nezpochybňuji, mně samotné Nette problémy nedělá, jen mi vadí drobnosti na které nejsem zvyklý :) → jako je to Latte (např. stylování formulářů ve spojitosti s Bootstrapem, musím říci, že s láskou vzpomínám na stařičký Zend_Form_Decorator → to bylo jedno z nejfunkčnějších řešení tohoto problému), další věc jsou ty lokalizace, prostě nepochopím, proč vymýšlet kolo, když tu máme Gettext. A Neon? Schéma k tomu nepřipojím, čitelný je to stejně jako prostý PHP soubor s polem, takže nevidím žádný přínos.

Každopádně zrovna Vás bych si kritizovat nedovolil :)

Ještě bych dodal, že část z mých poznámek vznikla z frustrace, kdy na vás tlačí manager a před sebou máte kód, kdy předchozí programátor, řešil problémy novým frameworkem/knihovnou (např. tu byly tři adaptéry pro db – původní ZF, pak 2× použito Nette/Db a do toho ještě Illuminate …), to samé ve všech ostatních částech (nejen PHP, ale i JS či CSS) a vyčistit to, když tu službu používá tisíce lidí, aby mohl vývoj pokračovat je prostě opruz :) … nehledě na to, že z mého pohledu přiroubovat k ZF Nette nedává smysl, protože oba frameworky vyznávají jinou filozofii a není nic co by Nette přinášelo a ZF nezvládlo… to neznamená, že nevidím kolik kvalitní práce za Nette je… Znovu se omlouvám jestli jsem se Vás dotkl.

Editoval ondrejd (20. 2. 2019 9:48)

ondrejd
Člen | 22
+
0
-

h4kuna napsal(a):

@ondrejd Aby jsi nezačínal se psaním na zelený louce mám tu vytvořený překladač pro gettext, ale už ho nepoužívám takže není udržovaný. Nicméně řeší spoustu věcí co jsi psal
Pokud chceš klidně ti repozitář přenechám nebo odbavím PR.

Osobně bych použil symfony/translator má výhody v tom že s těmy slovníky se lépe manipuluje.

A neposlal by jsi mi pls. odkaz na tu repozitory? Díky.

Roman Halaxa
Člen | 60
+
+1
-

ondrejd napsal(a):

h4kuna napsal(a):

@ondrejd Aby jsi nezačínal se psaním na zelený louce mám tu vytvořený překladač pro gettext, ale už ho nepoužívám takže není udržovaný. Nicméně řeší spoustu věcí co jsi psal
Pokud chceš klidně ti repozitář přenechám nebo odbavím PR.

Osobně bych použil symfony/translator má výhody v tom že s těmy slovníky se lépe manipuluje.

A neposlal by jsi mi pls. odkaz na tu repozitory? Díky.

Máš ho v té jeho odpovědi, byť trochu nešťastně umístěný :D Zde je

ondrejd
Člen | 22
+
0
-

Roman Halaxa napsal(a):

ondrejd napsal(a):

h4kuna napsal(a):

@ondrejd Aby jsi nezačínal se psaním na zelený louce mám tu vytvořený překladač pro gettext, ale už ho nepoužívám takže není udržovaný. Nicméně řeší spoustu věcí co jsi psal
Pokud chceš klidně ti repozitář přenechám nebo odbavím PR.

Osobně bych použil symfony/translator má výhody v tom že s těmy slovníky se lépe manipuluje.

A neposlal by jsi mi pls. odkaz na tu repozitory? Díky.

Máš ho v té jeho odpovědi, byť trochu nešťastně umístěný :D Zde je

Fíha, to vypadá opravdu pěkně. Nahodím jako task manažerovi do Asany a po schválení použiju :) … díky!