NetteTranslator (GettextTranslator & Nette Translation Panel)

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

Před tím, než se začne překládat, je potřeba přidat soubory:

$translator = Nette\Environment::getService('Nette\ITranslator');

$translator->addFile('%appDir%/models/lang', 'model');	// Složka %appDir%/models/lang, jazyk se vybere podle aktuálního a jednoznačný identifikátor tohoto souboru je 'model'.
$translator->addFile('%libsDir%/somelib/Translator', 'core');

// Dál se překládá normálně
dump(__('This is translation text'));

Přidané jazykové soubory se načítají všechny naráz při jakémkoliv požadavku na přístup k translatoru, v panelu se přepíná soubor, do něhož se budou stringy ukládat. Udělat per-layer překladač nebylo mým cílem a proto to ani můj fork nepodporuje.

Lopo
Člen | 277
+
0
-

prave som doportoval Translator do mojho BailIff-u …

oproti povodnemu som ho rozsiril:

  • automaticke doplnenie plural pravidla podla jazyka pri vytvarani PO suboru
  • viacere adresare/subory pre preklady uz v configu (minimalizuje potrebu addFile())

https://github.com/…c8d6b3872ec1

ldown
Člen | 29
+
0
-

Narazil jsem na chybu:
když použiji translator na formulář kde mám nějaký SelectBox, a ten obsahuje řetězec se znakem % (procento), pak to vyhodí warning: vsprintf(): Too few arguments

file: NetteTranslator/Gettext.php , line: 256

ic
Člen | 430
+
0
-

Nějak to teď nespolupracuje s novou verzí nette zkoušel jsem (různé verze NetteTranslator-u, včetně té která mi krásně funguje na starším nette version 2.0-dev 3f959be released on 2010-10-27) nasadit na verzi 2.0-dev 9f535f9 released on 2011-01-10 a celá aplikace se zasekne… prohlížeč načítání po určité době zastaví, ale když zkusím vypsat zdrojový kód tak ani ten nedostanu, jen nekonečné načítání, takže chyba bude asi na straně serveru. Tohle se špatně hledá, když nedostanu ani chybu. I pokus nasadit NetteTranslator na nějakou ‚demo‘ ukázku z nové verze nette bohužel končí stejně. Prekérní situace.

Nox
Člen | 378
+
0
-

Aplikovals na to tools\Code-Migration\class_update.php? (https://phpfashion.com/…tory-v-nette)

Patrik Votoček
Člen | 2221
+
0
-

nemám v plánu upravovat tuhle verzi pro nové Nette… Protože do PoSobota chci vydat verzi novou

ic
Člen | 430
+
0
-

@Nox zkoušel jsem jak ty starší (2.0-dev 9f535f9 má ještě ‚staré‘ jmenné prostory) tak i ty nové, ale stále stejné.

@Patrik Votoček tak já se budu těšit na novou verzi :-)

Nox
Člen | 378
+
0
-

Ne Nette, ale aplikaci toho nástroje na NetteTranslator, nevim jestli využívá nějakou změněnou cestu…ale jestli jo tak by bylo třeba to na to aplikovat

Zatím jsem nezkoušel překlad, ale minimálně panel se mi zobrazuje

ic
Člen | 430
+
0
-

Nox napsal(a):

Ne Nette, ale aplikaci toho nástroje na NetteTranslator, nevim jestli využívá nějakou změněnou cestu…ale jestli jo tak by bylo třeba to na to aplikovat

Zatím jsem nezkoušel překlad, ale minimálně panel se mi zobrazuje

To už jsi dál než já XD … mě to aplikace funguje jen do té doby než zobrazím panel, pak to celé zatuhne.

iguana007
Člen | 970
+
0
-

Nepodařilo se pls někomu vyřešit to nekonečné načítání nového okna po submitu překladu?
Panel mi normálně najede, zadám překlad/y odešlu to a otevře se mi nové okno, které se donekonečna načítá a v původním okně se mi ve Firebugu zobrazí chyba 500: InvalidStateException: Language file(s) must be defined.

Zkoumal jsem zdrojáky a myslím, že soubory mám vytvořené správně – ostatně by mi to asi nenabídlo fráze k překladu.

Do BasePresenteru jsem si dal:

$translator = Nette\Environment::getService('Nette\ITranslator');
$translator->addFile('%appDir%/lang/', 'frontend');

a soubory ve složce lang se mi jmenují: en.frontend.mo a en.frontend.po

Nette používám verzi: 2.0-dev 3b038ac released on 2011–02–17
Díky za jakoukoli radu.

Aurielle
Člen | 1281
+
0
-

Není BasePresenter na tohle už pozdě? Protože volání téhle funkce se spouští v aplikaci jako jedno z prvních (hned při načtení DebugBaru) a tím pádem se to k BasePresenteru nedostane. Řešením je registrovat soubory v $app->onStartup;

iguana007
Člen | 970
+
0
-

Takže to mám dát už do bootstrapu?

Aurielle
Člen | 1281
+
0
-

Přesně. Já registruji soubory v podstatě v onStartup, stará se mi o to rozšířená Application…

iguana007
Člen | 970
+
0
-

no já to zkoušel a nepomohlo mi to – problém se projevuje pořád stějně

maikoo
Člen | 21
+
0
-

zdravím, potřeboval bych pomoct, ..dnes jsem si

  • stáhl 2alfa verzi nette
  • nahrál do libs knihovnu z prvního příspěvku/github
  • přidal do config.ini

variable.langDir = %appDir%/lang ; složka s překlady
variable.lang = cs_CZ ; výchozí jazyk
service.Nette-ITranslator.factory = „NetteTranslator\\Gettext::getTranslator“
service.Nette-ITranslator.run = TRUE

  • stáhl poedit a vygeneroval dva čisté soubory default.po/mo ..nahrál do ../lang
  • refresh …

Cannot instantiate service ‚Nette\ITranslator‘, handler ‚NetteTranslator\Gettext::getTranslator‘ is not callable.

Jak to celé „rozchodím“?
Udělal jsem někde chybu?

děkuji za všechny připomínky

iguana007
Člen | 970
+
0
-

Smazal si temp? Tj. aby se ti prenacetly libs?

maikoo
Člen | 21
+
0
-

ano temp je prázdný

iguana007
Člen | 970
+
0
-

používáš 5.2 nebo 5.3 verzi Nette? Podle configu to vypadá na 5.3, ale radši se ptám…

maikoo
Člen | 21
+
0
-

5.3 hele změná už není chyba)) .. udělal jsem následující zaměnil jsem pořadí v configu z

service.Nette-ITranslator.factory = "NetteTranslator\\Gettext::getTranslator"
service.Nette-ITranslator.run = TRUE
service.Nette-Application-Application.option.class = BootApplication
;service.Nette-Security-IAuthenticator = UsersModel
service.Nette-Loaders-RobotLoader.option.directory[] = %appDir%
service.Nette-Loaders-RobotLoader.option.directory[] = %libsDir%
service.Nette-Loaders-RobotLoader.run = TRUE

na

service.Nette-Application-Application.option.class = BootApplication
;service.Nette-Security-IAuthenticator = UsersModel
service.Nette-Loaders-RobotLoader.option.directory[] = %appDir%
service.Nette-Loaders-RobotLoader.option.directory[] = %libsDir%
service.Nette-Loaders-RobotLoader.run = TRUE
service.Nette-ITranslator.factory = "NetteTranslator\\Gettext::getTranslator"
service.Nette-ITranslator.run = TRUE

…chyba není ale jak to ted otestovat? ..
dal jsem do

  • layoutu {_"This is translation text"}
  • basePresenteru
protected function createTemplate()
{
    $template = parent::createTemplate();
    $template->setTranslator(\Nette\Environment::getService('Nette\ITranslator'));
    return $template;
}

vypíše to .. This is translation text

  • což je OK? .. jak to přeložim? .. v toolbaru nemám „translations“
  • nebo něco mi ještě chybí?)

..díky

Editoval maikoo (11. 5. 2011 13:21)

maikoo
Člen | 21
+
0
-

tak už to mám chyblo mi

Nette\Debug::addPanel(new \NetteTranslator\Panel($translator));

ikdyž se to chová nějak podivně ale to bude asi mnou .. zkusím to nějak vykoumat-D

samuel
Člen | 3
+
0
-

Ahoj.

Chtěl jsem to ozkoušet ale nejde to stáhnout … hází to 404 … mohl by mi to někdo poslat na email samuel.czeko@seznam.cz?

Díky

Edit Vrtak-CZ: co to kua bylo za ulet?

22
Člen | 1478
+
0
-

je nutný kopírovat půlku fóra kvůli jedné větě?

Filip Procházka
Moderator | 4668
+
0
-

Nikdo ti nic posílat na email nebude. A je od tebe velice sobecké takové žádosti vůbec vypouštět do světa. Nechtěl bys to na stříbrném podnose naservírovat třeba? Tohle mě fakt dokáže vytočit… Prej „pošlete mi to na mail, díky“ … Ještěže nejsem moderátor, za takové věci bych dával ban

Kdyby jsi si s tím dal jenom minimum práce, tak zjistíš že Patrik dělá na Nella Framework a ten panel jde najít zde: https://github.com/Nella/framework

Editoval HosipLan (25. 6. 2011 12:23)

samuel
Člen | 3
+
0
-

Omlouvám se. Jsem tu novej a ještě se tu úplně neorientuju .....

HosipLan napsal(a):

Nikdo ti nic posílat na email nebude. A je od tebe velice sobecké takové žádosti vůbec vypouštět do světa. Nechtěl bys to na stříbrném podnose naservírovat třeba? Tohle mě fakt dokáže vytočit… Prej „pošlete mi to na mail, díky“ … Ještěže nejsem moderátor, za takové věci bych dával ban

Kdyby jsi si s tím dal jenom minimum práce, tak zjistíš že Patrik dělá na Nella Framework a ten panel jde najít zde: https://github.com/Nella/framework

22
Člen | 1478
+
0
-

je nutný kopírovat půlku fóra kvůli jedné větě?

samuel
Člen | 3
+
0
-

22 napsal(a):

je nutný kopírovat půlku fóra kvůli jedné větě?

To rozhodně není … zase na druhou stranu je dobré vidět k jakému příspěvku se to vztahuje …

22
Člen | 1478
+
0
-

úplně bohatě v takovémto případě stačí napsat např. @Hosiplan+ tvůj obsah sdělení

Editoval 22 (25. 6. 2011 20:23)

MarekP
Člen | 3
+
0
-

Zdravím, používáte někdo translator z nella fw? Chtěl jsem ho použít na stránkách ale nějak nefunguje translator panel. Překlad funguje, ale výrazy pro překlad, ze šablon a php skriptů se nenačtou do panelu. (tlačítko extract jsem použil).

Translator a translator panel jsem zaragistroval v configu:

translator:
	class: Nella\Localization\Translator

translatorPanel:
	class: Nella\Localization\Panel
        arguments: ['@myContext']
        run: true

V bootstrapu mám přidaný slovník:

$container->translator->addDictionary('front', APP_DIR);

a v basePresenteru mám zaregistrovaný překladač pro šablony:

$this->template->setTranslator($this->context->translator);

v šablonách překládám pomocí makra: {_'Nějaké slovo'}
Když už takové slovo mám přeložené ve slovníku tak se normálně zobrazí jeho překlad, ale pokud je nové tak se zobrazí originál, ale v translator panelu se nezobrazí, abych ho mohl přeložit. Nevíte někdo jestli jsem na něco zapomněl nebo něco dělám špatně?

PS: zkusil jsem použít nella-sandbox, přidal jsem do toho slovník pro složku app.
Do template jsem pak přidal nejaký výraz pro překlad. Ten se ale taky nezobrazil v translator panelu, zobrazily se tam enom výrazy z formulářů co jsou ve složce nella. Tak nevím jestli je chyba u mně nebo někde jinde.

janci
Člen | 5
+
0
-

Takže akurát sa mi podarilo prísť na to, že kde je problém v Nella Translatore (resp. v Paneli). Prečo nenájde žiadne slová. Problém je v súbore Filters/Latte.php v metode process:
Momentálne sa parser vytvára ako nový objekt LatteParsera, ale keď to takto vytvoríme, tak nám chýbajú v parseri Nette makra.

$parser = new \Nette\Latte\Parser;
$macros = LatteMacros::install($parser);

Preto správne vytvorenie by malo byť:

$latte = new \Nette\Latte\Engine;
$parser = $latte->parser;
$macros = LatteMacros::install($parser);

Tento fix som robil vo verzií Location z 1.jula 2011

tany
Člen | 31
+
0
-

Zkouším toto aplikovat na testovací projekt (== Psací sandbox na práci s nette), postupoval jsem podle návodu, do config.neon jsem přidal:

translator:
factory: NetteTranslator\Gettext::getTranslator

a do bootstrapu:

Nette\Environment::getService('translator')->addFile('%appDir%/lang', 'model');
NetteTranslator\Panel::register($container, $container->translator);

script fungoval do chvíle, než jsem v panelu přeložil první řetězec (soubory s překladem jsem nevytvářel), po přeložení (a vytvoření souborů) mi gettext hlasí tuto chybu:

Undefined offset: 1

výstup z laděnky:

File: ...\app\plugins\Gettext.php   Line: 248
248:$this->metadata[$identifier][trim($tmp[0])] = count($tmp) > 2 ? ltrim(strstr($metadata, $pattern), $pattern) : $tmp[1];

Call stack:

Call stack ▼

    ...\app\plugins\Gettext.php:222 source ►  NetteTranslator\Gettext-> parseMetadata (arguments ►)

    ...\app\plugins\Gettext.php:152 source ►  NetteTranslator\Gettext-> parseFile (arguments ►)

    ...\app\plugins\Gettext.php:261 source ►  NetteTranslator\Gettext-> loadDictonary ()

    inner-code NetteTranslator\Gettext-> translate (arguments ►)

    ...\libs\Nette\common\Callback.php:98 source ►  call_user_func_array (arguments ►)

    ...\libs\Nette\Templating\Template.php:253 source ►  Nette\Callback-> invokeArgs (arguments ►)

    ...\temp\cache\_Nette.FileTemplate\_Admin.login.latte-f53cb41fcc95820410aea201cb992ab1.php:11 source ►  Nette\Templating\Template-> __call (arguments ►)

    ...\temp\cache\_Nette.FileTemplate\_Admin.login.latte-f53cb41fcc95820410aea201cb992ab1.php:11 source ►  Nette\Templating\FileTemplate-> translate (arguments ►)

    ...\libs\Nette\Latte\Macros\UIMacros.php:459 source ►  _lb05e8e96558_content (arguments ►)

    ...\temp\cache\_Nette.FileTemplate\_templates._admin.latte-370755053bc3ea694e443d2e2d2e505c.php:22 source ►  Nette\Latte\Macros\UIMacros:: callBlock (arguments ►)

    ...\libs\Nette\Utils\LimitedScope.php:70 source ►  include (arguments ►)

    ...\libs\Nette\Templating\FileTemplate.php:120 source ►  Nette\Utils\LimitedScope:: load (arguments ►)

    ...\temp\cache\_Nette.FileTemplate\_Admin.login.latte-f53cb41fcc95820410aea201cb992ab1.php:41 source ►  Nette\Templating\FileTemplate-> render ()

    ...\libs\Nette\Utils\LimitedScope.php:70 source ►  include (arguments ►)

    ...\libs\Nette\Templating\FileTemplate.php:120 source ►  Nette\Utils\LimitedScope:: load (arguments ►)

    ...\libs\Nette\Application\Responses\TextResponse.php:57 source ►  Nette\Templating\FileTemplate-> render ()

    ...\libs\Nette\Application\Application.php:144 source ►  Nette\Application\Responses\TextResponse-> send (arguments ►)

    ...\app\bootstrap.php:55 source ►  Nette\Application\Application-> run ()

    ...\www\index.php:15 source ►  require (arguments ►)

Nevíte někdo kde jsem udělal chybu ? Díky za odpověď
(přeloženy jsou české znaky, žádné speciální)

voda
Člen | 561
+
0
-

@tany: máš správně zapsáno Plural-Forms v .po souboru? Pro češtinu to je Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;.

tany
Člen | 31
+
0
-

@voda: no do po souboru sem se nehrabal vubec, to je poprve co je pouzivam. Zatim jsem si vystacil s csv a ini souborama. Jak googlim, tak sehnat nejaky editor na gettext je celkem problem .. nemas pls link na neco funkcniho ? Diky

ic
Člen | 430
+
0
-

tany napsal(a):

… Jak googlim, tak sehnat nejaky editor na gettext je celkem problem .. nemas pls link na neco funkcniho ? Diky

Poedit nebo něco podobného by mělo pomoct.

voda
Člen | 561
+
0
-

Stačí i normální textový editor, jinak Poedit je asi nejznámější. Nebo si vyber něco ze seznamu na wikipedii.

tany
Člen | 31
+
0
-

@voda: dík za help, už to funguje. Akorát mám problém, že mi to při použití v šabloně

{_'preloz si me'}

automaticky používá 2nd formu. Pro jistotu zde dávám i zdroj .po souboru

# Gettext keys exported by GettextTranslator and Translation Panel
# Created: 2011-10-23 02:50:35
msgid ""
msgstr ""
"Project-Id-Version: st\n"
"POT-Creation-Date: 2011-10-23 02:49+0100\n"
"PO-Revision-Date: 2011-10-23 02:50+0200\n"
"Language-Team: 3m\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n>=2 && n<=4 ? 1 : 2;\n"
"X-Poedit-Language: Czech\n"
"X-Poedit-Country: CZECH REPUBLIC\n"
"X-Poedit-KeywordsList: _;gettext;gettext_noop\n"


msgid "Title"
msgstr[0] "Název"
msgstr[1] "Názvy"
msgstr[2] "Názvů"

Editoval tany (23. 10. 2011 2:56)

awsickness
Člen | 98
+
0
-

EDIT jsem idiot :D
stacilo odmaznout locale
nejak jsem prehledl co vlastne ma delat ten dir.

Editoval awsickness (26. 10. 2011 14:01)

jeremy13
Člen | 18
+
0
-

Tak mám podobný problém, jako měl tany.
Jakmile pomocí translation panelu něco přeložím, tak po refreshi se mi vyhodí chyba:

Undefined offset: 1

Navíc, když se pokusím změnit Plural-Forms v .po souboru, tak se znova text v panelu tváří jako nepřeložen a po přeložení opět přepíše komplet .po soubor s nenastaveným Plural-Forms. používám aktuální stable verzi nette a rovněž mám stáhnutý aktuální NetteTranslator a už mě bohužel nenapadá, v čem by mohla být chyba. Jakoukoliv radu uvítám …

awsickness
Člen | 98
+
0
-

zdravim chtel bych se zeptat jak je to s podporou formularu. navesil jsem translator na formular a ted nevim zda tento translator umi pridavat dane stringy automaticky do po / mo souboru pripadne do panelu k prekladu nebo se musi preklad definovat sam.
nyni je situace u me takova ze z formulare mi do metody translate chodi vsechny message ale nikam se bohuzel neukladaji.
predem dik za pomoc / postrceni.

awsickness
Člen | 98
+
0
-

staci si udelat service mycontext ktera bude vracet context a je to.

green_user
Člen | 12
+
0
-

chtěl bych se také zeptat na samotné vytvoření
souborů z PoEditu. Postupuju podle
http://charlie.cz/…t-extractor/ ale vrátí mi to prázdný slovník, nebo jak to nazvat, respektive asi nenajde ty dané soubory :(
http://charlie.cz/…it_cesty.png ty cesty odkazují o adresář výše, ale odkud? co tam znamená ta tečka u „Základní cesta“?

Používám poslední verzi nette a souhlasí dále v tom odkazu http://charlie.cz/…t-extractor/ ten další postup nebo tam některé metody nebo třídy jsou upravy/nejsou?

díky moc za pomoc

2bfree
Člen | 248
+
0
-

Po dlouhých bojích s Nella\Localization staženém přímo ze stránek Nella frameworku, kdy jsem prosil Patrika Votočka osobně do mailu a žádného výsledku jsem se po 14 denním boji nedohrabal jsem seznal, že je asi nepoužitelný v čistém Nette Frameworku.

Po dlouhých hodinách googlení jsem narazil na odkaz, obsahující „původní podobu translátoru“ předělanou pro novou verzi Nette. Myslím si, že by zde měl být odkaz, aby se ostatní netrápili zbytečně jako já:

https://github.com/…teTranslator

Potvrzuji funkčnost.

Patrik Votoček
Člen | 2221
+
0
-

green_user napsal(a):

chtěl bych se také zeptat na samotné vytvoření …

Ahoj to na co se ptáš moc nesouvisí s tímto tématem. To správné vlákno je tady: https://forum.nette.org/…extractor-v2

2bfree napsal(a):

Po dlouhých bojích s Nella\Localization staženém přímo ze stránek Nella frameworku, kdy jsem prosil Patrika Votočka osobně do mailu a žádného výsledku jsem se po 14 denním boji nedohrabal jsem seznal, že je asi nepoužitelný v čistém Nette Frameworku.

Ahoj sorry ale fakt na e-maily s prosbou o pomoc neodpovídám (Protože to bych pak nedělal nic jiného). Proto se máš ptát tady nebo tady: http://forum.nella-project.org/.

Důvod proč tady nereaguju a nepíšu vám jak řešit ten či onen prolém je ten že už nějaký pátek používám novou zcela přepracovanou verzi (která by ale měla zachovat kompatabilní API). Nicméně tato nová verze ještě není úplně 100% vychytaná a tak na Gihubu / v balíku na stažení není ale měla by se tam objevit už brzo.

2bfree
Člen | 248
+
0
-

@Patrik Votoček Nebyl jsem si jistý tím, zda-li tvé Nella\Localization je již hotové nebo nikoliv, jelikož ne a ne fungovat.

Chápu že toho máš hodně a že tě za to nikdo neplatí, ale napsat že to momentálně není použitelné si mohl ;) Nicméně na GitHubu je: https://github.com/…Localization proto jsem se s ní trápil.

rixi
Člen | 109
+
0
-

2bfree wrote:

https://github.com/…teTranslator

Potvrzuji funkčnost.

Taktiez pouzivam tuto funkcnu verziu k uplnej spokojnosti. Dnes som sa s tym bafkal to spojazdnit po vyraznejsich zmenach na verzii 74b3870 released on 2011-12-14. Funguje, bolo treba len mensie upravy v GetText classu v riadku 100: $container->parameters a 583: @return (prepis pre PHP5.2 bez prefixov).

Editoval rixi (15. 12. 2011 10:06)

Tomáš Votruba
Moderator | 1114
+
0
-

Pokud byste měl někdo neutálé problémy s implementací, můžete využít možnost vhledu do funkčního řešení – http://nette.schmutzka.eu/

rixi
Člen | 109
+
0
-

Schmutzka wrote:

Pokud byste měl někdo neutálé problémy s implementací, můžete využít možnost vhledu do funkčního řešení – http://nette.schmutzka.eu/

Pekne, tiez si take robim :) Najvacsie ovocie Nette prinasa, pokial si kazdy sam pripravi svoje pieskovisko, ktore moze bleskovo nasadit na nove projekty.

Tomáš Votruba
Moderator | 1114
+
0
-

Pro další jsem sepsal návod do Kuchařky pro přidání Translatoru do nového Nette (z 2012–02–03).
Teď to zvládnete za 15 minut :)

Editoval Schmutzka (11. 2. 2012 0:02)

Melmen
Člen | 132
+
0
-

Paráda, díky za to :) Hned zítra si to přepíšu do „nového Nette“

Jan Jakeš
Člen | 177
+
0
-

Schmutzka napsal(a):

Pro další jsem sepsal návod do Kuchařky pro přidání Translatoru do nového Nette (z 2012–02–03).
Teď to zvládnete za 15 minut :)

Proč jsi to neudělal na Githubu jako fork? Takhle se nemůžu podívat, co se změnilo, nelze mergovat vývoj obou verzí, atd.