NetteTranslator (GettextTranslator & Nette Translation Panel)
- Tomáš Votruba
- Moderator | 1114
Zas tolik tomu nerozumím, ani nevím kde (stáhnul jsem to před 7 měsíci ani nevím kde) a jedinou úpravu, co jsem dělal teď, jsem zvýraznil. Klidně se toho ujmi.
- Jan Jakeš
- Člen | 177
Možná to budu brzy používat, tak se kdyžtak ozvu s nějakym vylepšením. Jen pár věcí, co bys mohl teď změnit:
- Souboury nejsou v UTF-8.
- Konfigurace jde napsat pohodlně bez
bootstrap.php
a to takto:
translator:
factory: NetteTranslator\Gettext::getTranslator
setup:
- addFile(%appDir%/lang, front)
- NetteTranslator\Panel::register
3. Parametr langDir
je v configu uplně zbytečně, protože
se nikde nepoužívá – smazat. (A parametr lang
je díky
poněkud zvláštnímu kódu __construct
vyžadován právě
v sekci parametres
, ale vůbec by to tak být nemuselo. Navíc tam
máš nějaké variable.lang = ...
, což ani nefunguje. Když už,
tak lang: cs
).
Každopádně díky za funkční verzi.
Editoval Juan (11. 2. 2012 12:05)
- Tomáš Votruba
- Moderator | 1114
@Juan: Jsem rád, že je to jen v configu (včera jsem se o to pokoušel, ale nepodařilo se mi to). Vřelé díky, zapracováno a funguje.
Editoval Schmutzka (11. 2. 2012 18:06)
- Tomáš Votruba
- Moderator | 1114
fak napsal(a):
@Schmutzka: super práce, tleskám!
napadlo mě formální přejmenování parametru ‚lang‘ v config.neon na ‚nativeLang‘. Napřed jsem nemohl pochopit proč tam je, ale díky němu se vlastně pozná v jakém jazyku jsou řetězce aplikace natvrdo napsané..
Přemýšlel jsem nad tím, ale zmínka postačí: https://componette.org/search/?…
(jen ji třeba přečíst ;)).
V configu je obvykle vše defaultní.
Plus je na tobě, jestli budeš mít tuto hodnotu v configu, v basePresenteru, db nebo jinde. To už je na každém.
Editoval Schmutzka (18. 2. 2012 20:56)
- Michal Vyšinský
- Člen | 608
Zdravím,
nejdříve musím poděkovat za skvělou práci :) Jen jsem se chtěl zeptat,
zda je nutné mít před překládáním už vytvořen soubor s překladem
(.po/.mo) nebo se vytvoří sám. Někdy se mi totiž při prvním
překladu soubor vytvořil automaticky. A někdy při prvním překladu do
jiného souboru (mám jich více kvůli modulům a každý má jiné
umístění) se mi text nepřeloží (neuloží) a vyskočí prázdné okno.
V logu se objeví toto
Vím, že zřejmně Gettext nenašel ten soubor. Tak právě chci vědět, jestli jej musím vytvořit, nebo se vytvoří. Díky
- 2bfree
- Člen | 248
Zdravím,
vzhledem k problémům, na které jsem při užívání NetteTranslatoru respektive jeho panelu narazil, programuji novou verzi úplně od základu. Chtěl bych v něm vyřešit následující problémy potažmo přidat následující funkce.
- Detekce neexistence slovníkového souboru s možností jeho založení
- Při zakládání nového slovníku možnost definovat parametry jako Autor, Jazyk, definice plurálů etc.
- Zapnutelné / Vypnutelné generování .po souboru
- Přidání možnosti překladu komponent, jejichž slovník se načítá až v momentě užití
- Přidání funkce automatické překladu googlem po kliknutí na čudl
Zajímalo by mne, zda-li by byl o tento výsledek zájem i v komunitě a případně jestli vás napadá, co by takový panel mohl ještě umět „navíc“.
- 2bfree
- Člen | 248
CherryBoss napsal(a):
Zdravím,
nejdříve musím poděkovat za skvělou práci :) Jen jsem se chtěl zeptat, zda je nutné mít před překládáním už vytvořen soubor s překladem (.po/.mo) nebo se vytvoří sám. Někdy se mi totiž při prvním překladu soubor vytvořil automaticky. A někdy při prvním překladu do jiného souboru (mám jich více kvůli modulům a každý má jiné umístění) se mi text nepřeloží (neuloží) a vyskočí prázdné okno. V logu se objeví totoVím, že zřejmně Gettext nenašel ten soubor. Tak právě chci vědět, jestli jej musím vytvořit, nebo se vytvoří. Díky
Co mám zkušenost s Martenovo translatorem, tak se sice vygeneruje soubor .po i .mo, ale chybně, takže po reloadu to vyhazuje různé errory. Navíc není možnost definice počtu plurálů, takže třeba soubor pro český jazyk takhle nevygeneruješ.
- Aurielle
- Člen | 1281
CherryBoss napsal(a):
Zdravím,
nejdříve musím poděkovat za skvělou práci :) Jen jsem se chtěl zeptat, zda je nutné mít před překládáním už vytvořen soubor s překladem (.po/.mo) nebo se vytvoří sám. Někdy se mi totiž při prvním překladu soubor vytvořil automaticky. A někdy při prvním překladu do jiného souboru (mám jich více kvůli modulům a každý má jiné umístění) se mi text nepřeloží (neuloží) a vyskočí prázdné okno. V logu se objeví totoVím, že zřejmně Gettext nenašel ten soubor. Tak právě chci vědět, jestli jej musím vytvořit, nebo se vytvoří. Díky
Netuším, kterou verzi používáš, můj fork NetteTranslatoru vytváření souborů nepodporuje, resp. podporuje chybně, jak bylo napsáno. Věnovat pár vteřin vytvoření katalogů v PoEditu není zas tak náročné…
- Michal Vyšinský
- Člen | 608
Díky za odpovědi. Mohl bych poprosit o nějaký postup, jak takový katalog vytvořit tak aby to s tímto translatorem fungovalo? Děkuji.
- Tomáš Votruba
- Moderator | 1114
CherryBoss napsal(a):
Zdravím,
nejdříve musím poděkovat za skvělou práci :) Jen jsem se chtěl zeptat, zda je nutné mít před překládáním už vytvořen soubor s překladem (.po/.mo) nebo se vytvoří sám. Někdy se mi totiž při prvním překladu soubor vytvořil automaticky. A někdy při prvním překladu do jiného souboru (mám jich více kvůli modulům a každý má jiné umístění) se mi text nepřeloží (neuloží) a vyskočí prázdné okno. V logu se objeví totoVím, že zřejmně Gettext nenašel ten soubor. Tak právě chci vědět, jestli jej musím vytvořit, nebo se vytvoří. Díky
Verze využitá v kuchařce sama soubory zakládá, viz hned 1. bod, právě kvůli těmto problémům.
Jestli ti to blbne, popiš, jak ses k tomu dopracoval, možná zkusím fixnout.
- Michal Vyšinský
- Člen | 608
Tak chyba zřejmě byla u mě. Dal jsem – addFile() do config.neon (hlavní conf soubor) tak jak je to v návodu. Předtím jsem tam měl addFile 2* (jeden pro front a druhý pro admina). Konfiguraci aplikace skládám tak, že jako první vložím ten hlavní soubor. A pak jdu přes všechny moduly a skládám tak konfiguraci. Je to sice OT ale už se zeptám tu: Jak mám tedy složit konf soubor tak jak to mám teď, aby to fungovalo (to addFile). Nyní mám v hlavním konfigu toto:
services:
translator:
factory: NetteTranslator\Gettext::getTranslator
setup:
- addFile(%wwwDir%/translations, homepage)
- addFile(%wwwDir%/translations, admin)
- NetteTranslator\Panel::register
a v konfigu zatím jediného modulu toto:
services:
translator:
setup:
- addFile(%wwwDir%/modules/PagesModule/translations, pagesmodule)
Myslel jsem, že se to bez problému složí, ale asi jsem vedle :-|
EDIT: Podotýkám, že cesty jsou správně a když řádek addFile() z modulu přesunu to hlavního konfigu tak vše funguje. Ale to je pro moje potřeby bohužel nepoužitelné :-(
Editoval CherryBoss (21. 2. 2012 20:40)
- Tomáš Votruba
- Moderator | 1114
Možná je to registrací panelu, kterou lze pustit za posledním addFile. To už je ale otázka na kompozici configů, která bohužel není příliš ideální.
Napadá mne, že řešením by mohla být nějaká autoregistrace po přidání posledního addFile, ale to fakt hádám.
- Tomáš Votruba
- Moderator | 1114
Oggy napsal(a):
Narazil jsem na jednu zvláštnost..
tohle nevypíš plurál ..
<?php {_"Nalezen",$products->count('*')} ?>
tohle ano
<?php {_"Nalezen",20} ?>
netuší někdo, kde by mohla být chyba? Pokud vkládám proměnou špatně ji vyhodnotí.
Nevím, co používáš, ale testnul jsem to pro NotORM
(NotORM_Result
) a vše v pořádku (výše zmíněná
verze):
{_"test", $testCount->count("*")}
Opravdu ti $products->count("*")
vrací číslo? Zkusil
bych:
{dump $products->count("*")}
{dump $products->count()}
{dump count($products)}
{_"Nalezen", count($products)}
Případně rozepiš, co znamená špatně ji vyhodnotí.
Editoval Schmutzka (29. 3. 2012 1:26)
- iguana007
- Člen | 970
Schmutzka:
Taky se mi zdá, že dokud se aplikace k textu nějak nedostane, tak se text v panelu nezobrazí. Jak lze tedy dostat/proskenovat všechny texty v aplikaci?
- by mne zajímalo, jak se správně pracuje se „slovníky“? Tj. třeba rozdělení na Frontend a Backend – když si zadám do configu 2× addFile tak když potom mezi nimi přepínám v panelu, tak mi to pořád zobrazuje to samé (tj. všechny texty z aplikace).
- awsickness
- Člen | 98
narazil jsem na zajimavy problem.
pokud translator bych chtel vyuzivat pri spousteni z console tak mi gettext
vyhodi chybu na
$storage->newStrings = array();
error
./Send.php
PHP Fatal error: Uncaught exception 'ErrorException' with message 'session_start(): Cannot send session cache limiter - headers already sent (output started at /var/www/test/send.php /Nette/Http/Session.php:98
Stack trace:
#0 [internal function]: Nette\Diagnostics\Debugger::_errorHandler(2, 'session_start()...', '/var/www/test...', 98, Array)
#1 /var/www/test/libs/Nette/Http/Session.php(98): session_start()
#2 /var/www/test/libs/Nette/Http/SessionSection.php(63): Nette\Http\Session->start()
#3 /var/www/test/libs/Nette/Http/SessionSection.php(95): Nette\Http\SessionSection->start()
#4 /var/www/test/libs/Nella/Localization/Gettext.php(111): Nette\Http\SessionSection->__set('newStrings', Array)
#5 /var/www/test/libs/Nella/Localization/Gettext.php(601): NetteTranslator\Gettext->__construct(Object(SystemContainer), NULL)
#6 /var/www/test/temp/_Nette.Configurator/_-b45a42e081b09a6d in /var/www/test/libs/Nette/Http/Session.php on line 101
tudiz se poslou headers
Editoval awsickness (20. 4. 2012 8:05)
- jspetrak
- Člen | 15
V tutoriálu jsem nenašel, jak elegantně přeložit ve formulářích následující:
V presenteru vytvářím formulář a přikládám mu translator
protected function createComponentSignInForm() {
$form = new SignInForm();
$form->setTranslator($this->context->translator);
$form->onSuccess[] = callback($this, 'signInFormSubmitted');
return $form;
}
Ve formu se přeloží automaticky label, required message, ale pokud přidávám HTML5 atribut placeholder, který se zobrazuje jako zašedlý text v nevyplněném políčku, ten se automaticky nepřekládá a musím přistupovat přes globální funkci __() jde to lépe?
class SignInForm extends Form {
public function __construct(IContainer $parent = NULL, $name = NULL) {
parent::__construct($parent, $name);
...
$this->addText('login')
->setAttribute('placeholder', __('Email or Personal ID'))
->setRequired('Fill in email or Personal ID');
Protože ve formu se setTranslator() zavolá až po vykonání konstruktoru, nemůžu v konstruktoru zavolat $this->getTranslator()->translate().
Edit ex post
Ani řešení s __() nefunguje, proč funkce z NetteTranslator/shortcuts.php nejsou dostupné.
Call to undefined function __()
Editoval jspetrak (22. 4. 2012 20:10)
- JaroslavRamba
- Člen | 20
Jakým způsobme překládáte továrničky, které jsou mimo presentery a ve vlastním templatu mají věci, které je potřeba přeložit?
Aktuálně řeším překlad VisualPaginatoru.
Díky moc
- Tomáš Votruba
- Moderator | 1114
@JaroslavRamba: Předáním podobné struktury
createTemplate()
jako v presenteru do BaseControl
, od
které další komponenty dědí.
- frances
- Člen | 24
Zdravím snažím se využít tento super Translator ale po definici v config.neon mi laděnka zahlásí:
Service 'translator': Unknown key '0', '1' in definition of service
Může být problém v tom že nemám zatím vytvořeny žádné překlady?
Popřípadě jak si tyto překlady můžu vytvořit? Myslel jsem že právě
panel mi pomůže v interaktivním překládání sám…
Díky za odpověď.
- castamir
- Člen | 629
Jinak tento nástroj je v celku fajn, ale asi si taky napíšu svůj vlastní a to zejména kvůli náročnému luštění současného kódu a přidání funkcionalit jako
- zobrazování nezkráceného, vhodně umístěného textu k přeložení
- automatické generování textů defaultního jazyka do .po/.mo souborů
- s pomocí druhého bodu umožnit překlad všech textů nezávisle na textech aktuální stránky
- přidání metadat autor, datum změny či předešlá verze přeloženého textu
- pokusit se umožnit kontextový překlad (např. textu obsahující odkaz či jiný rozumný html prvek)
- frances
- Člen | 24
Schmutzka napsal(a):
Jsi si jistý, že to máš správně odsazené?
jsem pokud to dám jakkoliv jinak tak to neprojde a zahlásí to tu standardní chybu s odsazením. Takto to zahlásí chybu že je problém v jednotlivých setup parametrech…
- castamir
- Člen | 629
Reportuju divné chování tohoto nástroje:
projdu si několik stránek a nashromáždím tím větší počet textů
k překladu. Po přeložení prvního se vytvoří nový soubor s překladem
do daného jazyka (pokud dřív neexistoval) a v něm jsou všechny doposud
nepřeložené texty a ten jeden přeložený. Po uložení dalšího textu či
textů se mi ale ty nepřeložené z toho souboru ztratí a zůstanou tam jen
ty přeložené – proboha proč? Díky tomu musí člověk znova procházet
některé stránky a načítat ty texty znova!!
- Felix
- Nette Core | 1196
Zkousel jsem tedka translator od schmutzky a narazil na tento problem. Kdyz
pouzivam defaultni hlasky u formularu, tak mi translator vyhazuje
vsprintf(): Too few arguments
.
Zkoumal jsem to a opravil jsem si radek https://github.com/…/Gettext.php#L308 na
if (count($args) > 0 && $args != NULL) {
$message = vsprintf($message, $args);
}
A zacalo to fungovat.
- frees
- Člen | 25
Dik za super translator, mam len jeden problem. Neviem ako prepinat medzi
jazykovymi verziami.
Priklad: som na cz.domena.cz/produkt/1 a po kliknuti na tlacitko pre zmenu
jazyku sa mi nacita stranka sk.domena.cz/produkt/1
+tiez by ma zaujimalo ako prekladat placeholder u formularov.
- Tomáš Votruba
- Moderator | 1114
@frees: Rozšířil jsem návod o podrobnější popis změny jazyka. Pokud ti stále nebude něco jasné, ptej se.
Editoval Schmutzka (17. 8. 2012 18:02)
- .:M@rt!n:.
- Člen | 201
Ahoj, nahodil jsem si na localu na web Nette translator a podle kuchařky nastavil… Vše jde tak jak má a translator vidím v debug baru. Ale už nevím jak přeložit jednotlivé popisky u formulářů, tak aby se mě měnili podle zvoleného jazyku? Zkouším to psát, jak v debug baru, tak i ve vytvořených souborech, ale když si pak proklikám jednotlivé jazyky, je všude jen jeden jazyk. A jak se pak dostanu k defaultníu jazyku zase?
- besir
- Člen | 170
Ahoj,
vim, že se to tu řešilo, ale třeba na to mezi tím někdo přišel. Mám
aktuální translator a chtěl jsem už kvuli rychlosti vytvářet jednotlivé
slovníky až v presenteru, tak mám v presenteru
$this->context->translator->addFile($langDir, 'Slovnik');
V panelu se zobrazi, ale kdyz chci ulozit preklad tak mi console vrati chybu
TypeError: list is null
(223 out of range 117)
Edit: Este dodam ze po pridani slovniku v presenteru a dumpnuti
$this->context->translator->getFiles()
mi to vrati cesty k souborum spravne.
Ukládání do defaultního souboru z config.neon funguje.
@2bfree: Eventuelně jak to vypadá s tvou verzí prosím?
Všem díky.
Editoval besir (10. 9. 2012 10:26)
- .:M@rt!n:.
- Člen | 201
Ano i s tím. Podle toho jsem to nastavil. Translator se zobrazil v debugbaru tak jak je na obrázku. Ale nevím jak přeložit jednotlivé labely a jak překlad uložit?
- besir
- Člen | 170
Ahoj, rozchodil sem translator v komponentach, ale nezda se mi jako best practise predavat si tam container s contextem. Jak to udelat bez toho aniz bych si musel predavat container do komponenty?
Navíc tohle mi jde jen do každé konkrétní komponenty, rád bych translator implementoval pro všechny front Controly které by dědili třeba od FrontControl a až ten teprve od \Nette\Application\UI\Control
Díky za nápady a rady.
Editoval besir (10. 9. 2012 21:28)
- .:M@rt!n:.
- Člen | 201
.:M@rt!n:. napsal(a):
Ahoj, nahodil jsem si na localu na web Nette translator a podle kuchařky nastavil… Vše jde tak jak má a translator vidím v debug baru. Ale už nevím jak přeložit jednotlivé popisky u formulářů, tak aby se mě měnili podle zvoleného jazyku? Zkouším to psát, jak v debug baru, tak i ve vytvořených souborech, ale když si pak proklikám jednotlivé jazyky, je všude jen jeden jazyk. A jak se pak dostanu k defaultníu jazyku zase?
Nikdo neporadí?
- besir
- Člen | 170
.:M@rt!n:. napsal(a):
.:M@rt!n:. napsal(a):
Ahoj, nahodil jsem si …>
Nikdo neporadí?
Hola,
no pokud Ti to fungnuje a vytvori se Ti potrebne soubory tak se to preklada
prave v debugbaru a je to vzdy pro konkretni jazyk na ktery jsi preply. Tzn.
pokud mas v kodu v EN tak si prepnes na CZ, otevres translations bar a
v levem sloupci vidis prelozene / neprelozene retezce. Zajímají Tě žluté,
ty jsou nepřeložené. Klikneš na něj a pak ho v pravem sloupci prekladas
(singular = jednotne cislo, plural = mnozne). No a v pravem dolnim rohu mas
save ;-)
- iguana007
- Člen | 970
.:M@rt!n:. napsal(a):
Nikdo neporadí?
Aby mi začaly chodit překlady ve formulářích, musel jsem je upravit takto (přidat definici translatoru):
<?php
use Nette\Application\UI\Form;
class DemoForm extends Form {
public function __construct($parent, $name) {
parent::__construct($parent, $name);
$translator = $this->presenter->getContext()->getService('translator');
$this->setTranslator(new \Antee\i18n\NetteTranslator($translator));
$this->addHidden('id');
$this->addText('sometext','Text to translate')
->addRule(Form::FILLED,'%label must be filled!');
//...
$this->addSubmit('save', 'Save');
$this->onSuccess[] = callback($this, 'correctSubmit');
$this->onError[] = callback($this, 'invalidSubmit');
return $this;
}
- frees
- Člen | 25
frees napsal(a):
Zdravim, nefunguje mi preklad 300+ znakovych stringov. Normalne sa objavia v Nette Translator panely, prelozim ich ulozim, ale dany subor sa nezmeni. Preklad stringov do 20 znakov funguje bez problemu. Ine dlzky som neskusal. Neviete niekto preco to robi?
Naozaj s tym nikto nemate problem?
- .:M@rt!n:.
- Člen | 201
besir napsal(a):
.:M@rt!n:. napsal(a):
.:M@rt!n:. napsal(a):
Ahoj, nahodil jsem si …>
Nikdo neporadí?
Hola,
no pokud Ti to fungnuje a vytvori se Ti potrebne soubory tak se to preklada prave v debugbaru a je to vzdy pro konkretni jazyk na ktery jsi preply. Tzn. pokud mas v kodu v EN tak si prepnes na CZ, otevres translations bar a v levem sloupci vidis prelozene / neprelozene retezce. Zajímají Tě žluté, ty jsou nepřeložené. Klikneš na něj a pak ho v pravem sloupci prekladas (singular = jednotne cislo, plural = mnozne). No a v pravem dolnim rohu mas save ;-)
Tak už nevím, co dělám špatně :)
Mám nastavený defaultní jazyk němčinu. V hlavičce mám přepínání
na češtinu a angličtinu. Po kliknutí na češtinu si otevřu translator
v debugbaru, v levém sloupci vyberu popisek textfieldu, který chci
přeložit. Vpravo do singular napíšu překlad a dole dám save → německý
název v levém sloupci se přepíše na český a zezelená.
Následně se mě vytvoří soubor „de.admin.po“, kde jsou překlady. Jenže
když se přepnu na angličtinu nebo zpátky na defaultní jazyk, tak tam není
němčina, ale stále český popisek…