NetteTranslator + NetteFramework-2.0beta-PHP5.3 = problem s Nette\DI\Container

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

Zdravim vsechny,

dnes jsem konecne aktualizoval Nette na novou verzi NetteFramework-2.0beta-PHP5.3, pomoci migracniho skriptu updatoval namespaces. Mam vsak problem s NetteTranslatorem (https://forum.nette.org/…lation-panel)

Config.ini jsem prepsal na config.neon, takze misto
(config.ini)

variables.langDir = %appDir%/lang ; složka s překlady
variables.lang = cs_CZ ; výchozí jazyk
services.Nette-ITranslator.option.file = %appDir%/lang/en.mo
services.Nette-ITranslator.factory = "NetteTranslator\\Gettext::getTranslator" ; nastavení
services.Nette-ITranslator.run = TRUE ; samotné zapnutí

mám nyní v config.neon

common:
	php: # PHP configuration
		date.timezone: Europe/Prague
		# session.save_path: "%tempDir%/sessions"
		# zlib.output_compression: yes
		# default_charset: "UTF-8"

	services:
		authenticator:
			class: UsersModel

		robotLoader:
			run: true
		translator:
			option.file: %appDir%/lang/en.mo
			factory: "NetteTranslator\\Gettext::getTranslator"
			run: TRUE

	variables:
		langDir: %appDir%/lang
		lang:  cs_CZ

Misto

Environment::getService('Nette\Localization\ITranslator')

nyni pouzivam

Environment::getService('translator')

Pro pokusu nacist sablonu, kde dochazi k prekladu ale dostanu chybovou hlasku

Fatal Error

Cannot use object of type Nette\DI\Container as array

Je to soubor Gettext.php.

485:         * Get translator
486:         *
487:         * @param array $options
488:         * @return NetteTranslator\Gettext
489:         */
490:        public static function getTranslator($options)
491:        {
492:            return new static(isset($options['dir']) ? (array) $options['dir'] : NULL, Environment::getVariable('lang', 'en'));
493:
494:        }

Netusim, co s tim, resp. kde je problem a jak jej vyresit. Diky predem za pomoc!

smasty
Člen | 90
+
0
-

Ako prvý parameter pre factory sa predáva Nette\DI\Container, options sú teraz v druhom parametri.

Ešte by som zmenil ten option.file na:

option:
	file: %appDir%/lang/en.mo

Nie som si istý, či v NEONe funguje bodková syntax.

Editoval smasty (4. 6. 2011 19:24)

moonlite
Člen | 8
+
0
-

Diky za odpoved – tohle jsem zkusil jiz predtim – upravit getTranslator nasledovne:

public static function getTranslator(\Nette\DI\Container $container, $options)
	{...}

Jeden problem jsem tim (snad) vyresil, jenze je tu dalsi.

Pokud chci translator zaregistrovat k sablonam, tak doted jsem mel v BasePresenter.php tento kod:

class BasePresenter extends \Nette\Application\Presenter
{
        protected function createTemplate()
        {
                $template = parent::createTemplate();
                $template->setTranslator(\Nette\Environment::getService('Nette\ITranslator'));
                return $template;
        }
}

Jenze nyni to zhavaruje na hlasce:
Declaration of BasePresenter::createTemplate() should be compatible with that of Nette\Application\UI\Control::createTemplate()

Tady opet nevim, co dal… Co s tim? :)

Editoval moonlite (4. 6. 2011 19:29)

smasty
Člen | 90
+
0
-

Nette\Application\UI\Control::createTemplate() prijíma nepovinný parameter $class, viď. API.

Edit: Namiesto Environmentu použi DI Container.

class BasePresenter extends \Nette\Application\Presenter
{
        protected function createTemplate($class = NULL)
        {
                $template = parent::createTemplate($class);
                $template->setTranslator($this->context->translator);
                return $template;
        }
}

Editoval smasty (4. 6. 2011 19:34)

moonlite
Člen | 8
+
0
-

Aha, mas skutecne pravdu. Diky moc. Zajimavy pro me je jen to, ze ve verzi NetteFramework-2.0dev-PHP5.3 to bylo OK.

Nicmene: Translator jiz preklada, a zbyva asi posledni problem – nedari se mi jen pridat do DebugBaru. Doted stacilo v bootstrap.php

NetteTranslator\Panel::register();

Pokud tento radek zakomentuju, DebugBar se zobrazi. Pokud odkomentuju, chybou to sice neskonci, ale debugbar se nezobrazi…

studna
Člen | 181
+
0
-

https://github.com/…er/Panel.php#L196

V současném Nette to není Nette\Debug ale Nette\Diagnostics\Debugger.

smasty
Člen | 90
+
0
-

Okrem toho je metóda Debugger::addPanel() deprecated a mala by sa nahradiť za

\Nette\Diagnostics\Debugger::$bar->addPanel(new static($layout, $height));
moonlite
Člen | 8
+
0
-

Diky za postrehy:
V Panel.php jsem v metode register() nahradil

	public static function register(IEditable $translator = NULL, $layout = NULL, $height = NULL)
	{
// \Nette\Diagnostics\Debugger::addPanel(new static($layout, $height));
	    \Nette\Diagnostics\Debugger::$bar->addPanel(new static($layout, $height));
	}

a v tom samem souboru nahradil vsechna volani

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

a v bootstrap.php pak

NetteTranslator\Panel::register();

Jenze panel (resp. ladenka) se vubec nezobrazi.

Co jeste delam spatne? :-/

smasty
Člen | 90
+
0
-

Skús si zobraziť zdrojový kód stránky a pohladať v ňom nejaké (skryté) zmienky o PHP chybe alebo Exception.

moonlite
Člen | 8
+
0
-

Bingo! Byl tam exception ohledne Environment::getService(‚Nette\ITranslator‘) – musel jsem to nahradit jeste v panel.phtml a shortcuts.php.

Uz je to OK :-)

DIKY za spolupraci!!! ;-)

illagrenan
Člen | 12
+
0
-

moonlite napsal(a):

Diky za odpoved – tohle jsem zkusil jiz predtim – upravit getTranslator nasledovne:

public static function getTranslator(\Nette\DI\Container $container, $options)
	{...}

Ahoj upravil jsem Gettext.php podle toho, co jsi psal (před tím stejná chyba, stejná verze nette, tedy 2.0 beta pro 5.3).

A nyní mi to hází:

Warning
Missing argument 2 for NetteTranslator\Gettext::getTranslator()

Nesetkal si se s tím?

Tomáš Votruba
Moderator | 1114
+
0
-

@illagrenan: Projdi si toto, jestli ti to nějak nepomůže.

Také zkouším implementovat do Nette 2.0 (předtím jsem Translator nepoužíval). Uvedu i chyby, které jsem vyřešil, kdyby někdo řešil to samé:

1. chyba: call_user_func() expects parameter 1 to be a valid callback, class 'NetteTranslator\Gettext' not foundstáhnout NetteTranslator z https://github.com/…eTranslator/ a dát jej do libs.

2. chyba: Interface 'Nette\ITranslator' not foundpřejmenovat Nette\Localization\ITranslator.php ř. 35 z \Nette\ITranslator na \Nette\Localization\ITranslator

3. chyba: Cannot use object of type Nette\DI\Container as array – řešení viz výše

4. chyba: Service 'Nette\ITranslator' not found.přepsat bootstrap.php z Environment::getService("\Nette\ITranslator")... na Environment::getService("translator")..., stejně tak v services v config.neon musí být uvedeno translator! (v návodu k NetteTranslator se píše něco jiného)

5. chyba: Missing argument 2 for NetteTranslator\Gettext::addFile()v bootstrap.php přidat ..>addFile("%appDir%/lang/") na ..>addFile("%appDir%/lang/","cs")

6. chyba: pár oprav Debug tříd v NetteTranslator\Panel.php

7. chyba: Declaration of BasePresenter::createTemplate() should be compatible with that of Nette\Application\UI\Control::createTemplate() → řešení viz výše

Teď už to žádné chyby nehází. Zítra otestuju, zda to funguje.

Aurielle
Člen | 1281
+
0
-

Zapomněl jsem vám dát na GH novou verzi… napravím ;)
edit: máte ji tam: https://github.com/…teTranslator

Editoval gmvasek (12. 7. 2011 10:06)

Tomáš Votruba
Moderator | 1114
+
0
-

Díky! Tak jsem stáhnul a nyní mám chybu: Argument 1 passed to NetteTranslator\Panel::register() must implement interface Nette\DI\IContainerbootstrap.php, v tom už se neorientuju. Mohl bych poprosit o vzorový bootstrap.php pro Nette 2.0?

Aurielle
Člen | 1281
+
0
-

Stačí předat metodě register() DI kontejner čili kontext z bootstrapu. Přidával jsem to i do readme, nicméně:

$configurator = new Nette\Configurator;
$container = $configurator->loadConfig(__DIR__ . '/config.neon');

$application = $container->application;
// ...

// Tohle je důležité:
NetteTranslator\Panel::register($container, $container->translator);
Tomáš Votruba
Moderator | 1114
+
0
-

Potřeboval bych to opravdu celé. $containteru zřejmě něco chybí. Tvůj poslední řádek mi vrací Trying to get property of non-object search.

Aurielle
Člen | 1281
+
0
-

Pošli sem svůj bootstrap…

Tomáš Votruba
Moderator | 1114
+
0
-

Je tam dost bordelu od zkoušení nefunkčního $containeru, ale snad mi pomůžeš.

<?php

/**
 * My Application bootstrap file.
 */

use Nette\Diagnostics\Debugger,
	Nette\Application\Routers\SimpleRouter,
	Nette\Application\Routers\Route,
	Nette\Environment,
	Nette\Database\Connection,
	Nette\DI\IContainer;

// Load Nette Framework
// this allows load Nette Framework classes automatically so that
// you don't have to litter your code with 'require' statements
require LIBS_DIR . '/Nette/loader.php';


// Enable Nette\Debug for error visualisation & logging
Debugger::$strictMode = TRUE;
Debugger::enable();

// Debugger::$email = 'tomas.vot@gmail.com';

$container = new Nette\DI\Container;

// Load configuration from config.neon file
$configurator = new Nette\Configurator;
$container = $configurator->loadConfig(__DIR__."/config.neon");
// $configurator->container->session->setExpiration('+ 90 days');
// $configurator->container->session->start();

// dibi
Environment::loadConfig( __DIR__ ."/config.neon");

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

dibi::connect(Environment::getConfig("database"));

// Configure application
$application = $configurator->container->application;
$application->errorPresenter = 'Error';
$application->catchExceptions = TRUE;


// Setup router
$application->onStartup[] = function() use ($application) {
	$router = $application->getRouter();
/*	$router[] = new Route('<one>/<two>/<three>', function($presenter, $one, $two, $three) {
		echo "$one $two $three";
	});
*/
	$router[] = new Route('logout', array(
		'presenter' => 'Base',
        'action' => 'logout',
	));
	$router[] = new Route('index.php', 'Homepage:default', Route::ONE_WAY);
	$router[] = new Route('<presenter=homepage>/<action=default>[/<id>]');

};

// Run the application!
$application->run();
?>
Aurielle
Člen | 1281
+
0
-

Mícháš dohromady DI a Environment. Doporučuju podívat se na bootstrap ze sandboxu a upravit si svůj soubor podle něj…

Tomáš Votruba
Moderator | 1114
+
0
-

Díky za nasměrování, trpělivost a vhodnou chvíli, dneska jsem měl nějakou šťastnou ruku. Co už řeším dny, vyřešil jsem za pár minutku. Hodím sem můj bootstrap.php a config.neon, kdyby někdo řešil podobné problémy.

FUNKČNÍ – obsahuje NetteTranslator a dibi

bootstrap.php

<?php

/**
 * My Application bootstrap file.
 */


use Nette\Diagnostics\Debugger,
	Nette\Application\Routers\SimpleRouter,
	Nette\Application\Routers\Route;


// Load Nette Framework
require LIBS_DIR . '/Nette/loader.php';


// Enable Nette\Debug for error visualisation & logging
Debugger::$strictMode = TRUE;
Debugger::enable();
// Debugger::$email = 'tomas.vot@gmail.com';


// Load configuration from config.neon file
$configurator = new Nette\Configurator;
$configurator->loadConfig(__DIR__ . '/config.neon');


// Configure application
$application = $configurator->container->application;
$application->errorPresenter = 'Error';
$application->catchExceptions = TRUE;


// Session
$configurator->container->session->setExpiration('+ 90 days');
$configurator->container->session->start();


// Translator
$configurator->container->getService("translator")->addFile("%appDir%/lang/","");
NetteTranslator\Panel::register($configurator->container, $configurator->container->translator);


// dibi
dibi::connect($configurator->container->params['database']);


// Setup router
$application->onStartup[] = function() use ($application) {
	$router = $application->getRouter();

	$router[] = new Route('logout', array(
		'presenter' => 'Base',
        	'action' => 'logout',
	));

	$router[] = new Route('index.php', 'Homepage:default', Route::ONE_WAY);

	$router[] = new Route('<presenter>/<action>[/<id>]',array(
		'presenter' => 'Homepage',
		'action' => 'default',
	));

};

// Run the application!
$application->run();

?>

config.neon

<?php

#
# SECURITY WARNING: it is CRITICAL that this file & directory are NOT accessible directly via a web browser!
#
# If you don't protect this directory from direct web access, anybody will be able to see your passwords.
# https://nette.org/en/security-warning
#
common:
	php: # PHP configuration
		date.timezone: Europe/Prague
		# session.save_path: "%tempDir%/sessions"
		zlib.output_compression: yes
		default_charset: "UTF-8"

	services:
		authenticator:
			class: UsersModel

		robotLoader:
			run: true

		translator:
			factory: NetteTranslator\Gettext::getTranslator

	variables:
		langDir: %appDir%/lang
		lang: cs_CZ


production < common:
	database:
		driver: mysql
		host: mysql5
		database: database
		username: username
		password: password
		profiler: TRUE
		charset: utf8

development < common:
	database:
		driver: mysql
		host: localhost
		database: database
		username: username
		password: password
		profiler: TRUE
		charset: utf8

?>

Editoval Schmutzka (13. 7. 2011 18:28)

Tomáš Votruba
Moderator | 1114
+
0
-

@gmvasek: Používám tvůj NetteTranslator, ale v debug panelu mi nabíhá jenom singular a když zkusím přeložit jednu věc, tak mám chybu:

Undefined offset: 1

..\Gettext.php

248:                $this->metadata[$identifier][trim($tmp[0])] = count($tmp) > 2 ? ltrim(strstr($metadata, $pattern), $pattern) : $tmp[1];

Plus jestli mohu poprosit nasměrování, jak pak pracovat s En a Cz verzí (vytvoření, aktivace, routy), teď se mi uloží pouze „cs_CZ..mo“ (navíc nechápu, proč tam jsou 2 tečky, v configu výše [používám] mám název bez tečky).

Díky

Díky.

voda
Člen | 561
+
0
-

Máš správně nastaveno „Plural-Forms“ v .po souboru?

Tomáš Votruba
Moderator | 1114
+
0
-

voda napsal(a):

Máš správně nastaveno „Plural-Forms“ v .po souboru?

Děkuji za nápovědu, řešení jsem našel na http://charlie.cz/…t-extractor/, konkrétní první screenshot Nastavení a nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;.

Edit: nejde toto nastavit nějak jinak? Stahovat a instalovat kvůli takové maličkosti program, jehož funkci tu zastává onen bar mi přijde zbytečný krok navíc. – DOTAZ STÁLE TRVÁ

Staré/nové dotazy:

  1. jak na aktivaci En či Cz verze (defaultní, jak jsem správně pochopil)?
  2. název cs_CZ..mo s 2 tečkami je vpořádku? Kde by mohla být chyba? (nepodstatné, jen kosmetika)
  3. podstatné: text mám zapsaný rovnou v češtině, tedy {_"Český výraz"} – nechci tedy vše přepisovat; nešlo by to udělat tak, že translator se aktivuje pouze tehdy, bude-li anglická verze se aktivována? Příapdně jak na to.

EDIT:
1)+3) jsem vyřešil tak, že pokud bude $lang = „en“, aktivuje se translator, jinak zůstane původní česká verze

  1. vyřešeno :)

Brzo snad sepíši nějakou helpku, tohle je fakt hrozné.

Editoval Schmutzka (22. 7. 2011 6:03)

sinacek
Člen | 23
+
0
-

FUNKČNÍ – obsahuje NetteTranslator a dibi

Už nefunkční, doporučuji se podívat na https://forum.nette.org/…sledni-verzi

Tomáš Votruba
Moderator | 1114
+
0
-

Všechny problémy s NetteTranslator v novém Nette 2.0 (2012–02–03) by měl zodpovědět návod v Kuchařce.