Najboljši način za večjezičnost
10 naročnikov
10 naročnikov
Zdravo,
zanima me, če ma kdo kakšno idejo, kateri je najboljši-najhitrejši način za parsanje jezikovnih datotek.
Npr. zdaj imam tako, v cookieu se prebere trenutna nastavitev in se potem includa ustrezen php language file.
Not so stringi v arrayu:
lang['product_stock'] = "Zaloga";
lang['product_info'] = "informacije o izdelku";
Razmišljam, da bi naredil tako:
lang['product_stock']['slovenian'] = "Zaloga";
lang['product_stock']['english'] = "Stock";
Tako stvar je lažje vzdrževat, kot tako kot imam v prvem primeru, ker npr. kakšenkrat pozabim dodati ali spremeniti string v vseh jezikih (vsak jezik v svoji mapi).
Zend ima menda jezikovne stringe v ini fileu.
product_stock = "Zaloga"
Dodatna slabost obeh pristopov je, da je težje narediti fallback. Npr. če enega stringa ni, se uporabi string od default jezika.
Druga slabost je pa ta, da je težje narediti spletni vmesnik za elegantno urejanje. Večina sistemov ima kar velik textbox, notri je pa vsebina celega file-a.
Zato sem mislil, da bi zadevo morda naredil v XML datotekah.
Npr:
<languagefile name="product" default="slovenian">
<string key="product_stock">
<value>Zaloga</value>
<translation lang="english">Stock</translation>
</string>
</languagefile>
Preden začnem naprej razmišljati, mislite, da bi to bilo po performancu nekje kot tisto zgoraj?
Celo dom drevo (ali več njih) bi ob začetku prebral v en 2d array, enkapsuliral v objekt in potem klical z globalno funkcijo (kot imam sedaj) v stilu <?=lang('product_stock);?> v view-u.
17 odgovorov
Zend ima cel kup adapterjev (na njihovi strani je tudi na kratko napisano za kaj se kateri priporoča)
Na voljo maš ini datoteko, gettext, php array, ....
Sam sem nazadnje uporabil kar php array ker ni bilo nekaj veliko teksta (cca. 30 vrstic) in se je super odneslo
Ena varjanta je, da narediš eno simple funkcijo _($text), ki vrne tekst glede na pripadajoči jezik. Se pravi, če pokličeš _('Hello') poišče po nekem arrayu, če imaš jezikovno različico za Hello in v kolikor obstaja, jo echoja, sicer pa echoja 'Hello', kar je tudi default jezik potem. Tako prideš do zelo kratke sintakse, za narest je pa zelo izi...
eno kratko vprašanje glede na večjezičnost. je pametno shranjevati izbrani jezik v piškot in potem glede na piškot prikazati jezik ali je bolje s urlji, recimo domen.com/si/ in potem rešiš pač da če si na slo in klikneš eng, da te da na isto stran kjer si kliknil in ne na index (tega problema recimo pri piškotih nimaš).
Kratek odgovor:
url da, cookie ne
Daljši odgovor:
language imej v urlju, po potrebi pa ga shrani še v cookie. S cookijem lahko uporabnika, ko se vrne, redirectaš direktno na njegov jezik.
jaz imam vedno "domena.com/en (sl, ....)"
prav tako pa shranim še v cookie, da v kolikor uporabnik pride nazaj in vtipka samo domeno veš kaj prikazat
blackmamba:
Kratek odgovor:
url da, cookie neDaljši odgovor:
language imej v urlju, po potrebi pa ga shrani še v cookie. S cookijem lahko uporabnika, ko se vrne, redirectaš direktno na njegov jezik.
TO bi bila najboljsa resitev. Vedno pa morajo biti URLji na voljo, da človek lahko zamenja v drug jezik.
Jaz sem na začetku "čaral" s cookie-ji, potem pa se mi je včasih zgodilo, da je imel browser probleme z njimi (mislim da IE6) in mi ni pravilno delovalo. Takrat sem zadevo predelal na URL-je v stilu, da je na koncu \slo ali \eng in lahko v okviru katerekoli strani takoj preklopiš na jezik v okviru tiste strani, brez da bi te vrglo na kakšen index ali kaj podobnega. Še za tiste "optimizirane" variante, kjer se slike nalagajo v okviru javascripta brez reloada strani, sem naredil, da se link pri zastavi za jezik sproti dinamično popravlja za točno določeno fotografijo na kateri se nahajaš.
Da pa tujci ne pridejo na slovensko variatno, pa sem tudi dodal, da se ugotovi od kod prihaja uporabnik in če ni iz slovenije pokaže angleško verzijo. Na ta način vsaj večino teh pokrijem, tisti slovenci iz tujine pa še vedno lahko priklopijo na jezik ali pa si shranijo bookmark :)