NetteTranslator + NetteFramework-2.0beta-PHP5.3 = problem s Nette\DI\Container
- moonlite
- Člen | 8
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!
- moonlite
- Člen | 8
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
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
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
https://github.com/…er/Panel.php#L196
V současném Nette to není Nette\Debug ale Nette\Diagnostics\Debugger.
- moonlite
- Člen | 8
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? :-/
- illagrenan
- Člen | 12
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
@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 found
→ stáhnout NetteTranslator z https://github.com/…eTranslator/
a dát jej do libs
.
2. chyba: Interface 'Nette\ITranslator' not found
→
př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
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
Díky! Tak jsem stáhnul a nyní mám chybu:
Argument 1 passed to NetteTranslator\Panel::register() must implement interface Nette\DI\IContainer
v bootstrap.php, v tom už se neorientuju. Mohl bych poprosit
o vzorový bootstrap.php pro Nette 2.0?
- Aurielle
- Člen | 1281
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
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
.
- Tomáš Votruba
- Moderator | 1114
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();
?>
- Tomáš Votruba
- Moderator | 1114
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
@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.
- Tomáš Votruba
- Moderator | 1114
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:
- jak na aktivaci En či Cz verze (defaultní, jak jsem správně pochopil)?
- název
cs_CZ..mo
s 2 tečkami je vpořádku? Kde by mohla být chyba? (nepodstatné, jen kosmetika) - 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
- vyřešeno :)
Brzo snad sepíši nějakou helpku, tohle je fakt hrozné.
Editoval Schmutzka (22. 7. 2011 6:03)
- sinacek
- Člen | 23
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
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.