Autor Zpráva
joe
Profil
Ahoj,

chtěl bych se zeptat, jakým způsobem řešit lokalizaci? Nejedná se mi o knihovnu, ale o způsob, často se překlady řeší v šablonách například {_"Text, který se bude překládat"}, co když ale na toto místo budu vypisovat dynamický text? Pak je ale hodně složité zjistit všechny texty, které se kdy mohou objevit na stránce a je to časově náročné. (ani tak se člověku nemusí podařit nasimulovat všechny stavy, které mohou nastat)

Nemáte někdo nějaký tip, jakým způsobem, co nejrychleji vyřešit překlady? Chtěl bych od začátku zvolit způsob, který mi usnadní práci.

Jak řešíte překlady?
candiess
Profil
joe:
co když ale na toto místo budu vypisovat dynamický text? Pak je ale hodně složité zjistit všechny texty, které se kdy mohou objevit na stránce a je to časově náročné. (ani tak se člověku nemusí podařit nasimulovat všechny stavy, které mohou nastat)
Nedovedu si představit o jakém dynamickém textu hovoříš, vždy přece vypisuješ to co chceš vypsat (mimo data z DB).

Ale pokud se už bavíme o dynamickém vypisování, asi bych zvolil syntaxi render("Vítejte %0, aktuálně máte %1 bodů", array("Vaše jméno", "240"))
Str4wberry
Profil
Při hledání nějakého jednoduchého řešení jsem došel k tomuto:

Překlad stránky

Je to v podstatě postup, který popisuje candiess, kdy se v řetězcích překladů používají přímo proměnné.
joe
Profil
Myslel jsem trochu něco jiného, než překlady s parametrama. Vysvětlím níže.

candiess:
asi bych zvolil syntaxi
To by samozřejmě šlo, ale musel bys ji ještě rozšířit, kdybys chtěl vypsat "1 bod", "2 body" a tak dále.

Měl jsem namysli spíš něco jako

render($variable);, kde $variable by mohla být hodnota z nějakého číselníku. Řekněme například, že by existoval číselník stavů pro úkoly - nový, přidělený, rozpracovaný, ke schválení, schválený, dokončený. A všechny tyto stavy bych chtěl přeložit, ale nebyly by nikde vypsány. To znamená, že bych musel dostat úkol do všech stavů, abych zjistil, že někde chybí nějaký překlad a to není moc efektivní a myslím, že můžu klidně napsat, že s takovým přístupem by nikdy nebyl překlad 100%, protože by se vždy na nějaký text někde zapomnělo.
Str4wberry
Profil
To by samozřejmě šlo, ale musel bys ji ještě rozšířit, kdybys chtěl vypsat "1 bod", "2 body" a tak dále.

To řeším takto:
<?=l("Máš celkem %s.", 
  sklonovani($pocetBodu, 
    l("bod"), 
    l("body"), 
    l("bodů")))?>

Zjistit to, co ještě není přeloženo, přece není problém, ne? Projdu si skriptem všechny soubory, kde se něco vypisuje, najdu si řetězce a zkontroluji, jestli jsou v souboru s překlady. Stojí a padá to jen na důsledném používání překladové funkce. Zkrátka nikde nesmí stát samotný text, ale i to jde (polo)automaticky kontrolovat.
Joker
Profil
joe:
Někdy loni jsem byl na přednášce, kde k údivu velké části obecenstva přednášející doporučoval pro každou lokalizaci udělat celou novou šablonu.
Argumentoval tím, že podle jeho zkušeností se často lokalizace stejně rozleze nad rámec parametrizovaných textů.
Str4wberry
Profil
Celkem záleží, čeho se to týká. Je pravda, že psát něco jako:

<p><?=l("Překladatelný první odstavec.")?></p>
<p><?=l("Překladatelný druhý odstavec.")?></p>

Je asi hloupost, ale mít pro každý jazyk jinou šablonu menu třeba u diskusního systému jako je tento, by mi přišlo asi ještě horší.
joe
Profil
Joker:
Někdy loni jsem byl na přednášce, kde k údivu velké části obecenstva přednášející doporučoval pro každou lokalizaci udělat celou novou šablonu.
Dřív bych se taky divil, ale dneska by mi to asi už tak divné nepřišlo. Téměř vždy se stane, že z každé mutace se vyklube nakonec trochu něco jiného a bylo by nutné podmínkovat, a to by celou šablonu akorát znepřehlednilo.

---

Nevím jestli jsem to napsal úplně srozumitelně, tak to zkusím jinak - pokud bych měl, třeba v databázi uložené státy:

Česká republika, Slovensko, Německo a ty do šablony posílal jako pole $countries = array('Česká republika', ...)

v šabloně bych pak mohl mít

foreach($countries as $country) {
    l($country);
}

Po přidání státu Itálie by mi zůstal v aplikaci nepřeložený její název a já bych to nemohl jednoduše identifikovat až do doby, než se bude volat l("Itálie")

To znamená, že pokud bych hledal všechny texty, které je třeba přeložit, musel bych všechno proklikat a dostat se do každého stavu, abych věděl, co všechno ještě není přeloženo, a přesně to mi nepřijde vůbec efektivní, protože se vždy na něco zapomene.
Str4wberry
Profil
Dá se ale napsat:
$countries = array(l('Česká republika'), l('...'));

Můžeš vyzkoušet.
joe
Profil
Str4wberry:
Pravda :) díky, tak to zapsat můžu, ale ... teď už mě zrovna nenapadá, na čem bych to vysvětlil, možná kdyby byla trochu složitější struktura (ale pořád bych mohl iterovat pouze přes všechny státy, abych je donutil přeložit).

Kdybych to psal, řešil bych to podobně, na projektech používám GetText.

Jinak, nebylo by výkonostně rychlejší ukládat jako klíče pole text stejné délky - hash? (ptám se jen pro zajímavost, nevím jak to je)

Vaše odpověď

Mohlo by se hodit

Příspěvky nesouvisející s webem budou odstraněny.

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: