NetteTranslator (GettextTranslator & Nette Translation Panel)

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

Jedna otázka, jakým způsobem vytváříte překlady pro formuláře? To co mam v šabloně se mi krásně vytáhne do translation panel, ale existuje trik jak tam dostat i formulářový labely?

Samožejmě si můžu labely jednou ručně vypsat do šablony, ale formuláře se mění a je to takový řešení „přes ruku“.

kudlajz
Člen | 70
+
0
-
$form->setTranslator();
kuty.cz
Člen | 33
+
0
-

kudlajz napsal(a):

$form->setTranslator();

jseš si jistý, že tohle zajistí vytažení textů do translation panelu?

kudlajz
Člen | 70
+
0
-

Ano, sam to tak pouzivam na nekolika projektech. Samozrejme te metode musis vlozit sluzbu translatoru, takze napr. $form->setTranslator($this->translator), prip. $form->setTranslator($this->context->translator);

Editoval kudlajz (29. 4. 2013 15:33)

castamir
Člen | 629
+
0
-

Musíš tam vložit jako parametr instanci translatoru. Translator získáš z DIc do presenteru / komponenty pomocí metody inject* nebo konstruktorem

$form->setTranslator($translator);

kompletní příklad

/** var \GettextTranslator\Gettext */
public $translator;

public final function injectTranslator(\GettextTranslator\Gettext $translator)
{
	$this->translator = $translator;
}

public function createComponentFoo()
{
	$form = new Form;
	$form->setTranslator($this->translator);
	// ...
}
castamir
Člen | 629
+
0
-

@kudlajz použití context pro přístup ke službě se nedoporučuje. Context bude (asi už v 2.1) odstarněn.

kuty.cz
Člen | 33
+
0
-

Jak dat formulari translator vim a nastaveny ho mam (kdyz uz nejaky text prelozeny je, tak se ve formulari spravne prelozi), jen se mi ty fraze nedostanou do panelu, abych je z nej prelozil. Netusil jsem, ze by mel umet vytahnout fraze i z formulare, takze jdu hledat problem, proc to neleze do panelu.

miler
Člen | 75
+
0
-

Existuje možnost jak vytáhnout úplně všechny termy definované ve zdrojovém kódu? Translation Panel mi totiž ukazuje jen ty, které už „na mě někde vyskočily“. Díky moc.

JL
Člen | 24
+
0
-

Ahoj,

používal jsem původní verzi translatoru a před časem jsem přešel na verzi 2 (nyní 2.0.2).

V ní se mi líbí že lze snadno oddělit moduly. Teď ale potřebuji toto rozdělení v jednom projektu odstranit a mám s tím trochu problém.

Smazal jsem v configu umístění soborů pro admin module a smazal obsah složky lang.

Na frontendu vše funguje, ale v backendu to je poněkud zvláštní. Některé překlady se vůbec nenaštou do translation panelu (může být ale s tím nesouvisející problém), ale hlavně překlady které patří do admin modulu nejdou v translation panelu přeložit. Nejde jej v panelu vybrat kliknutím.

Nesetkali jse se s tím někdo, prosím? Zkoušel jsem v configu dát místo front: → universal: a pak nejdou překlady ani na frontendu. Možná není možné překládat texty jiného modulu pokud nemá svůj vlastní language soubor?

Druhá otázka je – lze ještě jiným způsobem oddělit některé překlady do jiného souboru, než modulem?

Díky moc.

Editoval JL (11. 5. 2013 2:10)

SontoEremo
Člen | 341
+
0
-

Zdravím…
Prosím mohol by mi niekto pomocť s prekladom v Šablóne konkrétne s {control $form errors} ?
skúšal som už všeličo ale stále to skončilo s chybou
Moje pokusi:

{_("control $form errors")} <-- Chyba
{control _("$form errors")} <-- Chyba
_("{control $form errors}") <-- Chyba
{control $form _("errors")} <-- Chyba

Potrebujem preložiť konrétne toto

$userRepository = $this->users;
		$Rform = new Form;
		$Rform->setTranslator($this->translator);
		$Rform->addText('email', $this->translator->translate('Email adress'))
			  ->setAttribute('class', 'm-wrap span12')
			  ->setRequired($this->translator->translate('Please enter your email address'))
			 ->addRule(Form::EMAIL, $this->translator->translate('The entered email is not valid! Check it please.'))
			 ->addRule(function($input) use($userRepository )
             {
                return !$userRepository->emailExists($input->value);
           TOTO-->>  }, $this->translator->translate('The specified email address is already registered! Please choose another one.'));

Mám Jazyky SK CS a EN všetko mi preloži perfektne okrem

$this->translator->translate('The specified email address is already registered! Please choose another one.')

Toto jedno je stále v SK či už mám nastavený CS alebo EN jazyk

ďakujem vopred.

dada-amater
Bronze Partner | 52
+
0
-

@SontoEremo: Pokud nastavis formulari translator

<?php
$Rform->setTranslator($this->translator);
?>

Automaticky se pak prekladaji vsechny popisky i hodnoty v inputech, takze se nemusi pouzivat (jinak se to preklada 2x)

<?php
$this->translator->translate('Email adress'));
?>

Veta ‚The specified email address is already registered! Please choose another one.‘ se ti neprelozi proto, protoze $this->translator neni translator, $this uvnitr anonymni funkce odkazuje na neco jineho. Zalezi na verzi php ktere pouzivas. Nicmene to resit nemusis, protoze jak jsem rikal, metody tranlate() za tebe uz zavola formular.

Editoval dada-amater (20. 5. 2013 10:03)

SontoEremo
Člen | 341
+
0
-

@dada-amater:

Vďaka pomohlo :)

Ešte sa ta chcem spýtať…
Preložil som komplet stránku do EN premazal temp zmazal preklady (zložku lang ponechal :) )
Aktualizoval ale stále sa mi tam ukazujú veci ešte v SK jazyku napr. zadajte váš email ale 3× som všetko prešiel popremazal atď… no nič nepomáha. Nevieš náhodou kde môže byť chyba? ďakujem za odpoveď.

Tie sk veci mám tym na mysli, že sa mi to ukazuje v paneli.

HappyFace
Člen | 162
+
0
-

Ahojte,

nastavil som si tento doplnok do nette podla navodu, vsetko pekne nabehne, v panely sa zobrazi oznamenie ze mam neprelozene nejake texty, takze si otvorim polozku ale tlacitko SAVE mam sede a ked kliknem na nejaky text aby som ho vybral, tak sami v JS konzoly objavi hlasenie

„Uncaught TypeError: Cannot read property ‚This is translation text‘ of undefined“

pouzivam NETTE 2.0.10

za pomoc vopred dakujem

SinyaWeo
Člen | 6
+
0
-

Zdravím,

nikde se mi nedaří najít jak překládat throw zprávy, například

throw new Security\AuthenticationException(_('THE_USERNAME_IS_INCORRECT.'), self::IDENTITY_NOT_FOUND);

V DebugBaru se mi tento řetězec vůbec nezobrazí, zatímco všechny ostatní překlady fungují.

Prosím o nakopnutí správným směrem.

Díky Milan.

kudlajz
Člen | 70
+
0
-

Zkus hlasku radeji prekladat v presenteru, kde tuto exception odchytavas.

try {
	..
} catch (Security\AuthenticationException $e) {
	$this->flashMessage($this->template->translate('TVUJ_TEXT'));
}
h4kuna
Backer | 740
+
0
-

SinyaWeo napsal(a):

throw new Security\AuthenticationException(_('THE_USERNAME_IS_INCORRECT.'), self::IDENTITY_NOT_FOUND);

Ač doplněk má v názvu gettext tak pro překlad gettext nepoužívá, proto ti takto překlad nebude fungovat, to by jsi musel použít jiný překladač. Proto překlady musíš obalit viz:

kudlajz napsal(a):

try {
	..
} catch (Security\AuthenticationException $e) {
	$this->flashMessage($this->template->translate('TVUJ_TEXT'));
}
dada-amater
Bronze Partner | 52
+
0
-

Nebo si odinstaluj gettext a vytvor si alias _("") a mas to bez prace.

h4kuna
Backer | 740
+
0
-

dada-amater napsal(a):

Nebo si odinstaluj gettext a vytvor si alias _("") a mas to bez prace.

Taky je potřeba pamatovat na to zda si to můžeš dovolit i na ostrém servru.

SinyaWeo
Člen | 6
+
0
-

Zdravím,

já myslel, že musím překládat když házím a ono až při chytání :-)

Problém je možná taky v tom, že zpráva se nezobrazuje jako flashMessage, ale takhle:

public function signInFormSucceeded($form)
	{
		$values = $form->getValues();
		if ($values->remember) {
			$this->getUser()->setExpiration('+ 14 days', FALSE);
		} else {
			$this->getUser()->setExpiration('+ 20 minutes', TRUE);
		}
		try {
			$this->getUser()->login($values->username, $values->password);
		} catch (Nette\Security\AuthenticationException $e) {
			$form->addError($e->getMessage());
			return;
		}
		$this->redirect('Homepage:');
	}

Zprávy vznikají takhle:

public function authenticate(array $credentials)
	{
		list($username, $password) = $credentials;
		$row = $this->users->findUserByName($username);
		if (!$row) {
			throw new Security\AuthenticationException('THE_USERNAME_IS_INCORRECT.', self::IDENTITY_NOT_FOUND);
		}
		if ($row->password !== $this->calculateHash($password, $row->password)) {
			throw new Security\AuthenticationException('THE_PASSWORD_IS_INCORRECT.', self::INVALID_CREDENTIAL);
		}
		unset($row->password);
		return new Security\Identity($row->id, NULL, $row->toArray());
	}

Je to quickstartu – Úkolníček.

jiri.pudil
Nette Blogger | 1029
+
0
-

Mělo by se to přeložit automaticky, pokud má formulář nastavený translator (typicky v továrničce):

$form->setTranslator($this->translator);

EDIT: $ŧhis → $this

Editoval jiri.pudil (19. 6. 2013 10:59)

SinyaWeo
Člen | 6
+
0
-

To je právě to, že se to nepřeloží. Formulář má přitom translator nastavený (všechny ostatní texty se mi přeloží/zobrazí v DebugBaru k přeložení):

	protected function createComponentSignInForm()
	{
		$form = new UI\Form;
		$form->setTranslator($this->translator);
		$form->addText('username', 'USER_NAME:')
			->setRequired('PLEASE_ENTER_YOUR_USERNAME.');
		$form->addPassword('password', 'PASSWORD:')
			->setRequired('PLEASE_ENTER_YOUR_PASSWORD.');
		$form->addCheckbox('remember', 'KEEP_ME_SIGNED_IN');
		$form->addSubmit('send', 'SIGN_IN');
		// call method signInFormSucceeded() on success
		$form->onSuccess[] = $this->signInFormSucceeded;
		return $form;
	}
h4kuna
Backer | 740
+
0
-

Proč tam máš ‚USER_NAME:‘?? Namísto normálního textu.

SinyaWeo
Člen | 6
+
0
-

Tak nějak se mi to líbí, že budu mít jazykové soubory pro všechny jazyky včetně výchozího.

h4kuna
Backer | 740
+
0
-

To jsem taky dělal jednoho krásného dne zjistíš že se v těch textech nevyznáš a horko těžko budeš generovat soubor pro překlad aby jsi ho poslal a nechal někde přeložit (fr, it, ge). Pokud budeš chtít upravit originální text aniž by jsi ovlivnil ostatní slovníky tak právě pak měníš výchozí slovník a jednou za čas udělat revizi slovníků. Lepší je rovnou to upravovat ve všech slovnících. Klient si takto upravuje texty v české verzi a jednou za čas synchronizuju s ostatními slovníky.

dada-amater
Bronze Partner | 52
+
0
-

Mam jeden problem: drive jsem pouzival klasicky gettext, cili kdyz jsem chtel vygenerovat soubory pro preklad, bylo to jednoduche a mel jsem to kompletni. Tady s tim mam problem. Za prve nevim jak vygenerovat vsechny texty, aniz bych prochazel cely web a ukladal je. Navic je nutne to delat pro kazdy jazyk, aby se to tam doplnilo. Mozna jsem jen neprisel na spravne workflow. Podle me by bylo zadouci:

  1. pokud se nejaky text nenajde ve slovniku, automaticky ho pridat. Nejen ho zobrazit v debugbar komponente, ale rovnou zapsat i do .po souboru.
  2. tyto zmeny mergovat do vsech jazykovych mutaci, aby se to nemuselo prochazet vsude
  3. v debug baru zobrazit uplne vsechny texty co nejsou v .po souboru prelozene
  4. kdyz zakladam novy jazyk pro preklad, melo by se to automaticky naplnit neprelozenyma hlaskama. Navic by bylo dobre, kdyby se pro standardni jazyky automaticky generovali hlavicky pro plural, se to pak nemusi menit rucne ;-).

Mozna je spousta techto vlastnost implementovana, jen jsem na to neprisel. Tak mi prosim poradte. Moc dekuju.

iguana007
Člen | 970
+
0
-

dada-amater napsal(a):

… nevim jak vygenerovat vsechny texty, aniz bych prochazel cely web a ukladal je …

Já na to používám GettextExtractor (https://github.com/…xt-extractor) … jednoduše si napoprvé vygeneruju překlady do jednoho souboru a updaty pak řeším via .pot v Poeditu nebo přes debug bar (pokud tam nový překlad naskočí).

burisk
Člen | 6
+
0
-

Čaute, pred nejakým tým mesiacom som sa hral s GettextTranslator, a parádne to fungovalo, ale ako som si stiahol (dnes) najnovšie Nette a do toho GettextTranslator (ktorý som si všimol, že sa mierne zmenil) tak to na mňa vybaflo túto chybu: OBRÁZOK

Postupoval som presne podľa postupu, a som to prezeral z každej strany, ale ani za nič neviem prísť veci na chybu. (používam moduly). Neviete čo s tým je? :) Ďakujem zatiaľ.

Šaman
Člen | 2659
+
0
-

Předpokládám, že se změnil namespace pro Extension. Teď by měla být tady

burisk
Člen | 6
+
0
-

Šaman napsal(a):

Předpokládám, že se změnil namespace pro Extension. Teď by měla být tady

Díky, už to funguje :)
Takže stačilo zmeniť iba

class Extension extends \Nette\DI\CompilerExtension { // ...

na

class Extension extends \Nette\Config\CompilerExtension { // ...

Editoval burisk (9. 7. 2013 11:14)

masterr
Začátečník | 141
+
0
-

Můžeš sem dát pls funkční odkaz na stažení?

iguana007
Člen | 970
+
0
-

Ahoj,
dneska jsem si stáhnul poslední verzi z Githubu a překlady mi fungují. Problém mám akorát s formuláři, které se mi nepřekládájí a o panelu ani nemluvě (ten mi sice jde otevřít, ale nejsem schopen žádné akce v něm – tj. ať klikám, jak chci, tak nemůžu nic přeložit).

Formulář mám jako samostatnou třídu a kód u mě vypadá takto:

production < common:
	services:
		translator:
			create: NetteTranslator\Gettext::getTranslator
			setup:
				- addFile(%appDir%/FrontModule/lang/, frontend)
				- NetteTranslator\Panel::register
//bootstrap.php
$configurator->onCompile[] = function ($configurator, $compiler) {
	$compiler->addExtension('gettextTranslator', new \GettextTranslator\DI\Extension);
};
//BasePresenter
	public $translator;

	public final function injectTranslator(\NetteTranslator\Gettext $translator)
	{
		$this->translator = $translator;
	}

	public function createTemplate($class = NULL)
	{
		$template = parent::createTemplate($class);
		if (!isset($this->language)) {
			$this->language = $this->translator->getLang();
		} else {
			$this->translator->setLang($this->language);
		}
		$template->setTranslator($this->translator);
		return $template;
	}
//Formular
class SomeForm extends Nette\Application\UI\Form
{

	public function __construct($parent, $name)
	{
		parent::__construct($parent, $name);

		$this->setTranslator($this->presenter->translator);

		$this->addPassword('heslo', 'Password', NULL, 255);
//...atd...

Problém je v tom, že když si zkontroluju překladové slovníky v POEditu, tak slovo Password tam je přeložené, ale v rámci toho formu se mi prostě nepřeloží (ostatní elementy na stránce/šabloně přeložené jsou) a už nevím, co dělám špatně …

zool
Člen | 144
+
0
-

Ahoj stáhl jsem si poslední verzi tohoto translátoru vše funguje bez problému, ale problém nastane když to chci dát na produkční verzi
vypíše to chybu Call to a member function addPanel() on a non-object

public static function register(Nette\Application\Application $application, Gettext $translator, Nette\Http\Session $session, Nette\Http\Request $httpRequest, $layout, $height)
       {
           Nette\Diagnostics\Debugger::$bar->addPanel(new static($application, $translator, $session, $httpRequest, $layout, $height));
       }

Ono to funguje když mám spuštěný panel, ale když jej vypnu, tak to napíše tuto chybu, mám nette 2.1
Děkuji

zool
Člen | 144
+
0
-

Tak jsem to upravil takto, a zatím jede

Nette\Diagnostics\Debugger::getBar()->addPanel(....)

Editoval zool (22. 7. 2013 6:07)

saimons
Člen | 293
+
0
-

Zdravim, mam problem s modulem. Vse se zda, ze funguje, ale tlacitko „Save“ je zasedle a nelze ho pouzit. Pokud chci oznacit naky nacteny retezec pro preklad v JS mi nastane chyba: this.fillIn(this.strings[this.currentFile][string]); this.strings[this.currentFile][string] is undefined. Zkousel jsem vsemozne debugovat, ale vse se zda v poradku. Pouzivam Nette 2.0.11 a doplnek z Githubu. Nevimte nekdo kde muze byt chyba?

EDIT: Jak jsem dopsal, tak jsem objevil v cem je problem. Ve configu jsem si nadefinoval pouze jeden file a to lyout, ale byl jsem najety v modulu intro, takze se to snazilo najit definici pro intro v this.strings, ale nenaslo, protoze tato pole neexistovalo. Mohlo by to vyhodit nakou hlasku :)

Editoval saimons (23. 7. 2013 18:03)

masterr
Začátečník | 141
+
0
-

Postupoval jsem podle "":https://componette.org/search/?…
Všechno v pohodě až do kroku kdy přidám překlad do šablony. Když přidám překlad a přeložím ho v okne translations, následně refreshnu stránku tak to hodí následující error:

Notice

Undefined index: front

File: …/libs/GettextTranslator/Gettext.php Line: 295

294:            if (!empty($message) && isset($this->dictionary[$message])) {
295:              **  $tmp = preg_replace('/([a-z]+)/', '$$1', "n=$form;" . $this->metadata[$files[0]]['Plural-Forms']);**
296:                eval($tmp);

Proč? Překlady se vytvořili v té složce…

iguana007
Člen | 970
+
0
-

masterr napsal(a):

Postupoval jsem podle "":https://componette.org/search/?…
Všechno v pohodě až do kroku kdy přidám překlad do šablony. Když přidám překlad a přeložím ho v okne translations, následně refreshnu stránku tak to hodí následující error:

Notice

Undefined index: front

File: …/libs/GettextTranslator/Gettext.php Line: 295

294:            if (!empty($message) && isset($this->dictionary[$message])) {
295:              **  $tmp = preg_replace('/([a-z]+)/', '$$1', "n=$form;" . $this->metadata[$files[0]]['Plural-Forms']);**
296:                eval($tmp);

Proč? Překlady se vytvořili v té složce…

Vypadá to, že v .PO souboru nemáš definované pluraly
"Plural-Forms: nplurals=3; plural=((n==1) ? 0 : (n>=2 && n<=4 ? 1 : 2));\n"

Editoval iguana007 (25. 7. 2013 19:07)

masterr
Začátečník | 141
+
0
-

mám:

# Gettext keys exported by GettextTranslator and Translation Panel
# Created: 2013-07-25 12:48:53
msgid ""
msgstr ""
"PO-Revision-Date: 2013-07-25 12:48+0200\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"


msgid "Odhlásit se"
msgstr "Logout"

Edit:
Co tam dělá tohle na začátku?

msgid ""
msgstr ""

Editoval masterr (25. 7. 2013 14:10)

dada-amater
Bronze Partner | 52
+
0
-

Ahoj, vim ze tam je bug, kdyz se pouziva cachovani. Mam v planu pull request. Problem je, ze se cachuji jen preklady a ne metadata, tudiz pole je pak prazdne. Zkusim to stihnout pres vikend.

masterr
Začátečník | 141
+
0
-

Ahoj, jak to vypadá prosím tě. Nechci nějak naléhat, až tak to nespěchá…

HappyFace
Člen | 162
+
0
-

Prosim Vas je mozne nejako do toho PO dostat naraz vsetky prekladane slova? .. lebo som dostal za ukol spravit lokalizacie uz na existujucom projekte, ktory je velky a drobeckovo dopatravat vsetky slova je sprepacenim o hubu ..alebo islo by nastavit nejako POedit nastavit aby si vyhladal slova, ktore su v {_"orginal"} atd

aRagornol
Člen | 17
+
0
-

edit : Po nainstalovani 2.0.2 funguje OK. Chyba bude v 2.0.10

Mohol by som poprosit o pomoc. Rozsirenie som nainstaloval, v debug panel sa mi zobrazuje. Po otvoreni kliknem na label zo sablony, ktory chcem prelozit. Kliknem SAVE a vypise – Successfuly saved, preklad zozelena. Nie su vsak vytvorene ziadne subory v zlozke %app%/lang
(adresar vytvoreny /app/lang/, prava 777). Po refresh stranky panel opet oznami, ze su dostupne label na preklad.

Nette : 2.0.12
PHP : 5.3.20
GettextTranslator : 2.0.10 / master (instalovane z GIT)

Pre spojazdnenie GettextTranslatora som musel pridat nasledovne

		session:
			autoStart: yes

inak pouzivam skoro defaultny sandbox

config.neon

	gettextTranslator:
		lang: en
		files:
			web: %appDir%/lang # for module Front and other non-specified modules
		# optional with defaults
		layout: horizontal # or: vertical
		height: 350

router

$router[] = new Route('<lang=en (sk|en|fr)>', 'Page:default');

default.latte

		<li id="current"><a href=""><span>{_"News"}</span></a></li>

PagePresenter

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


public function startup()
{
    parent::startup();

    if ($this->lang == NULL) {
        $this->lang = $this->translator->getLang();
    }

    $this->translator->setLang($this->lang);
}


public function createTemplate($class = NULL)
{
    $template = parent::createTemplate($class);
    $template->setTranslator($this->translator);

    return $template;
}

Editoval aRagornol (22. 9. 2013 12:24)

Sense
Člen | 1
+
0
-

Edit: Tak už jsem to vyřešil stažením verze 2.0.6 z adresy (https://addons2.nette.org/…tor/versions). Teď to funguje skvěle bez jakýkoliv úprav.


Potřeboval bych maličko popostrčit. Používám Nette 2.0.12, PHP verze 5.4.11 a GettextTranslator 2.0.12 (dnes stažený z GITu). Moje soubory vypadají takto:

1. config.neon

common:
  gettextTranslator:
    lang: cs
    files:
      application: %appDir%/i18n

2. bootstrap.php

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

3. SecuredPresenter

<?php
abstract class SecuredPresenter extends BasePresenter {

  public $lang;
  public $translator;

  public function injectTranslator(GettextTranslator\Gettext $translator) {
    $this->translator = $translator;
  }

  protected function startup() {

    parent::startup();
    $user = $this->getUser();

    if (!$user->isLoggedIn()) {
      $this->redirect('Sign:in');
    }

    if (!$user->identity->lang) $user->identity->lang = $this->translator->getLang();
    $this->lang = $user->identity->lang;
    $this->translator->setLang($this->lang);

  }

}
?>

4. formulář:

<?php
protected function createComponentUserProfileForm() {
  $form = new Form;
  $form->setTranslator($this->translator);
  ...
?>

Po načtení presenteru na mě nejdříve vyskočila první chybová hláška, stejná, jako zde řešil uživatel zool. Nicméně u mě to bylo naopak, místo:

<?php
Nette\Diagnostics\Debugger::getBar()->addPanel(...)
?>

jsem použil:

<?php
Nette\Diagnostics\Debugger::$bar->addPanel(...)
?>

a problém zmizel.

Teď se mi v debug baru objevuje vlaječka a načtou se mi všechny texty ve formuláři. Když ale udělám jakoukoliv úpravu a kliknu na Save, tak se mi objeví Unexpected error a vyskočí pop-up okno s chybou:

Fatal error: Call to a member function generateMetadata() on a non-object in C:\Dev\www1\libs\GettextTranslator\Gettext.php on line 314

což je řádek:

<?php
$metadata = $this->fileManager->generateMetadata($file, $this->metadata);
?>

Nevíte, kde by mohla být chyba? Děkuji za pomoc.

Editoval Sense (7. 10. 2013 17:30)

hejdav
Člen | 50
+
0
-

Ahoj ahoj!
GettextTranslator jsem implementoval a funguje SKVĚLE!

Jedna maličkost mě deprimuje – uložim si překlady na stránce a pak zjistim, že bych chtěl nějakej implicitní text v šabloně přepsat. Tak to udělám, jenže překlad už mám uloženej. Translation panel mi přepsaný text nabídne k překladu, takže je vše OK. Jen mě štve, že původní překlad zůstane v *.po, *.mo souborech natrvalo a nevím jak se ho zbavit (resp. nevím jak se ho zbavit z *.mo souboru). Ničemu to nepřekáží ale chtěl bych to mít ťip ťop.

Bych i udělal nějakej pull request, kde by šly překlady mazat, ale chtěl bych nejdřív znát názor ostatních :)

2bfree
Člen | 248
+
0
-

Pro práci s .po a .mo soubory slouží programy jako PoEdit V něm načteš .po soubor a vyexportuješ .mo

hejdav napsal(a):

Ahoj ahoj!
GettextTranslator jsem implementoval a funguje SKVĚLE!

Jedna maličkost mě deprimuje – uložim si překlady na stránce a pak zjistim, že bych chtěl nějakej implicitní text v šabloně přepsat. Tak to udělám, jenže překlad už mám uloženej. Translation panel mi přepsaný text nabídne k překladu, takže je vše OK. Jen mě štve, že původní překlad zůstane v *.po, *.mo souborech natrvalo a nevím jak se ho zbavit (resp. nevím jak se ho zbavit z *.mo souboru). Ničemu to nepřekáží ale chtěl bych to mít ťip ťop.

Bych i udělal nějakej pull request, kde by šly překlady mazat, ale chtěl bych nejdřív znát názor ostatních :)

sKopheK
Člen | 207
+
0
-

Ahoj,

nemůžu zprovoznit Nette tester pro mou aplikaci, kde využívám rozšíření GettextTranslator. Zkouším jednoduché Velestručné testování presenterů v Nette

Adresářová struktura projektu:

- app
-- lang
- libs
-- schmutzka
--- gettexttranslator
---- GettextTranslator
- tests

Aby to nehlásilo neexistující jazykový adresář (appDir je namísto app adresář tests) v boostrapu načtu další config pro testování, kde přepíšu adresář pro jazykové soubory:

gettextTranslator:
    files:
        front: %appDir%/../app/lang

Pak ale dostanu chybu

Undefined index: front
in gettexttranslator\GettextTranslator\Gettext.php(156)

Nemáte někdo s testy a GettextTranslatorem zkušenosti?

EDIT: Nette 2.1dev, v adresáři lang jsou soubor cs.front.mo a cs.front.po vytvořené přes Nette Translation Panel. Ve webové aplikaci to funguje bez problémů, jen tester přes CLI hlásí chybu.

Editoval sKopheK (25. 10. 2013 11:55)

sKopheK
Člen | 207
+
0
-

A ještě jeden dotaz: Jak nejlépe udělám překlad částí url? Samozřejmě zachovám parametr lang, ale pak bych podle něj chtěl mít „uzivatel“ namisto „user“ apod.

ic
Člen | 430
+
0
-

sKopheK napsal(a):

A ještě jeden dotaz: Jak nejlépe udělám překlad částí url? Samozřejmě zachovám parametr lang, ale pak bych podle něj chtěl mít „uzivatel“ namisto „user“ apod.

Kdysi dávno se tohle dělalo v bootstrapu → https://github.com/…ootstrap.php#L57 dneska možná v .noen confugu kdoví.

michal.hudecek
Člen | 1
+
0
-

Plugin jsem úspěšně nainstaloval. Zobrazuje se mi i translate panel, ale ani po zdánlivě úspěšném uložení překladu se v adresáři nevytvoří příslušné soubory. Žádnou chybu to nehlásí. Naopak to píše „Sucessfuly saved“. Po reloadu je to zase tam kde to bylo a FTP adresář lang je prázdný. Můžete mě prosím nějak nasměrovat (práva na zápis jsem kontroloval)? Díky!

Editoval michal.hudecek (25. 10. 2013 17:13)

sKopheK
Člen | 207
+
0
-

Je nutné překládat přímo na FTP? Když to zkusíš na localhostu, tak to funguje?

HappyFace
Člen | 162
+
0
-

michal.hudecek napsal(a):

Plugin jsem úspěšně nainstaloval. Zobrazuje se mi i translate panel, ale ani po zdánlivě úspěšném uložení překladu se v adresáři nevytvoří příslušné soubory. Žádnou chybu to nehlásí. Naopak to píše „Sucessfuly saved“. Po reloadu je to zase tam kde to bylo a FTP adresář lang je prázdný. Můžete mě prosím nějak nasměrovat (práva na zápis jsem kontroloval)? Díky!

neviem kde to mas ulozene ak ide o linux server musis nastavit priecinok lang aby mohla snim pracovat grupa apache .. dalej ukladanie prekladu do suboru nieje doriesene/osetrene, ano ak nemas prava v UI sa ti napise ze vsetko je v poriadku ale v skutocnosti to skoncilo vnutornou tichou chybou. Odporucam si to fixnut a to nasledovne:

otvor si GettextTranslator\FileManager a na riadku cca 127 metoda buildPOFile, najdes

file_put_contents($file, $po);

a uprav to napr:

var_dump(file_put_contents($file, $po));

teraz ked nieco ulozis tak v networku uvidis v odpovedy nejaky integer ak sa to ulozilo alebo FALSE ak nieco zlihalo.
Je to len taka pomocka, problem to nevyriesi najlepse by bolo nastavit aby header odpovede nebol 200 ale napr 500-ka ak ten file_put_content skonci ako false, inak vracia velkost ulozeneho file

u .mo filu je to tiez ale tam je to zbytocne nejako ontrolovat lebo ak neprejde toto beriem to tak ze nepreslo ani to druhe

mne to osobne stacilo takto mat osetrene a aj staci, nez nedopisem do toho ukladanie/nacitavanie z DB a cache

Editoval HappyFace (29. 10. 2013 16:28)