NetteTranslator (GettextTranslator & Nette Translation Panel)
- Ivorius
- Nette Blogger | 119
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)
- Tomáš Votruba
- Moderator | 1114
@Ivorius: Zkusil bych:
- novější Nette, myslím, že tam byl bug právě v RANGE
- 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.
- .:M@rt!n:.
- Člen | 201
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ů.
- .:M@rt!n:.
- Člen | 201
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
Nevadí. Zkus na místě, o kterém píšeš, získat
$this->translator
pomocí tohoto
- patriksima
- Člen | 58
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
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
.:M@rt!n:. napsal(a):
Schmutzka napsal(a):
Nevadí. Zkus na místě, o kterém píšeš, získat
$this->translator
pomocí tohotoTak 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;
}
- ondra310
- Člen | 25
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
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í tohotoTak 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 ? :-)
- Marek Šneberger
- Člen | 130
@duskohu:
$form->addSelect('selectBox', 'Select', array(...))->setTranslator(NULL);
Asi tak nějak :)
- jiri.pudil
- Nette Blogger | 1029
@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
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
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
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)
- zapp
- Člen | 32
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?
- dada-amater
- Bronze Partner | 52
@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
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)
- Tomáš Votruba
- Moderator | 1114
@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
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
@sabrx: Dobrý postřeh, jsem si říkal, kdy na to někdo dojde ;) Díky, fixed.
- Patrik Votoček
- Člen | 2221
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
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
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
@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
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.
- xxxmisko
- Člen | 140
@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
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)
- vjirovsky
- Člen | 12
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
@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
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
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
@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
A nebo psát rovnou
$form->addError($this->translator->translate('Something went wrong!'));
- MartinitCZ
- Člen | 580
@**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.