Contributte/Translation – integrace symfony translation do Nette
- ali
- Člen | 342
Na logovani chybejicich prekladu slouzi logger
https://github.com/…xtension.php#L28
translation:
...
logger: true
...
services:
- My\PsrLogger
A jestli je vhodne cely layout obalit do translator makra netusim, osobne tohle to reseni nepouzivam a vzdy pisu celou cestu pro preklad.
Editoval ali (25. 3. 2020 6:19)
- ali
- Člen | 342
@johnnie ono jedina moznost, jak to udelat automaticky je napsat si
vlastni cache factory a nahradit tim tu symfonackou pres konfiguraci, osobne DB
loadry nepouzivam, pridal jsem to do knihovny jen jako zajimavost, ze to proste
jde :-)
Taky by bylo zajimave mit na to tlacitko v tracy baru
Editoval ali (14. 4. 2020 19:21)
- d@rkWolf
- Člen | 167
@ali ahoj, proč se nepřekládají options položky v Selectu? Mám nadefinované asociativní pole s pár položkama do Selectu a potřebuju je přeložit-je neměnné, je to prostě seznam variant, co je nutno vybrat. Když zadám jako hodnotu normální cestu k překladu, v Tracy se mi ukáží chybějící překlady, přeložím je, chybějící překlady zmízí, ale v tom Selectu vidím furt ty cesty k překladu. Myslel jsem, že pokud nenastavím ->setTranslator(null), tak se položky Selectu mají překladát?
- ali
- Člen | 342
@darkWolf o prekladani options v selectu se stara primo Nette/Forms, ty musis akorad nastavit formulari translator
https://github.com/…electBox.php#L96
https://github.com/…eControl.php#L395
- d@rkWolf
- Člen | 167
@ali no jo, to je teda sakra divný, proč mi to nepřekládá? translator mám nastavený ve FormFactory přes kterou vytvářím formuláře normálně takto:
<?php
$form = new Form();
$form->setTranslator($this->translator);
?>
Popisky apod. se překládají, nepřekládaj se optiony selectu, taky nefungovaly checkboxy(na front-endu jsem to vyřešil manuálním renderem a ručně přeložením v šabloně, ale tam je jeden malej formulář…v adminu mám hromady formulářů a ručně je vykreslovat nechci, to bych se z toho po…). Vykresluju formuláře přes contributte/forms-bootstrap, ale zkusil jsem je vyhodit a použít UI\Forms a žádný efekt to nepřineslo.
- d@rkWolf
- Člen | 167
@ali takhle nějak:
formFactory.php
<?php
final class FormFactory
{
use Nette\SmartObject;
/** @var Translator */
protected $translator;
/**
* FormFactory constructor.
* @param Translator $translator
*/
public function __construct(Translator $translator)
{
$this->translator = $translator;
}
/**
* @return Form
*/
public function create(): Form
{
/** @var BootstrapForm $form */
$form = new BootstrapForm();
$form->setTranslator($this->translator);
return $form
}
?>
filtersFormFactory.php
<?php
class GalleryFiltersFormFactory
{
use Nette\SmartObject;
/** @var FormFactory $factory */
private $factory;
/** @var GalleryFiltersRepository */
private $galleryFiltersRepo;
public function __construct(FormFactory $factory, GalleryFiltersRepository $galleryFiltersRepo)
{
$this->factory = $factory;
$this->galleryFiltersRepo = $galleryFiltersRepo;
}
/**
* @param callable $onSuccess
* @param callable $onException
* @return BootstrapForm
*/
public function create(callable $onSuccess, callable $onException): BootstrapForm
{
/** @var BootstrapForm $form */
$form = $this->factory->create();
$form->ajax = true;
$form->renderMode = RenderMode::VERTICAL_MODE;
$form->addSelect('type', 'admin.gallery_filters.type', $this->galleryFiltersRepo::FILTERS)
->setPrompt('admin.select_choose')
->setRequired('admin.field_required');
$form->addText('name', 'admin.name')
->setRequired('admin.field_required')
->setMaxLength(100);
...
$form->onSuccess[] = function (BootstrapForm $form, Nette\Utils\ArrayHash $values) use ($onSuccess, $onException): void {
...
return $form;
}
?>
A pole FILTERS
<?php
const FILTERS = [
1 => 'admin.gallery_filters.category',
2 => 'admin.gallery_filters.color',
3 => 'admin.gallery_filters.finish',
];
?>
V selectu pole FILTERS se nepřeloží, Prompt se taky nepřeloží, vše ostatní kde sou kódy pro překladač se přeloží.
Editoval d@rkWolf (8. 5. 2020 9:20)
- kralik
- Člen | 230
Ahoj,
nějak se mi nedaří napojit se na NetteDB.
Prosím o radu.
common.neon
extensions:
translation: Contributte\Translation\DI\TranslationExtension
translation:
locales:
whitelist: [en, cs, ru, de]
default: en
fallback: [en]
dirs:
- %appDir%/lang
localeResolvers:
- Contributte\Translation\LocalesResolvers\Router
loaders:
nettedatabase: Contributte\Translation\Loaders\NetteDatabase
v adresáři app/lang mám soubor lang-db
table: "languages" # if you specify table key, "messages" from file name will be ignored
id: "key" # id column name, default is "id"
locale: "locale" # locale column name, default is "locale"
message: "message" # message column name, default is "message"
Mooc díky
- kralik
- Člen | 230
ali napsal(a):
@kralik ten soubor musi mit priponu nettedatabase, presne tak jak mas napsan klic u toho loadru
Soubor má příponu nettedatabase a spojení na DB
nefuguje.
Nevím zda tento souboru může být v níže uvedené složce?
projekt/app/lang/lang-db.nettedatabase
Editoval kralik (17. 5. 2020 18:09)
- kralik
- Člen | 230
ali napsal(a):
@kralik musis i ten nazev dat do akceptovatelneho formatu, viz dokumentace
Super, už to funguje.
Škoda, že potřebná konfigurace se musí ukládát do souboru a nejde ji mít
v configu (common.neon)
Mohu-li rád bych se zeptal jak šikovně vyřešit překlad celých stránek?
Díky
- kralik
- Člen | 230
Ahoj,
snažím se nainstalovat překladač pro nette v2.4. s použitím
databáze.
Kdyby\Translation se mi nainstalovat nepodařilo, resp. při spuštění mi to
psalo chybu, že neexistuje makro {_message.login}
composer.json
{
"require": {
"nette/nette": "v2.4.0",
"mesour/datagrid": "2.0.7.1",
"contributte/translation": "dev-nette-2.4"
}
}
Při spuštění dostávám chybu
Error
Class 'Nette\Schema\Processor' not found
Zkoušel isnstalovat i nette/nette, tedy verzi 3.x, ale to jsem narazil na komplikace v závislostech v balíčku mesour/datagrid.
Dokázal byste mi někdo pomoci?
Předem moc díky
- Petr Parolek
- Člen | 455
@kralik obávám se, že se bez forku a refactoringu buď Contributte/Translation pro Nette 2.4 nebo mesour/datagrid pro Nette 3 po svém neobejdeš.
Nejlepší je podle mě přechod na nette 3.0 a ublaboo(contributte)/datagrid
Editoval ppar (28. 5. 2020 19:22)
- radekBrno
- Člen | 61
Ahoj,
do čistého Nette projektu jsem si přes composer přidal Contributte/Translation. Při konfiguraci jsem postupoval podle návodu. Při překladu mi to vyhodí vyjímku „Service of type Contributte\Translation\LocalesResolvers\Session not found.“
BasePresenter:
declare(strict_types=1);
namespace FrontModule;
use Nette;
use Contributte;
class BasePresenter extends Nette\Application\UI\Presenter
{
/** @persistent */
public $locale;
/** @var Nette\Localization\ITranslator @inject */
public $translator;
/** @var Contributte\Translation\LocalesResolvers\Session @inject */
public $translatorSessionResolver;
public function handleChangeLocale(string $locale): void
{
$this->translatorSessionResolver->setLocale($locale);
$this->redirect('this');
}
}
config:
extensions:
translation: Contributte\Translation\DI\TranslationExtension
translation:
locales:
default: cs
fallback: [cs]
whitelist: [cs]
dirs:
- %appDir%/Modules/AdminModule/Langs
- %appDir%/Modules/FrontModule/Langs
localeResolvers:
- Contributte\Translation\LocalesResolvers\Session
Díky moc
- ali
- Člen | 342
@radekBrno @edas229 tedka jsem si vytvoril projekt pres Composer
composer create-project nette/sanbox test
nainstaloval contributte/translation
composer require contributte/translation
{
"name": "nette/sandbox",
"description": "The sandbox is a pre-packaged Nette Framework project, basic configured structure for your application.",
"homepage": "https://nette.org",
"type": "project",
"license": ["BSD-3-Clause", "GPL-2.0-only", "GPL-3.0-only"],
"authors": [
{
"name": "David Grudl",
"homepage": "https://davidgrudl.com"
},
{
"name": "Nette Community",
"homepage": "https://nette.org/en/contributors?lang=en"
}
],
"require": {
"php": ">=7.1",
"nette/application": "^3.0",
"nette/bootstrap": "^3.0",
"nette/caching": "^3.0",
"nette/database": "^3.0",
"nette/di": "^3.0",
"nette/finder": "^2.5",
"nette/forms": "^3.0",
"nette/http": "^3.0",
"nette/mail": "^3.0",
"nette/robot-loader": "^3.0",
"nette/safe-stream": "^2.4",
"nette/security": "^3.0",
"nette/utils": "^3.0",
"latte/latte": "^2.5",
"tracy/tracy": "^2.6",
"dg/adminer-custom": "^1.8",
"contributte/translation": "^0.7.0"
},
"require-dev": {
"nette/tester": "^2.0",
"phpstan/phpstan-nette": "^0.12"
},
"autoload": {
"psr-4": {
"App\\": "app"
}
},
"minimum-stability": "stable",
"scripts": {
"phpstan": "phpstan analyse --configuration phpstan.neon app bin www"
}
}
nastavil jsem config
extensions:
translation: Contributte\Translation\DI\TranslationExtension
translation:
locales:
default: cs
fallback: [cs]
whitelist: [cs]
dirs:
- %appDir%/lang
localeResolvers:
- Contributte\Translation\LocalesResolvers\Session
a do base presenteru dal tohle to
<?php
declare(strict_types=1);
namespace App\Presenters;
use Nette;
use Contributte;
/**
* Base presenter for all application presenters.
*/
abstract class BasePresenter extends Nette\Application\UI\Presenter
{
/** @var Nette\Localization\ITranslator @inject */
public $translator;
/** @var Contributte\Translation\LocalesResolvers\Session @inject */
public $translatorSessionResolver;
protected function startup(): void
{
parent::startup();
bdump($this->translatorSessionResolver);
bdump($this->translator->translate('test'));
}
}
a Tracy mi nevyhodila zadnou chybu, delam neco jineho nez vy?
Editoval ali (23. 7. 2020 20:04)
- Mistrfilda
- Člen | 76
@edas229 @radekBrno Nedostáváte tu chybu z důvodu který jsem popsal tady https://forum.nette.org/…o-kontejneru#… ?
- jikki
- Člen | 73
Ahoj lidi,
Načítání z Nette Database mi funguje. Pro každou doménu a jazyk mám vždy samostatný soubor s příponou .nettedatabase, např. messages.en_US.nettedatabase, messages.cs_CZ.nettedatabase, ublaboo_datagrid.en_US.nettedatabase, ublaboo_datagrid.cs_CZ.nettedatabase atd. Každá doména má svou databázovou tabulku.
table: "translation_messages" # if you specify table key, "messages" from file name will be ignored
id: "id" # id column name, default is "id"
locale: "locale" # locale column name, default is "locale"
message: "message" # message column name, default is "message"
table: "translation_ublaboo" # if you specify table key, "messages" from file name will be ignored
id: "id" # id column name, default is "id"
locale: "locale" # locale column name, default is "locale"
message: "message" # message column name, default is "message"
Poradí někdo jak udělat, abych mohl mít všechny překlady, všechny
domény v jedné databázové tabulce?
Hádám, že vodítko je „# if you specify table key, "messages“ from file
name will be ignored", ale nejsem si jistý, jestli správně chápu, co to
znamená. Jak udělat, aby to ignorovalo messages v názvu souboru a vzalo si
to doménu z db?
Děkuji
- jikki
- Člen | 73
Ahoj,
z nějakého důvod přestalo fungovat načítání překladů z DB. Po smazání cache NetteDatabase Loader pro načtení překladů vygeneruje dotaz:
SELECT `key` AS `id`, locale AS `locale`, message AS `message`
FROM translation
WHERE 'cs_CZ'
Za WHERE chybí ‚locale‘ = ..
Nejsem si jistý kdy problém vznikl. Configy jsem neměnil, pouze jsme
provedl composer upgrade. Nyní mám contributte/translation verzi 0.8.3.
Netušíte někdo, kde by mohl být problém?
Děkuji
- Tomas8698
- Člen | 109
Zdravim, som s nette zaciatocnik. Prelozil som texty na svojej stranke, len potreboval by som spravit preklad textu z db. Mam zopar nejasnosti napr. V lang/messages.cs_CZ.nettedatabase a messages.en_US.nettedatabase, je potrebne pisat preklad textu z databazy alebo to staci v databaze v subore .sql s prilozenym stlpcom locale. Pouzivam nettedatabazu. Dakujem za kazdu odpoved.
- Tomas8698
- Člen | 109
Zdravim, nahodil som to podla documentacie, len po zapnuti stranky my hlasi stale tuto chybu.
Nette\DI\MissingServiceException
Service of type Contributte\Translation\LocalesResolvers\Session used in type
hint at App\BasePresenter::$translatorSessionResolver not found. Did you add it
to configuration file?
Mozem poslat aj obrazok ak by bolo treba.
Vyssie som nasiel ze nieco podobne s locales niekto riesil len nemoyzem sa
dostat na odkaz, v ktorom to je spravene.
Takto vyzera moj Config/Common.neon :
parameters:
langs: [cs,en]
application:
errorPresenter: Error
mapping:
*: App*Module\Presenters*Presenter
session:
expiration: 14 days
extensions:
translation: Contributte\Translation\DI\TranslationExtension
translation:
locales:
default: cs
whitelist: [cs, en]
dirs:
– %appDir%/lang
localeResolvers:
– Contributte\Translation\LocalesResolvers\Router
services:
router: App\Router\RouterFactory::createRouter`
Takto moj Router/RouterFactory.php
<?php
declare(strict_types=1);
namespace App\Router;
use Nette;
use Nette\Application\Routers\RouteList;
use Nextras\Routing\StaticRouter;
final class RouterFactory
{
use Nette\StaticClass;
public static function createRouter(): RouteList
{
$router = new RouteList;
$router[] = new Route('', „Homepage:default“);
$router[] = new Route(‚<locale=cs
cs<presenter>/<action>‘, „Homepage:default“);
$router->addRoute(‚sitemap.xml‘, ‚Homepage:sitemap‘);
$router->addRoute(‚<urlseo>‘, ‚Homepage:package‘);
return $router;
}
}
Takto moj BasePresenter.php :
<?php declare(strict_types = 1);
namespace App;
use Nette;
use Contributte;
class BasePresenter extends Nette\Application\UI\Presenter
{
/** @var Nette\Localization\ITranslator @inject */
public $translator;
/** @var Contributte\Translation\LocalesResolvers\Session
@inject */
public $translatorSessionResolver;
public function handleChangeLocale(string $locale): void
{
$this->redirect(‚this‘);
}
public function renderDefault(): void
{
$this->translator->translate(‚domain.message‘);
$prefixedTranslator =
$this->translator->createPrefixedTranslator(‚domain‘);
$prefixedTranslator->translate(‚message‘);
}
}
Dakujem velmi pekne za kazdu pomoc
Editoval Tomas8698 (20. 1. 2021 15:43)
- Tomas8698
- Člen | 109
galab napsal(a):
@Tomas8698
přidej do configulocaleResolvers: – Contributte\Translation\LocalesResolvers\Router - Contributte\Translation\LocalesResolvers\Session
Dakujem za radu. Je potrebne to nejak zapisat specialne? lebo ked som to skopiroval ten druhy …/Session tak my hlasy chybu Bad indent on line … . A aj v phpstorme mam to podciarknute.
- Gappa
- Nette Blogger | 208
Tomas8698 napsal(a):
galab napsal(a):
@Tomas8698
přidej do configulocaleResolvers: – Contributte\Translation\LocalesResolvers\Router - Contributte\Translation\LocalesResolvers\Session
Dakujem za radu. Je potrebne to nejak zapisat specialne? lebo ked som to skopiroval ten druhy …/Session tak my hlasy chybu Bad indent on line … . A aj v phpstorme mam to podciarknute.
Jestli jsi to zkopíroval, tak ta první odrážka v ukázce kódu je nějaký druh pomlčky, to druhé je mínus, proto to asi řve :)
Tedy –
vs -
.
- Tomas8698
- Člen | 109
Este mam jednu otazku
Pri nacitani textov z db mi nerozdeluje podla jazyka texty ale jednoducho mi
ich vsetky vyhodi na stranku. Pouzivam loader a v tabulke mam locale kde si
rozdelujem jazyky. Poslem priklad
Comon.neon
<?php
parameters:
langs: [cs,en]
application:
errorPresenter: Error
mapping:
*: App\*Module\Presenters\*Presenter
session:
expiration: 14 days
extensions:
translation: Contributte\Translation\DI\TranslationExtension
translation:
locales:
default: cs
whitelist: [cs, en]
dirs:
- %appDir%/lang
localeResolvers:
- Contributte\Translation\LocalesResolvers\Router
- Contributte\Translation\LocalesResolvers\Parameter
- Contributte\Translation\LocalesResolvers\Session
- Contributte\Translation\LocalesResolvers\Header
loaders:
nettedatabase: Contributte\Translation\Loaders\NetteDatabase
services:
router: App\Router\RouterFactory::createRouter
?>
default.latte
<?php
{foreach $packages as $pakage}
<div class="col-md-6 col-lg-4 col-xs-12 order_panel" >
<div class="plan">
<div class="plan-title">
<h3>{$pakage['titleshort']}</h3>
{*
<small>{$pakage['price']} Kč</small>
*}
</div>
{$pakage['textshort']|noescape}
<br>
<a n:href="Homepage:package $pakage['urlseo']" class="btn btn-warning">
{_pricing.btn-princing}</a>
</div>
</div>
{/foreach}
?>
<?php
INSERT INTO `packages` (`id`, `locale`, `urlseo`, `titlelong`, `textlong`, `titleshort`, `textshort`, `keywords`, `description`, `price`, `callaction`, `subject`, `formtitle`) VALUES
(1, 'cs_CZ', '-sr', 'GscisctLab nscasa vlcsasastscním sescrvsacesaru', 'sckbcaskcb', 'lprem ipsum', 'y nlyx'),
(2, 'en_US', '-------', 'ncsanlscnlasn', '<p>\r\nxc ns c,sc xy\r\n</p>\r\n <p>\r\n ......
?>
dakujem za pomoc
Editoval Tomas8698 (22. 1. 2021 9:40)
- ali
- Člen | 342
@Tomas8698 prosimte, formatuj kod v prispevcich, to cos poslal nikdo cist nebude, viz → https://forum.nette.org/…v-tomto-foru
K prekladum, nedavno jsem napsal „realny“ test na DB preklady, cerpej inspiraci odtud → https://github.com/…atabase.phpt