Gettext Translator – instalace (How To) Language file(s) must be defined

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

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ěď

VojtaSim
Člen | 55
+
0
-

VojtaSim napsal(a):

stáhl jsem si aktuální verzi

Znamená aktuální verzi Nette (2.0.10) i aktuální verzi Gettext Translatoru (2.0.2)

castamir
Člen | 629
+
0
-

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 ;)

castamir
Člen | 629
+
0
-

Ale je fakt, že ta chybová hláška by mohla být malinko srozumitelnější. Trošku to vylepším ;)

VojtaSim
Člen | 55
+
0
-

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
+
0
-

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.pocs.app.mo

Prosím aktualizujte dokumentaci projektu GettextTranslator hodně lidí by dojet na tu samou věc jako já.

castamir
Člen | 629
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

neměl bych teda ještě zaregistrovat v service nějakou služby gettextTransLator?? a když jo tak jak??

Petrik.a.dost
Člen | 72
+
0
-

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
+
0
-

Žá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
+
0
-

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
+
0
-

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

Petrik.a.dost
Člen | 72
+
0
-

ještě jednou moc děkuji těm, co mi poradili moc díky, jede to perfektně