NetteTranslator (GettextTranslator & Nette Translation Panel)

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

Nedaří se mi přes panel uložit překlad, v němž je znak nového řádku (tedy enter). Nevíte prosím proč a jak to resp. udělat?

Ivorius
Nette Blogger | 119
+
0
-

Používám verzi od Schmutzka na nejnovějším Nette, ale nefunguje mi překlad chybové hlášky ve formuláři, jestliže má nastaveno addRule(Form::RANGE, 'Musí být v rozsahu %ď a %d', array(1,100)) – respektive dostane se to do translator panelu, ale nezobrazí se to u formuláře.

Navíc to vyhazuje PHP Warning: vsprintf(): Too few arguments in …\libs\NetteTranslator\Gettext.php:309

Editoval Ivorius (14. 10. 2012 9:05)

Nox
Člen | 378
+
0
-

revoke toto mi taky dělá … když to jde, snažim se newline oddělat, když ne, dám to do překladu (*.po, myslim že pak ještě resave v poedit) ručně

Tomáš Votruba
Moderator | 1114
+
0
-

@Ivorius: Zkusil bych:

  1. novější Nette, myslím, že tam byl bug právě v RANGE
  2. případně porovnat, co tam je předáváno za parametry (dump). Chyba píše, že jich je málo… buď je tedy počítáno s polem jako 1 parametrem, nebo není předána hodnota 100.
Ivorius
Nette Blogger | 119
+
0
-

@Schmutzka

  1. Mám aktuální verzi z github
  2. vypadá to, že se nic nepředá – NULL. Pokud ovšem nezadám pole, ale přímo hodnotu, tak se předá ta hodnota.

Když ovšem uplně vypnu na formuláři translator, tak chybovka funguje – akorát mi chybí překlad :(

.:M@rt!n:.
Člen | 201
+
0
-

Ahoj, v aplikaci podle nového quickstartu se mě nechtějí do panelu pro překlad načíst flash zprávy. Kód v BasePresenteru mám stejný jako v aplikaci která je dělaná po staru, čili:

public function flashMessage($message, $type = "info") {
       if ($this->context->hasService("translator")) {
           $message = $this->getContext()->translator->translate($message);
       }
       return parent::flashMessage($message, $type);
   }

Kde by mohl být problém? Ostatní překlady jdou bez problémů.

Tomáš Votruba
Moderator | 1114
+
0
-

Ahoj, zkus službu Translator injectnout, Viz Planette, případně tu

Případně jinak ověřit, že jej lze tebou zmíněným postupem opravdu získat.

Editoval Schmutzka (23. 10. 2012 14:53)

.:M@rt!n:.
Člen | 201
+
0
-

Jestli jsem to dobře pochopil tak by mělo stačit nahradit

if ($this->context->hasService("translator"))

tímto?

if (inject->hasService("translator"))

Jestli ne tak to vůbec nechápu :)

Tomáš Votruba
Moderator | 1114
+
0
-

Nevadí. Zkus na místě, o kterém píšeš, získat $this->translator pomocí tohoto

patriksima
Člen | 58
+
0
-

Zdravím,

nefunguje mi překlad formuláře v komponentě při ajaxovém volání.

přepsal v komponentě createTemplate(). vše funguje, dokud formulář nevolá znovu skrze ajax. to pak vrací defualtní jazyk místo nastaveného.

když přidám na začátek formulářové továrničky $this->presenter->context->translator->setLang($this->presenter->lang); tak to jede.

otázkou je, zda by to nemělo být někde jinde.

.:M@rt!n:.
Člen | 201
+
0
-

Schmutzka napsal(a):

Nevadí. Zkus na místě, o kterém píšeš, získat $this->translator pomocí tohoto

Tak vůbec nechápu co mám dělat :)
Nemohl by si mě to pls ukázat na mém problému? třeba to pak pochopím ;)

Felix
Nette Core | 1196
+
0
-

.:M@rt!n:. napsal(a):

Schmutzka napsal(a):

Nevadí. Zkus na místě, o kterém píšeš, získat $this->translator pomocí tohoto

Tak vůbec nechápu co mám dělat :)
Nemohl by si mě to pls ukázat na mém problému? třeba to pak pochopím ;)

/**
  * @param ITranslator $translator
  */
public function injectTranslator(ITranslator $translator) {
	$this->translator = $translator;
}
.:M@rt!n:.
Člen | 201
+
0
-

Tak jsem ještě více mimo :) v čem mi toto pomůže?

Jack06
Člen | 168
+
0
-

Měl bych jen takový dotaz, jak dostat ten překládací panel přímo do template? tzn, abych ho nemusel registrovat jako panel do debuggeru, ale jen ho vytvořit třeba u actionDefault a prdnout buď jako komponentu, nebo natvrdo do template a vyrendrovat.

Díky

ondra310
Člen | 25
+
0
-

Zdravím, měl bych dotaz. Byť se zde již řešil, ale nenašel jsem řešení, tak to zkusím znovu:-). Mám v aplikaci dva moduly, „shop“ a „admin“ a rád bych je překládal zvlášť. I když si v konfiguraci služby translator definuji dva oddělené Files pro překlady pomocí - addFile(%appDir%/lang, shop), tak se mi sice vytvoří dva „moduly“ pro překlad, nicméně v shop modulu se mi objevují nepřeložené řetězce z admin modulu a naopak, což může být pro překladatele trochu matoucí.
Přemýšlel jsem, že bych si zaregistroval dvě služby, zvlášť pro každý modul, a ty si použil basePresenteru pro jednotlivé moduly, ale nicméně to mi nechce povolit DI, k vůli Multiple services of type NetteTranslator…
Existuje nějaké elagantní řešení pro tuhle jinak výbornou vychytávku? Díky.

sejmor
Člen | 63
+
0
-

Zdravím – mám taky jeden dotaz. Jdou .po (.mo) soubory editovat přímo v poeditu. Když to udělám a v poeditu uložím tak translator přestane fungovat a laděnka napíše:

Undefined index: Plural-Forms

Nevíte někdo jestli něco dělám blbě nebo to prostě jenom nejde ?

sejmor
Člen | 63
+
0
-

Felix napsal(a):

.:M@rt!n:. napsal(a):

Schmutzka napsal(a):

Nevadí. Zkus na místě, o kterém píšeš, získat $this->translator pomocí tohoto

Tak vůbec nechápu co mám dělat :)
Nemohl by si mě to pls ukázat na mém problému? třeba to pak pochopím ;)

/**
  * @param ITranslator $translator
  */
public function injectTranslator(ITranslator $translator) {
	$this->translator = $translator;
}

S fleškama jsem taky bojoval a narazil jsem na to, že nekteré se mi překládali a některé ne. Zkoušel jsem vše možné. Translátor mám momentálně nakonfigurovaný přes inject. Zjistil jsem, že flešky se mi nevypisujou pokud například: Zavolám metodu action nějakého presenteru ve které udělám pouze záznam do DB pak vytvořím flešku a redirectnu jinam. Fleška se nepřeloží a panel frázi k překladu nenabídne. To samé se stane pokud např. po odeslání formuláře callback metoda něco udělá, vytvoří flešku a zase redirektne. Jelikož do toho zas tak nevidím tak předpokládám, že se vůbec translátor neaktivuje protože je asi nějak navázanej na šablony. Zkusil jsem proto před to volání flešky napsat:

$this->template->pokus="";

Nevím co se přesně stane (vytvoří se instance šablony a ta ho aktivuje??). No nicméně ten translátor to probere a začně fungovat normálně. Je to asi prasárna a budu moc rád pokud mi to někdo vysvětlí a nabídne čisté řešení. Jo a ještě jedna poznámka což už mi hlava vůbec nebere – pokud jsem přepnutej v primárním jazyku (cs) tak to funguje normálně i bez této obezličky a k překladu (cs-cs) mi to nabízí vše.

Vysvětlí mi to někdo ? Nějaká moje blbost ? Woodooo ? :-)

duskohu
Člen | 778
+
0
-

zdravim, chcel by som sa informovat ci je mozne pouzit na formular translate aby mi prekladalo prvky formulara, (popisky, hlasky), ale aby mi neprekladalo obsah formularovich prvkov, napr oprions v selecte?
Ak nie, tak ako je to mozne realizovat?
Dakujem.

Marek Šneberger
Člen | 130
+
0
-

@duskohu:

$form->addSelect('selectBox', 'Select', array(...))->setTranslator(NULL);

Asi tak nějak :)

jiri.pudil
Nette Blogger | 1029
+
0
-

@Marek Šneberger: To potom ale nepřeloží ani label, což asi není úplně žádoucí.

Něco podobného se tu řešilo nedávno, Ot@s tam na konci píše, že to vyřešil vlastním selectboxem.

duskohu
Člen | 778
+
0
-

Napadlo ma ze ja mam BaseFormControl a pouzivam univerzalnu sablonu pre vsetky formulare, takze by som to zaregistroval v BaseFormControl a doplnil do createTemplate taze v sablonach vsetkych formularov to budem mat dostupne, a v sablone si nastavim preklad len na tie prvky ktore chcem, teda label, error popisky.

@EDIT
Ale to nepojde kedze by mi do prekladu zahrnulo aj tag labelu

Editoval duskohu (27. 11. 2012 8:15)

kudlajz
Člen | 70
+
0
-

Zdravím.

Měl bych dotaz, jak překládat řetězce uvnitř Javascriptového kódu, příp. je-li to vůbec možné?
Používám jQuery UI confirm dialog a hodnoty tlačítek se definují až při volání js funkce.
Viz:

$("#deleteAccount").click(function(e) {
			$(".dialog").dialog({
				resizable: false,
				width: "auto",
				modal: true,
				draggable: false,
				buttons: {
					"Yes, delete my account!": function() {
						$(this).dialog("close");
					},
					"Cancel": function() {
						$(this).dialog("close");
					}
				}
			});
			e.preventDefault();
		});
saimons
Člen | 293
+
0
-

Ja jsem si to dal na vhodne mista do html. Pak to nacitas pres tag napr. <a href=„#“ data-dialog-cancel=„Cancel“ id=„deleteAccount“ .. kterej si muzes prelozit. Do js to pak nactes jednoduse: cancel = $(this).data(‚dialog-cancel‘); Je dobre to mit nakym zpusobem oddeleno, pak nemusis vypisovat do html JS a muzes mit vsechny JS v souborech, ktere pak treba nacitat pres webloader.

Editoval saimons (17. 12. 2012 13:52)

kudlajz
Člen | 70
+
0
-

Jojo, díky moc, tak nějak jsem to teda udělal.
Teď mě ještě zajímá, je nějaký způsob jak přeložit Visual Paginator? Když zkusím vložit stringy obalené {_}{/_} už do jeho templatu tak to hodí chybu, že neexistuje translator.

zapp
Člen | 32
+
0
-

Zdravím,
už docela dlouho se trápím s tímto problémem. V šabloně problém odtraním přidáním vykřičníku do makra, ovšem při vytváření formuláře v presenteru si nevím rady. Mám následující

$form->addCheckbox('policy', $this->translator->translate('Registrací potvrzujete přijetí %s podmínek %s.', Html::el('a')->href('odkaz')->startTag(), Html::el('a')->endTag())
	->setRequired('Musíte souhlasit s podmínkama registrace');

Nahrazení i překlad by fungoval, jenže mi to odkaz vygeneruje jako string.

Registrací potvrzujete přijetí <a href="odkaz"> podmínek </a>`

Dá se nějak vypnout escapování, nebo je to něčim jiným?

Aurielle
Člen | 1281
+
0
-

Když předáš přímo Nette\Utils\Html, tak se ti to vypíše správně. Což znamená, že překládat musíš až „uvnitř“ Html.

zapp
Člen | 32
+
0
-

To jsem taky vyzjistil, ovšem je problém, že ten formulář je dost dlouhý a nechce se mi vykreslovat manuálně. Neexistuje nějakou workaround při vykreslování pomocí makra control?

dada-amater
Bronze Partner | 52
+
0
-

@zapp
Toto mi funguje:

<?php
$el=\Nette\Utils\Html::el()->add($this->translator->translate($this->translator->translate('Registrací potvrzujete přijetí %s podmínek %s.', \Nette\Utils\Html::el('a')->href('odkaz')->startTag(), \Nette\Utils\Html::el('a')->endTag())));
$this->addCheckbox("policy",$el)->setTranslator(NULL)
?>
castamir
Člen | 629
+
0
-

Vyšla nová verze Nette Translator

Změny jsou převážně ve vnitřní implementaci, ale něco málo se přecejen projevuje i zvenčí.

  • instalace pomocí Composeru
  • zjednodušení nastavení v config.neon pomocí Extension
  • přidáno nastavení pro debug panel
  • byla odebrána možnost povolení cache – data se nyní cachují pouze na produkční, jinak ne

Návod byl navíc přesunut z Planette do sekce addons, kam vlastně patří. Návod je nyní pouze anglicky a všechny odkazy (z českého addons, z cs/en Plannete a GitHubu) směřují právě na něj.

Editoval castamir (31. 3. 2013 18:50)

lvq
Člen | 47
+
0
-

@castamir:
Díky za novou verzi.
Jen k tomu návodu, aby to bylo úplně tip ťop, tak dopsat na řádku

admin: %appDir/lang-admin

za appDir procento.

Tomáš Votruba
Moderator | 1114
+
0
-

@lvq: Dobrý postřeh, fixed.

NetteTranslator byl přejmenován na GettextTranslator (Nette má ochrannou známku). Krom odkazu na addon se nic nemění.

sabrx
Člen | 47
+
0
-

Chcem upozorniť na menšiu chybu v dokumentácii v časti In components:

public function createTemplate($class = NULL)
{
    $template = parent::createTemplate($class);
    $template->setTranslator($this->parent->translator); // $template in presenter has to be public
    // or $this->translator via construct/inject

    return $template;
}

Správne má byť $translator in presenter has to be public.

Tomáš Votruba
Moderator | 1114
+
0
-

@sabrx: Dobrý postřeh, jsem si říkal, kdy na to někdo dojde ;) Díky, fixed.

Patrik Votoček
Člen | 2221
+
0
-

Schmutzka napsal(a):

@lvq: Dobrý postřeh, fixed.

Nette má ochrannou známku.

<OT>
imho Nette má ochrannou známku pouze na sousloví „Nette Framework“
</OT>

dada-amater
Bronze Partner | 52
+
0
-

Je treba v sortcuts.php vymenit

	return Nette\Environment::getService('translator')->translate(...);

za

	return Nette\Environment::getService('gettextTranslator.translator')->translate(...);

Do te doby to lze vyresit takto v config.neon:

translator:	@gettextTranslator.translator
xxxmisko
Člen | 140
+
0
-

Ahoj, skúšal som update z NetteTranslator na GettextTranslator, teda na novšiu verziu, ale nette mi vypisuje chybku:

Nette\DI\ServiceCreationException

Service ‚gettextTranslator‘: Unknown key ‚files‘, ‚layout‘, ‚height‘ in definition of service

do config neon som napísal:

	services:
		gettextTranslator:
			lang: sk
			files:
				front: %appDir%/lang
			layout: horizontal # or: vertical
			height: 450

do bootstrap.php

$configurator->onCompile[] = function ($configurator, $compiler) {
    $compiler->addExtension('gettextTranslator', new GettextTranslator\DI\Extension);
};

Viete mi prosím helfnúť, ako to rozchodiť? nette translator mi v pohode fungoval takmer okamžite.
Do libs som nahral GettextTranslator

Ďakujem za pomoc

Tomáš Votruba
Moderator | 1114
+
0
-

@xxxmisko: Ahoj, zkus návod přečíst pozorněji. Nejde o registraci služby, ale rozšíření


EDIT: Doplnění RE

Editoval Schmutzka (8. 4. 2013 19:54)

dada-amater
Bronze Partner | 52
+
0
-

Schmutzka napsal(a):

Ahoj, zkus návod přečíst pozorněji. Nejde o registraci služby, ale rozšíření

Ano, vim. Ale to rozsireni vytvari/registruje service. Vubec nechci na tebe delat rozumy, tvuj kod je pro me casto prikladem, jen jsem chtel upozornit, ze mi ladenka rve, pokud pouziju funkci __(„Text“), protoze to hleda service „translator“, ktera neexistuje, viz: https://github.com/…hortcuts.php#L11 . Takze bud ty zkratky zrusit, nebo opravit.

ruff
Člen | 11
+
0
-

Ano, vim. Ale to rozsireni vytvari/registruje service.

Dávalo mi to před chvílí stejnou chybu, pomohlo mi toto nastavení:

nette:
	extensions:
		gettextTranslator: GettextTranslator\DI\Extension

Editoval ruff (8. 4. 2013 16:25)

Tomáš Votruba
Moderator | 1114
+
0
-

@dada-amater: Čeknu, reagoval jsem na něco jiného (doplněno).

xxxmisko
Člen | 140
+
0
-

@Schmutzka

ďakujem za info, teraz som to zmenil, už sa tvári, že ide, ale ešte dostávam chybičku

Language file(s) must be defined



File: ...\libs\GettextTranslator\Gettext.php   Line: 150

150:                 throw new Nette\InvalidStateException('Language file(s) must be defined.');

nevieš mi ešte poradiť, ako sa z toho dostať? Starý nettext mi automaticky po preklade vytvoril súbory.

Priečinok lang je teraz prázdny, zmazal som aj temp
Ďakujem

Editoval xxxmisko (8. 4. 2013 20:36)

dada-amater
Bronze Partner | 52
+
0
-

Chybi ti v config.neon

common:
	parameters:
		...
	services:
		...
	gettextTranslator:
		lang: en
		files:
			web: %appDir%/lang # for module Front and other non-specified modules

Ty parameters, services tam mam schvalne, abys videl, ve ktere urovni to ma byt, ono je to trochu z tutorialu nejasne.

xxxmisko napsal(a):

@Schmutzka

ďakujem za info, teraz som to zmenil, už sa tvári, že ide, ale ešte dostávam chybičku

Language file(s) must be defined



File: ...\libs\GettextTranslator\Gettext.php   Line: 150

150:                 throw new Nette\InvalidStateException('Language file(s) must be defined.');

nevieš mi ešte poradiť, ako sa z toho dostať? Starý nettext mi automaticky po preklade vytvoril súbory.

Priečinok lang je teraz prázdny, zmazal som aj temp
Ďakujem

Editoval dada-amater (8. 4. 2013 20:55)

xxxmisko
Člen | 140
+
0
-

@dada-amater

FUNGUJE!!! Ďakujem.

vjirovsky
Člen | 12
+
0
-

Po nasazení GettextTranslatoru misto NetteTranslatoru na nette 2.0.10 dostávám náhodně

Fatal Error – Class ‚GettextTranslator\DI\Extension‘ not found – (na detailu položky s ID=1234 bez problémů, na ID=1235 to chcípne na tomhle) a v tom kódu se mi nic divného nezdálo.

bootstrap:

<?php
...
$configurator->addConfig(__DIR__ . '/config/config.neon', $environment);

$configurator->onCompile[] = function ($configurator, $compiler) {
    $compiler->addExtension('gettextTranslator', new GettextTranslator\DI\Extension);
};
$container = $configurator->createContainer();
...
?>

config.neon:

...
common:
    gettextTranslator:
        lang: cs
        files:
                front: %appDir%/lang # for module Front and other non-specified modules
    parameters:
...

Nemáte někdo podobný problém? Díky!

EDIT: (cache jsem samozřejmě smazal)

Editoval vjirovsky (23. 4. 2013 13:17)

Tomáš Votruba
Moderator | 1114
+
0
-

@vjirovsky: Používáš nejnovější verzi GettextTranslatoru 2.0.2? Jak jej instaluješ – composer/github? Zkus druhý způsob. Chyba, jaks ji popsal, mi nic neříká.

vjirovsky
Člen | 12
+
0
-

Github, poslední master verze
nicméně chybu jsem našel, když v šabloně přistoupím na atribut NDB active row

{$users[$follower]->username}

tak to takhle zdechne, když přes

{$users[$follower]['username']}

tak je vše ok. Tahle část šablony se uplatňovala jenom u některých položek, proto to bylo tak náhodné. Netuším proč, activerow má magický get který to převede, takže by to mělo být jedno, ne?

Každopádně díky za plugin :-)

Schmutzka napsal(a):

@vjirovsky: Používáš nejnovější verzi GettextTranslatoru 2.0.2? Jak jej instaluješ – composer/github? Zkus druhý způsob. Chyba, jaks ji popsal, mi nic neříká.

Editoval vjirovsky (23. 4. 2013 18:26)

MartinitCZ
Člen | 580
+
0
-

Ahoj,
funguje v této verzi překlad $form->addError(‚..‘);? Mám totiž nějakou starší verzi a tam to nejde. Zkoušel jsem hledat na foru a problem stim má víc lidí.

Díky.

Tomáš Votruba
Moderator | 1114
+
0
-

@martinit: Ahoj, toto je záležitost Nette samotného. Pokud nepošleš pull, můžeš zkusit přetížit addError() ve svém BaseForm.

Marek Šneberger
Člen | 130
+
0
-

A nebo psát rovnou

$form->addError($this->translator->translate('Something went wrong!'));
MartinitCZ
Člen | 580
+
0
-

@**Schmutzka**: To potěší. Nemyslim si, že bych byl ten správný na bugfixy.
@**Marek Šneberger**: To jsem zkoušel, ale nefunguje to.
Samotný překlad samozřejmě funguje.