Gettext Translator – instalace (How To) Language file(s) must be defined
- VojtaSim
- Člen | 55
Dobrý den,
jsem nováčkem v Nette a potřeboval bych poradit s instalací Gettext
Translatoru, stáhl jsem si aktuální verzi z GitHubu a
nakopíroval do složky /libs/GettextTranslator/
vedle složky
/Nette/
. Instalaci jsem provedl přesně podle dokumentace
Bootstrap.php
use Nette\Application\Routers\Route,
Nette\Application\Routers\RouteList;
// Load Nette Framework or autoloader generated by Composer
require __DIR__ . '/../system/libs/autoload.php';
$configurator = new Nette\Config\Configurator;
// Enable Nette Debugger for error visualisation & logging
$configurator->enableDebugger(__DIR__ . '/../system/log');
// Specify folder for cache
$configurator->setTempDirectory(__DIR__ . '/../system/temp');
// Enable RobotLoader - this will load all classes automatically
$configurator->createRobotLoader()
->addDirectory(__DIR__)
->addDirectory(__DIR__ . '/../system/libs/')
->register();
// Create Dependency Injection container from config.neon file
$configurator->addConfig(__DIR__ . '/config/config.neon');
$configurator->addConfig(__DIR__ . '/config/config.local.neon', $configurator::NONE); // none section
$configurator->onCompile[] = function ($configurator, $compiler) {
$compiler->addExtension('gettextTranslator', new GettextTranslator\DI\Extension);
};
$container = $configurator->createContainer();
// Run application.
$container->nette->createCache($namespace = NULL);
$application = $container->application;
$application->run();
config.neon
common:
parameters:
php:
date.timezone: Europe/Prague
zlib.output_compression: yes
nette:
application:
errorPresenter: Error
database:
dsn: 'mysql:host=localhost;dbname=***'
user: 'root'
password: '***'
session:
expiration: 40 days
services:
authenticator: Authenticator
routerFactory: RouterFactory
router: @routerFactory::createRouter
factories:
production < common:
development < common:
gettextTranslator:
lang: cs
files:
front: %appDir%/locale
layout: horizontal
height: 450
a následně jsem v BasePresenteru vytvořil funkce pro zavedení do templatů jak je popsáno v dokumentaci.
A nyní problém:
- v debbug baru se mi zobrazuje
"exception 'Nette\InvalidStateException' with message 'Language file(s) must be defined.' in C:\Ampps\www\system\libs\GettextTranslator\Gettext.php:150"
- Nemám žádné ponětí kde a jak přidat jazykové soubory do translatoru, jak by měla vypadat struktura složky s .mo a .po soubory a jak by se tyto soubory měli jmenovat (messages.po, cs.messages.po, …) o žádném z těchto úkonů jsem nenašel v dokumentaci a na fórech ani čárku. Popřípadě bych chtěl vědět jestli se dá používat PoEdit alespoň na překlady v presenterech a modelech nebo musí u všeho používat překladač v debbug baru.
Děkuji za odpověď
- castamir
- Člen | 629
Umístil jsi to na úrovni globálních sekcí. Správné umístění je do sekce common.
common:
parameters:
php:
date.timezone: Europe/Prague
zlib.output_compression: yes
nette:
application:
errorPresenter: Error
database:
dsn: 'mysql:host=localhost;dbname=***'
user: 'root'
password: '***'
session:
expiration: 40 days
gettextTranslator:
lang: cs
files:
front: %appDir%/locale
layout: horizontal
height: 450
services:
authenticator: Authenticator
routerFactory: RouterFactory
router: @routerFactory::createRouter
factories:
production < common:
development < common:
Pozn.: V další verzi Nette 2.1 se ti něco podobného už nestane – tam žádné sekce už nejsou ;)
- VojtaSim
- Člen | 55
Díky moc, chybová hláška zmizela jen ještě chybí vyřešit jak se
mají jmenovat soubory a v jaké mají být složce (kde), jinak s tou
konfigurací v config.neon bylo asi mým 2jatým pojetím věty
If you use sections in config.neon, place this under common: section.
kde under může být pod nebo do
- VojtaSim
- Člen | 55
OK mám to
podle zápisu v config.neon:
gettextTranslator:
lang: cs
files:
app: %appDir%/locale
layout: horizontal
height: 450
kde soubor(y) budou umístěny %appDir%/locale/
a bude se
jmenovat cs.app.po
a cs.app.mo
Prosím aktualizujte dokumentaci projektu GettextTranslator hodně lidí by dojet na tu samou věc jako já.
- castamir
- Člen | 629
O samotné soubory se nestarej – vůbec je nemusíš vytvářet –
vytvoří se sami. Tobě stačí vytvořit složku
%appDir%/locale/
.
ad config: https://github.com/…or/issues/27
Editoval castamir (15. 4. 2013 20:10)
- Petrik.a.dost
- Člen | 72
Prosím Vás jak jste to vyřešili protože mě to pořád hlásí:
GettextTranslator\DI\InvalidConfigException
At least one language file must be defined. search►
už to řeším asi třetí den a nevím ještě mi nikdo neodpověděl… můj config.neon je :
common:
parameters:
php:
date.timezone: Europe/Prague
# zlib.output_compression: yes
nette:
application:
errorPresenter: Error
mapping:
*: App\*Module\*Presenter
session:
expiration: 14 days
gettextTranslator:
lang: cs
files:
front: %appDir%/lang
layout: horizontal
height: 450
extensions:
gettextTranslator: GettextTranslator\DI\Extension
services:
- Model\UserManager
- App\RouterFactory
router: @App\RouterFactory::createRouter
mailService: MailService(@gettextTranslator.translator)
factories:
production < common:
development < common:
a taky kde mám vytvořit tu složku lang, když to mam takto zapsane v aktuálním adresáři tzn. v config nebo ve složce app?? nebo se to teda vytvoří automaticky?
Editoval Petrik.a.dost (2. 11. 2013 22:20)
- Petrik.a.dost
- Člen | 72
jo a mám
PHP 5.3.24
Microsoft-IIS/8.0
Nette Framework 2.1-dev a verzi gettext translatoru 2.0.2
nemůže být probém v tom, že mám verzi nette 2.1-dev?? jinak tady je celý projek
http://leteckaposta.cz/199549808
je to čistý project jen nette a gettext translator a texy…
Editoval Petrik.a.dost (2. 11. 2013 22:12)
- VojtaSim
- Člen | 55
Zkus soubory .po a .mo vytvořit ručně (taky jsem to tak udělal) Gettext si je pak přetvoří. btw doporučuji používat 4 znakové označení jazyků (cs_CZ, en_US, en_GB) a prostudovat si plurálové formy
když budeš vytvářet jazykové soubory, tak by měly být všechny v jedné složce:
app/
├── components/
├── config/
├── locale/
│ ├── cs_CZ.app.mo
│ ├── cs_CZ.app.po
│ ├── en_US.app.mo
│ ├── en_US.app.po
├── model/
├── presenters/
├── router/
├── templates/
└── bootstrap.php
toto odpovídá configu:
common:
gettextTranslator:
lang: en_US
files:
app: %appDir%/locale
layout: vertical
height: 500
Jak napsal @castamir „Správné umístění je do sekce common.“ Ty jsi to umístil do nette:
Taky bych zkusil jestli není problém z některými funkcemi na IIS jako
file_exists()
při použití u složky a is_dir()
bez
posledního lomítka, protože:
foreach ($this->files as $identifier => $dir) {
// $identifier = 'app'
// $idir = %appDir%/locale
$path = "$dir/$this->lang.$identifier.mo";
if (file_exists($path)) {
$this->parseFile($path, $identifier);
$files[] = $path;
}
}
Editoval VojtaSim (2. 11. 2013 23:06)
- Petrik.a.dost
- Člen | 72
tak jsem to změnil na:
parameters:
php:
date.timezone: Europe/Prague
# zlib.output_compression: yes
common:
gettextTranslator:
lang: en_US
files:
app: %appDir%/locale
layout: vertical
height: 500
nette:
application:
errorPresenter: Error
mapping:
*: App\*Module\*Presenter
session:
expiration: 14 days
services:
- Model\UserManager
- App\RouterFactory
router: @App\RouterFactory::createRouter
extensions:
gettextTranslator: GettextTranslator\DI\Extension
a pro jistotu to spouštím v xamppu a pořad to vypisuje:
GettextTranslator\DI\InvalidConfigException
At least one language file must be defined
zde je cely projekt : http://leteckaposta.cz/620683288
- Petrik.a.dost
- Člen | 72
ještě jedna věc, když koukám na laděnku, tak jsem si všimnul,že se
nebere v potaz nastavení v configu, jestli to teda s tím souvisí??
laděnka totiž vypisuje:
GettextTranslator\DI\InvalidConfigException
At least one language file must be defined. search►
Source file
File: ...\vendor\schmutzka\gettexttranslator\GettextTranslator\DI\Extension.php:28
18: 'files' => array(),
19: 'layout' => 'horizontal',
20: 'height' => 450
21: );
22:
23:
24: public function loadConfiguration()
25: {
26: $config = $this->getConfig($this->defaults);
27: if (count($config['files']) === 0) {
28: throw new InvalidConfigException('At least one language file must be defined.');
29: }
30:
31: $builder = $this->getContainerBuilder();
32:
nemělo by to co je na řádkách 18 až 20 být přepsáno tím co jsem napsal do configu??
- jiri.pudil
- Nette Blogger | 1029
nemělo by to co je na řádkách 18 až 20 být přepsáno tím co jsem napsal do configu??
Když to dáš do správné sekce, pak ano. Ten blok
gettextTranslator:
musí být na nejvyšší úrovni zanoření
(tzn. o tab méně), řádek common:
smaž úplně.
- Petrik.a.dost
- Člen | 72
tak jsem se asi konečne hnul…
ted ladenka hlásí:
Nette\DI\ServiceCreationException
No service of type App\GettextTranslator\Gettext found. Make sure the type hint in App\BasePresenter::injectTranslator() is written correctly and service of this type is registered
v index.php na řádce 10.
1: <?php
2:
3: // Uncomment this line if you must temporarily take down your site for maintenance.
4: // require '.maintenance.php';
5:
6: // Let bootstrap create Dependency Injection container.
7: $container = require __DIR__ . '/../app/bootstrap.php';
8:
9: // Run application.
10: $container->application->run();
takže tam žádná sekce common nemusí být jo??
- Petrik.a.dost
- Člen | 72
a v bootstrapu mam:
<?php
// Load Nette Framework or autoloader generated by Composer
require __DIR__ . '/../vendor/autoload.php';
$configurator = new Nette\Configurator;
// Enable Nette Debugger for error visualisation & logging
//$configurator->setDebugMode(TRUE);
$configurator->enableDebugger(__DIR__ . '/../log');
// Specify folder for cache
$configurator->setTempDirectory(__DIR__ . '/../temp');
// Enable RobotLoader - this will load all classes automatically
$configurator->createRobotLoader()
->addDirectory(__DIR__)
->addDirectory(__DIR__ . '/../vendor/others')
->register();
// Create Dependency Injection container from config.neon file
$configurator->addConfig(__DIR__ . '/config/config.neon');
$configurator->addConfig(__DIR__ . '/config/config.local.neon');
$configurator->onCompile[] = function ($configurator, $compiler) {
$compiler->addExtension('gettextTranslator', new GettextTranslator\DI\Extension);
};
$container = $configurator->createContainer();
return $container;
- Petrik.a.dost
- Člen | 72
neměl bych teda ještě zaregistrovat v service nějakou služby gettextTransLator?? a když jo tak jak??
- Petrik.a.dost
- Člen | 72
nemělo by být v services neco takového :
services:
gettext: @GettextTranslator\Gettext
nebo alespoň neco tomu podobného, aqby to neházelo:
Nette\DI\ServiceCreationException
No service of type App\GettextTranslator\Gettext found. Make sure the type hint in App\BasePresenter::injectTranslator() is written correctly and service of this type is registered
- jiri.pudil
- Nette Blogger | 1029
Žádnou službu registrovat nemusíš, o to by se mělo postarat samo rozšíření.
No service of type App\GettextTranslator\Gettext found. Make sure the type hint in App\BasePresenter::injectTranslator() is written correctly and service of this type is registered
Velmi pravděpodobně máš v metodě injectTranslator() špatný (v tomto
případě non-FQCN) typehint. Buďto musí začínat zpětným lomítkem
(aby byl FQCN), anebo musíš v souboru uvést
use GettextTranslator
.
- Petrik.a.dost
- Člen | 72
supeeer parada konečně děkuji za radu …bylo to v use GettextTranslator… děkuji moooc už to řeším asi čtvrtý den.
nicméně ted mi v panel hlásí:
Error: GettextTranslator\Panel
exception ‚InvalidArgumentException‘ with message
''C:\xampp\htdocs\seyf\app/locale/cs_CZ.app.mo' is not a gettext file.' in
C:\xampp\htdocs\seyf\vendor\schmutzka\gettexttranslator\GettextTranslator\Gettext.php:378
Stack trace:
#0
C:\xampp\htdocs\seyf\vendor\schmutzka\gettexttranslator\GettextTranslator\Gettext.php(350):
GettextTranslator\Gettext->parseFile(‚C:\xampp\htdocs…‘, ‚app‘)
#1
C:\xampp\htdocs\seyf\vendor\schmutzka\gettexttranslator\GettextTranslator\Gettext.php(271):
GettextTranslator\Gettext->loadDictonary()
#2
C:\xampp\htdocs\seyf\vendor\schmutzka\gettexttranslator\GettextTranslator\Panel\Panel.php(87):
GettextTranslator\Gettext->getFiles()
#3 C:\xampp\htdocs\seyf\vendor\nette\nette\Nette\Diagnostics\Bar.php(71):
GettextTranslator\Panel->getPanel()
#4 C:\xampp\htdocs\seyf\vendor\nette\nette\Nette\Diagnostics\Debugger.php(404):
Nette\Diagnostics\Bar->render()
#5 [internal function]: Nette\Diagnostics\Debugger::_shutdownHandler()
#6 {main}
nevíte??
- Petrik.a.dost
- Člen | 72
jooooo už to jede jak mááá super děkuji dekuji moc… chyba byla v tom že jsem si ručně vytvořil soubory .mo a .po … tak jsem je ostranil a nechal aby si je gettext translator vytvořil sám a jede to perfektně ještě jednou díky moc