Kompletně i18ned a l10ned aplikace

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

Ahoj,
v Nette je dobrá podpora překladů – ve formulářích, šablonách i DataGridu. Máme GettextExtractor, který extrahuje soubory do .po souborů, máme drivery na .mo soubory, které dokonale řeší české plurály.

Co ale nevidím jako příliš vyřešené, či spíše netuším jak na to, je přepínání mezi jednotlivými jazykovými mutacemi. Co konkrétně potřebuji:

  • libovolné přepínání mezi adresami typu /cs/kontakt ↔ /en/contact; /cs/blog/kategorie/nazev-clanku ↔ /en/blog/category/article-title (aby se uživatel po klepnutí na druhou vlaječku ihned dostal na tu druhou URL)
  • kvůli tomuto se potřebuji dostat k jazyku, který uživatel chce, ještě před definicí rout a spuštěním samotné aplikace, abych mohl definovat, jaké překladové třídy Route se mají použít. Jak na to, aby to bylo nezávislé na tvaru URL, stejně jako je nezávislé celé Nette?
  • to by byly vyřešeny české/anglické názvy presenterů a akcí, co ale data z databáze? Vybírání dat podle aktuálního jazyka není problém, ale co ten okamžik přepnutí? jakým způsobem mám zjistit, na jakou URL uživatele přesměruji při přepnutí jazyka, pokud má otevřenou zrovna stránku, jejíž parametry souvisí s daty z databáze?

Další věc – l10n – tedy formátování datumu/času/měny podle aktuálně nastaveného jazyka/země. Je to sice detail, ale určitě uživatele potěší, pokud budu respektovat zvyklosti daného jazyka a správně formátovat např. čísla – v ČR např. „1 000 000,– Kč“ a v USA „$ 1.000.000,00“, stejně, jako to dělá správně nastavený operační systém. Není něco takového zabudovaného v PHP? Nehodilo by se na to vytvořit třídu Locale, o které dokonce kdysi David mluvil?

Editoval Ondřej Mirtes (16. 11. 2009 1:20)

Honza Kuchař
Člen | 1662
+
0
-

Locale je sice fajn, ale jsou s ním problémy. Třeba na win, když jdou 2 požadavky současně, tak se jeden přepne do angličtiny. Prostě je to takové nedořešené.

Editoval honzakuchar (16. 11. 2009 8:14)

_Martin_
Generous Backer | 679
+
0
-

Ondřej Mirtes napsal(a):

  • libovolné přepínání mezi adresami typu /cs/kontakt ↔ /en/contact; /cs/blog/kategorie/nazev-clanku ↔ /en/blog/category/article-title (aby se uživatel po klepnutí na druhou vlaječku ihned dostal na tu druhou URL)
  • kvůli tomuto se potřebuji dostat k jazyku, který uživatel chce, ještě před definicí rout a spuštěním samotné aplikace, abych mohl definovat, jaké překladové třídy Route se mají použít. Jak na to, aby to bylo nezávislé na tvaru URL, stejně jako je nezávislé celé Nette?
  • to by byly vyřešeny české/anglické názvy presenterů a akcí, co ale data z databáze? Vybírání dat podle aktuálního jazyka není problém, ale co ten okamžik přepnutí? jakým způsobem mám zjistit, na jakou URL uživatele přesměruji při přepnutí jazyka, pokud má otevřenou zrovna stránku, jejíž parametry souvisí s daty z databáze?

Onehdá jsem tohle řešil vlastním routerem. Vše bylo založené na tom, že v DB je uložena mapa webu, z které se generuje zhruba takto vypadající pole:

$urls = array(
	'/cs/kontakt' => array(
		'presenter' => 'Contact',
		'action' => 'default',
		'params' => array(
			'language' => 'cs',
		);
	),
	'/en/kontakt' => array(
		'presenter' => 'Contact',
		'action' => 'default',
		'params' => array(
			'language' => 'en',
		);
	),
);

Router pak lehce podle adresy zjistí, o jaký jde jazyk. Zároveň přepínátka jazyků generoval taky router. Problém s překladovými slovníky odpadl, protože se nepoužívaly; problém s proměnnými věcmi z DB taktéž.

On celý ten router byl krapítek složitější (třeba díky těm uloženým datům dokázal z adresy poznat jazyk, i pokud nebyl uveden – a díky Nette přesměrovat na kanonickou URL, atd.). Důležité bylo, že routování zůstalo oddělené – presenterům router seríroval správné argumenty, odkazy se tvořily běžně pomocí link.

Snad to jako inspirace poslouží=)

h4kuna
Backer | 740
+
0
-

Kdyby jsi chtel mam neco rozdelaneho a mel by jsi zajem na tom delat, tak ti to muzu poslat, vychazi to z PEAR I18N.

Respektive jsem skoncil na nekolika vecech

  • urceni polohy podle GEOIP (neni 100%)
  • z prohlizece muzes stahnout jazyk, ale neodhadnes menu, takze musis mit stejne nejakou vychozi, to samy formatovani casu a meny
  • a vetsinou web v cechach podporuje anglictinu nemcinu, takze by jsi mel i omezeny formatovani casu a meny nebo by si ten clovicek stejne musel sam prepinat

stahl jsem i daatabazi v jakym state jakym jazykem mluvi, jakou maj menu, jaky je prvni den v tydnu…

EDIT

Pac jsem to chtel spojit s komponentou ČNB která umí jednu z veci co jsi psal plus to prepocita podle spravneho kurzu :)

Ondřej Mirtes napsal(a):

správně formátovat např. čísla – v ČR např. „1 000 000,– Kč“ a v USA „$ 1.000.000,00“

Editoval matata (16. 11. 2009 10:36)