Üdv!
Érdekelne, hogy milyen módszerek lehetségesek egy többnyelvű oldal létrehozására, és melyik miért hatékony.
Jelenleg egy python (django) alapú oldalról lenne szó, de érdekességképpen php nyelvnél is érdekelne, ha van különbség.
2 dolog, amire gondoltam:
1) minden nyelvi dolgot mysql- ben tartani, de ez nyílván nagyon nagyon sok lekérdezéssel jár. Egy lekérdezésben nem is lehet minden adatot elkérni, mivel a generálás "elején" nem mindig tudom, hogy mire lesz szükség.
Sok olyan "mondat" van, ami úgy épül fel, hogy:
nyelviszoveg1 $valtozo1 nyelviszoveg17 $valtozo5 nyelviszoveg13 $valtozo22 nyelviszoveg32 ...
.
Ha például van egy oldal, ahol sok szöveg van, és van benne mondatonként 2 változó, ez akár lehetne 50 lekérdezés egy oldalra, ami nem túl hatékony.
2) Gondolom egy jobb megoldás, ha a nyelvi dolgokat egy olyan fájlban tartom, amiben a változók már ott vannak, mondjuk egy jó nagy dic:
dic = {
'nyelviszoveg1': ('alma', 'apple', 'Apfel'),
'nyelviszoveg17': ('beka', 'frog', 'Frosch'),
'nyelviszoveg33': ('korte', 'pear', 'Birne')
}
.
Igazából ez a 2 ötletem van így hírtelen, de nyílván van jobb és hatékonyabb megoldás is "erősen dinamikus" oldalakra. Érdekelne, hogy mások ezt hogyan oldják meg.
Köszi a válaszokat.
- 4603 megtekintés
Hozzászólások
Az SQL-es megoldással nincs gond, egyszerűen bele kell kalkulálni a dologba. A kevessé dinamikus tartalmak pedig cache-elhetőek, azaz előre legenrálhatóak. Ilyen lehet például egy Impresszum, egy ÁSZF, egy elérhetőség vagy ehhez hasonló menü. Általában a SELECT text FROM akarmi WHERE lang = 'hu'
módszert szokták alkalmazni a dinamikus tartalomhoz és a menükhöz pedig szótárfile-okat. Ezekben lehet konstansként vagy tömbelemként definálni ami kell. Pl.: $LANG['HU']['mainpage'] = 'Főoldal';
.
Emailekben lehet template-et használni, ahol %AKARMI%-re helyettesítesz be a szótárfile-okból vagy SQL-ből.
--
Apache Solr Druplahoz és Wordpresshez: http://solr.vpspro.hu
- A hozzászóláshoz be kell jelentkezni
+1
Jelenleg én is ezt az elgondolást alkalmazom, még annyi, hogy ha később külső fordítók bedolgozása várható, nem biztos, hogy a php formátum olvasható nekik, érdemes lehet egy .csv formába export, és azt importálni, de azt meg db-be egyszerűbb. Üzleti szoftvereknél mindig könnyű találni fordítókat a leendő felhasználók között, én is fordítottam már license-ért, és fordíttattam is.
- A hozzászóláshoz be kell jelentkezni
csv-vel csak szopatnam a forditot. Egy Gettext PO fajl peldaul sokkal hasznosabb lehet.
--
Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal
- A hozzászóláshoz be kell jelentkezni
Az SQL fölé érdemes egy nosql (pl. Redis) réteget húzni, és oda pakolni a db-ből lekért fordításokat, jól kitalált kulcsokat használva.
- A hozzászóláshoz be kell jelentkezni
akkor már miért nem memcache?
de a gettext a legjobb.
- A hozzászóláshoz be kell jelentkezni
Ha relative sok adatot tart az ember a cache-ben, akkor annak kiürülése (mondjuk egy restart miatt) nem egy örömteli dolog. Oké, a redis teljesítménye kisebb, de valamit valamiért.
- A hozzászóláshoz be kell jelentkezni
gettext :)
- A hozzászóláshoz be kell jelentkezni
annyival nem rosszabb a redis, hogy memcache-t használjon az ember, az extra feature-ok pedig kifejezetten előnyösek tudnak lenni.
- A hozzászóláshoz be kell jelentkezni
hátde forditásoknak tartani redist majdnem luxus.
de kérdéshez:
legeszerűbb a:
$text = sprintf(_('Matyi %s napot matyizott'),'három');
ellenben a
$text = sprintf($lng[$aktuálislng]['valamiazonostio'],'három');
ha pl uj szoveg kell, átirod a _() -ben a szöveget arra amire kell, és frissited a poeditben, és kész. a tömbös és defineos megoldásnál meg ugyis belekavarodsz előbb vagy utóbb.
- A hozzászóláshoz be kell jelentkezni
raadasul ha melleutsz valahol, akkor legy egy ures stringed, gettextnel meg max nem forditodik le. mindkettoben van elony meg hatrany is...
--
A vegtelen ciklus is vegeter egyszer, csak kelloen eros hardver kell hozza!
- A hozzászóláshoz be kell jelentkezni
jo, de szerintem ezt nem nekem akartad mondani. En csak a memcache<->redis dologba rofogtem bele, nem abba hogy helyes dolog-e redis-ben tarolni a forditasokat.
- A hozzászóláshoz be kell jelentkezni
igen, azért irtam, hogy "de kérdéshez:" lusta voltam másikat nyitni.
- A hozzászóláshoz be kell jelentkezni
Szerintem hasznald a Django beepitett i18n tamogatasat, akkor nem kell feltalalni ujra a spanyolviaszt.
--
|8]
- A hozzászóláshoz be kell jelentkezni
+1 bar nem ertek a dijangohoz, de mar gondolkoztam rajta, hogy nem igaz, hogy nincs erre valami megoldas benne. Mondjuk azzal lehet vitatkozni, hogy az a legjobb-e, es a kerdezo inkabb arra volt kivancsi, mi valt be legonkabb a kozossegnek. A masik oldalon meg a dijangos kozossegnek az valt be ;)
--
zsebHUP-ot használok!
- A hozzászóláshoz be kell jelentkezni
Ha a tényleges fordításokat nem gettext po formátumban tárolod, rövid úton pokolra jutsz!
___
Arany János: Grammatika versben
- A hozzászóláshoz be kell jelentkezni
+1 gettext
- A hozzászóláshoz be kell jelentkezni
+1 a gettextre. Igaz file alapú, de jól kezelhető és mindenhez van.
- A hozzászóláshoz be kell jelentkezni
+1
- A hozzászóláshoz be kell jelentkezni
Lehet, hogy én vagyok a hülye, minimalista, etc., de ha van rá egy egyszerű, könnyen kivitelezhető, saját megoldás, ami semmivel sem bonyolítja meg a felhasználást, akkor miért éri meg egy sok extra, sok esetben a feladathoz teljesen felesleges modulokkal és opciókkal rendelkező frameworkot használni?
- A hozzászóláshoz be kell jelentkezni
Tobbek kozt azert, mert eleve, a hasznalt framework (Django) tamogatja a tobbnyelvuseget, teszi ezt gettexten keresztul, igy feltalalni a spanyolviaszt nagyobb befektetes, mint hasznalni a meglevot, ami eleve a framework resze.
--
|8]
- A hozzászóláshoz be kell jelentkezni
+1, valamit ha gettextet használsz, fordítgathatod a szövegeidet kényelmesen, célszoftverrel: http://www.poedit.net/
- A hozzászóláshoz be kell jelentkezni
az arrayos megoldás nem egyszerű. a define sem.
- A hozzászóláshoz be kell jelentkezni
Mert a sajat, egyszeru, konnyen kivitelezett sajat megoldasod nincs betesztelve tobb ev es tobmillio felhasznalo altal. A Gettext meg igen. Es ez kb. minden feladathoz igaz.
--
Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal
- A hozzászóláshoz be kell jelentkezni
nemcsak magat a forditas kell nezni, hanem mellett a koritest. te csak irod a kodot, es vannak toolok amik kigyujtik a forditani valot. kommentet lehet irni a szoveg melle, igy egy nemegyertelmu szoveget nem forditanak tokre hulyere. es tonnanyi editor van hozza. stb.
--
A vegtelen ciklus is vegeter egyszer, csak kelloen eros hardver kell hozza!
- A hozzászóláshoz be kell jelentkezni
Szia!
Én személy szerint xx.php file-ben define("LOGIN_LOGINBUTTON_TEXT","Login");
formában tárolom a statikus szövegeket, és amilyen nyelven van a felhasználó, azt includeolom. A dinamikus tartalmaknak (hírek, kommentek) meg simán adtam sql-ben egy language mezőt. Egyszerű szerkeszthetőség kedvéért ki szoktam rántani excelbe az egész statikus lang filét a fordítóknak.
Sok gondom eddig nem volt vele, bár tutira nem industry best practice :)
- A hozzászóláshoz be kell jelentkezni
Annyira nem tunik rossznak, mar csak azert sem mert en is igy szoktam :D
- A hozzászóláshoz be kell jelentkezni
Teljesen mellekesen megkerdeznem, hogy benchmarkolta-e mar valaki, hogy az arrayos meg defineos moka vajon gyorsabb-e, mint a gettext?
Illetve, hogy tudja-e ugyanazokat a dolgokat, amiket azert szokott hasznalni az ember (tobbes szam, format stringben parameterek mas helyutt, stb)? Kommentek forditoknak, adott nyelv forditasi szazalekanak, fuzzinessenek merese? Meglevo eszkozok a forditas egyszeru szerkesztesehez, frissitesehez?
Illetve arra gondolt-e valaki, hogy a Djangos mar meglevo megoldas milyen egyeb extrakat nyujt (pl Accept-Language header tamogatas), amiket igy nem kene ujra feltalalni?
--
|8]
- A hozzászóláshoz be kell jelentkezni
valahol olvastam hogy a gettext gyors. régen. aztán valaki kimérte, hogy igen
http://mel.melaxis.com/devblog/2006/04/10/benchmarking-php-localization…
kéne valami hasonlot mérni
- A hozzászóláshoz be kell jelentkezni
Szerintem az eredmeny tovabbra is ugyanaz (erre volt burkolt utalas a kerdes ;), de valoban megerne egy uj merest, ha masert nem, azert, hogy legyen friss eredmeny is, amire lehet mutogatni.
--
|8]
- A hozzászóláshoz be kell jelentkezni
for ($i=0;$i<1000;$i++) $text .= sprintf(_('Üzenetek %s'),$i);
ez alig több mint 3 század másodpercig fut.
ha két századmásodpercig futna a tömbös vagy a define, akkor most melyik a jobb?
- A hozzászóláshoz be kell jelentkezni
Nem a sebesseg az egyetlen szempont, FYI, es nem is feltetlenul olyan egyszeru formaban, mint a ciklusod.
Pl. ha templateben kell forditani, vagy picit komplexebb, mert mondjuk tobbesszam is van benne, rogton mas lesz a helyzet.
--
|8]
- A hozzászóláshoz be kell jelentkezni
mutass példát
- A hozzászóláshoz be kell jelentkezni
Fentebb keresd meg a django i18n doksit, van benne jopar pelda.
--
|8]
- A hozzászóláshoz be kell jelentkezni
Tekintve hogy a gettext valahol melyen C szinten fordit, nem hiszem, hogy nagysagrendekkel lassabb tudna lenni, mint barmilyen PHP-s megoldas. Lehet, hogy van sebessegkulonbseg, de oszinten: ha egy oldalnal lassu, jo esellyel nem a gettext miatt az.
--
Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal
- A hozzászóláshoz be kell jelentkezni
Szerintem olvasd el mit irtam, pont forditva ertelmezed ugy latom :)
--
|8]
- A hozzászóláshoz be kell jelentkezni
PHP-ban ajánlom a yii framework-öt, annak az I18 implementacioja nekem eddig bevált.
- A hozzászóláshoz be kell jelentkezni