praegune kellaaeg 29.05.2024 00:08:41
|
Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
sõnum |
|
nene
Kreisi kasutaja
liitunud: 20.03.2004
|
16.01.2008 01:18:05
Andmebaasi ja JavaScripti lokaliseerimine |
|
|
Viimasel ajal on mu pead vaevanud see, kuidas lokaliseerimist (peaasjalikult tõlget) kõige paremini andmebaasile ja JavaScriptile rakendada. Olen üksjagu tuulanud võrguvarustes, kuid pole suurt midagi sel teemal leidnud.
Platvormiks siis vana hea LAMP, aga teretulnud on kommentaarid ka muust vallast.
Kuna PHP ja Smarty mallide osas on lokaliseerimiseks kasutatud gettext'i, siis oleks hea, kui saaks kuidagi ka andmebaasi ja javascripti seda kasutama panna.
Andmebaasist
Tüüpiline lokaliseerimist vajav tabel andmebaasis on hetkel selline:
TABLE: fuel
id | text_eng | text_est | text_rus
-----+----------+----------+---------------
1 | petrol | bensiin | benzin
2 | diesel | diisel | dizel
3 | gas | gaas | gaz
4 | electric | elekter | elektricestvo |
Alustuseks pole selline tabeli struktuur eriti skaleeruv. Toodud näites on tõlgitavaid välju vaid üks (text_*), kuid on ka tabeleid, kus selliseid välju on päris mitu. Kümne keelega muutuks see süsteem juba päris põrguks. Iga uue keele lisandumine tähendab pealegi muutust andmebaasistruktuuris - sugugi mitte hea.
Üks variant oleks eemaldada need tõlgitavad tekstid andmebaasist üleüldse. Sellel variandil näen ma vaid halbu külgi: andmebaasi ID-de kirjutamine PHP koodi, üksnes ID-dest koosnevate tabelite teke andmebaasi, andmebaasi käsurealt kasutamise ääretult ebamugavaks muutumine. Seega jääb ära.
Teine variant oleks jätta andmebaasi alles vaid algtekst (inglise) ning teostada tõlkimine andmebaasist päringu tegemise hetkel. Umbes nii:
php:
|
function getFuelById($id) { $text = DB::queryForValue("SELECT text FROM fuel WHERE id = ?", $id); }
|
Kui andmebaasi klassi veidi mudida, siis peaks olema võimalik teha ka selliseid päringuid:
php:
|
function getFuelById($id) { return DB::queryForValue("SELECT _(text) FROM fuel WHERE id = ?", $id); }
|
Teine pool oleks kirjutada skript, mis korjab andmebaasist välja tõlkimist vajavad tekstid ja lisab need gettext-i PO failidesse. Lihtne.
Endale tundub mõistlik lahendus. Kuidas on aga teiste siinolijate praktika andmebaasiväljade tõlkimise osas? Kindlasti on veel mitmeid variante.
JavaScriptist
Teinekord on tarvis JavaScriptiga lehel teksti muuta. Näiteks kordamööda vahetada nupu peal teksti "Ava" / "Sulge".
Kõige labasem variant on muidugi genereerida PHP-ga lehele vastavas keeles kood:
php:
|
onclick=\"this.innerHtml=(this.innerHtml=='$open')?'$close':'$open';\" >$open</a>";
|
Kuid mulle ei meeldi lehele HTML-i ja JavaScripti segiläbi kirjutada. JavaScript võiks siiski eraldi failidesse jääda. Samuti ei tahaks ma JavaScripti faile muuta PHP failideks, sest nõndaviisi kaoks nende meeldiv omadus cachetud saada.
OK, tegelikult saab vast saata mingi headeri, mis ütleks, et brauser seda cacheks. Aga see PHP ja JavaScript läbisegi, see oleks ikkagi üksjagu inetu.
Jällegi tahaks teha kuidagi nii, et saaksin JavaScripti koodis lihtsalt kasutada todasama gettext() funktsiooni.
Näen sellist varianti: kirjutan parseri, mis JavaScriptist tõlkimist vajavad tekstid välja nopib ja gettextile ette söödab. Kui tõlkijad on oma töö teinud, siis loon vastavalt keelte arvule portsu javascripti faile. Näiteks est.js sisu oleks selline:
javascript:
|
var LOCALE = { "Open": "Ava", "Close": "Sule", ... };
|
Gettext funktsioon ise oleks umbes selline:
javascript:
|
function gettext(text) { return (LOCALE[text]) ? LOCALE[text] : text; };
|
Keele saaks seega määrata puhtalt seeläbi, kas mul on lehe peal viide est.js, rus.js või eng.js failile.
Jällegi tundub mõistlik lahendus. Kuid kas kellelgi on taolise asjaga omi kogemusi jagada?
|
|
Kommentaarid: 24 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
1 :: |
23 |
|
tagasi üles |
|
|
tanzanite
HV kasutaja
liitunud: 13.05.2006
|
16.01.2008 15:47:45
Re: Andmebaasi ja JavaScripti lokaliseerimine |
|
|
nene kirjutas: |
Viimasel ajal on mu pead vaevanud see, kuidas lokaliseerimist (peaasjalikult tõlget) kõige paremini andmebaasile ja JavaScriptile rakendada. |
Mina teeks nii:
Vastavalt mahule teeks php poolel lehe spetsiifiliselt (või kui maht väike siis kogu kremplile kokku) keele php cache failid (olenevalt mahust jupitatuna) mis genereeritakse db andmetest. Ja või cacheda kogu leht - see annab db juures, mis kõige olulisem, rohkem mänguruumi - pole vaja jõudlusprobleeme karta.
Keeletabeliks kasutaks midagi sellist:
lang(set:est,eng,...), identificator(inglisekeelne string: "fuel_petrol" või "petrol" või misiganes sobib), text(string vastavas keeles: "bensiin")
lang võib ka olla eraldi tabelis ja kasutada sealkohal hoopis surrogaatvõtit.
lang ja identificator on siin siis muidugi võtmeks - surrogaatvõti oleks halb mõte.
Javaskriptis sarnaselt (ka andmebaasist, aga väljundiks .js fail):
lang.identifikaator või lang["identifikaator"] kujul siis.
(ise olen alati eelistanud esimest - loetavam, aga ei saa päris suvalisel kujul identifikaatoreid kasutada. Njah, see nii ehk naa porno pisut - javascript otseselt ei toeta assotsiatiivseid massiive. Samas muidugi on mul identifikaatorite tegemisel sellised reeglid, et probleemseid tekkida ei saagi).
|
|
tagasi üles |
|
|
nene
Kreisi kasutaja
liitunud: 20.03.2004
|
17.01.2008 00:13:03
Re: Andmebaasi ja JavaScripti lokaliseerimine |
|
|
tanzanite kirjutas: |
Vastavalt mahule teeks php poolel lehe spetsiifiliselt keele php cache failid mis genereeritakse db andmetest. |
Ei saanud hästi aru. Mida sa mõtled "keele php cache failid" all? Ja mismoodi "lehe spetsiifiliselt"?
tanzanite kirjutas: |
Keeletabeliks kasutaks midagi sellist:
lang(set:est,eng,...), identificator(inglisekeelne string: "fuel_petrol" või "petrol" või misiganes sobib), text(string vastavas keeles: "bensiin") |
Ja ka sellest ei saanud ma aru. Ma saan aru selle keeletabeli ülesehitusest (väljad: lang, identificator, text), aga mis kasu ma sellise asja kasutamisest saaksin?
tanzanite kirjutas: |
Javaskriptis sarnaselt (ka andmebaasist, aga väljundiks .js fail) |
Ma ei mõista, miks ma peaksin JavaScripti puhul üldse andmebaasi asjasse segama?
tanzanite kirjutas: |
javascript otseselt ei toeta assotsiatiivseid massiive. |
Kuidas võtta. JavaScriptis on objektid ja assoc-massiivid lihtsalt ühendatud. Enivei, see pole probleemiks...
Aga ma tõesti ei saanud su mõttekäikudest päris hästi aru.
|
|
Kommentaarid: 24 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
1 :: |
23 |
|
tagasi üles |
|
|
Fukiku
Kreisi kasutaja
liitunud: 06.11.2003
|
18.01.2008 00:50:03
Re: Andmebaasi ja JavaScripti lokaliseerimine |
|
|
nene kirjutas: |
tanzanite kirjutas: |
Keeletabeliks kasutaks midagi sellist:
lang(set:est,eng,...), identificator(inglisekeelne string: "fuel_petrol" või "petrol" või misiganes sobib), text(string vastavas keeles: "bensiin") |
Ja ka sellest ei saanud ma aru. Ma saan aru selle keeletabeli ülesehitusest (väljad: lang, identificator, text), aga mis kasu ma sellise asja kasutamisest saaksin?
|
ausalt öeldes ülejäänu käis natuke minul ka üle jõu, aga see ülesehitus on täpselt see, mida ma sinu postitust lugedes eile ise tahtsin soovitada, aga ette jõuti..
aga iseenesest on lihtne ja loogiline, ju miks sellist struktuuri kasutada .. kui sa tead, et sul on kuskil vaja öelda bensiin, siis sa selles kohas teed andmebaasi selecti identifikaatori peale ja paned lisatingimuse keel, mida võib näiteks kuskil sessioonimuutujas hoida vms.
uue keele lisamisel pole vaja hakata andmebaasi struktuuri muutma.. ja kui kohe ei viitsi tõlkida, on kaks võimalust .. kas kopeerida default keele kõik tekstid uue lang muutujaga ja neid aegapidi tõlkida.. või teha programne fallback mehhanism, et kui selecti vastuseks ei tule midagi, siis teed uue selecti default keele peale.. ja noh.. igasugu asju võib veel teha.. cache'da asju veel kuskil rakenduses ka, et ei peaks koguaeg baasis käima.. aga ma vist olen viimase aja valguses liiga enterprise mõtlemisega
_________________ Foxic is just a simple fox
Enne kui sa küsid oma küsimuse - küsi seda vannipardilt! Rangelt soovitatav enne programmeerimise alafoorumisse uue teema tegemist. |
|
Kommentaarid: 2 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
2 |
|
tagasi üles |
|
|
tanzanite
HV kasutaja
liitunud: 13.05.2006
|
18.01.2008 15:53:18
Re: Andmebaasi ja JavaScripti lokaliseerimine |
|
|
Ilmselt ajasin vist v2ga segast juttu (osalt selle t6ttu, et ei lugenud v2lja asja skoopi - ehk v6imalik et enamus asju on paras overkill) - proovin siluda teist.
P6him6te on see, et k6ik keeleline tuleb yhest kohast - andmebaasist (v6ib ka kuskilt mujalt tulla) ja sealt saadud info jagatakse, sinna kus vaja, edasi automaatselt. Kui v2ga palju on erikeelset kontenti siis ilmselt selle k6ige kohta yhe m2lulimiiti yletavasse php faili ei pane => genereerid eraldi tykkidena (n8: konkreetse lehe/lehtede kogumi spetsiifiliselt - ainult see mida vaja).
nene kirjutas: |
tanzanite kirjutas: |
Keeletabeliks kasutaks midagi sellist:
lang(set:est,eng,...), identificator(inglisekeelne string: "fuel_petrol" või "petrol" või misiganes sobib), text(string vastavas keeles: "bensiin") |
Ja ka sellest ei saanud ma aru. Ma saan aru selle keeletabeli ülesehitusest (väljad: lang, identificator, text), aga mis kasu ma sellise asja kasutamisest saaksin?
|
Fukiku'ga yhelmeelel siin. + asi m2rksa rohkem normaliseeritum kui (id | text_eng | text_est | text_rus ) mis aitab v2ltida peavalu tulevikus. + identifikaatori asemel on inimesele m6istetav ... identifikaator - "magic number"i asemel.
nene kirjutas: |
Ma ei mõista, miks ma peaksin JavaScripti puhul üldse andmebaasi asjasse segama? |
Sest need andmed peaksid p2rinema yhest ja samast kohast - pakkusin v2lja, et andmebaasist. Teksti ise mitmesse kohta paljundamine on yldiselt paha m6te ... immho.
nene kirjutas: |
Kuidas võtta. JavaScriptis on objektid ja assoc-massiivid lihtsalt ühendatud. Enivei, see pole probleemiks... |
Selles viga ongi et nad on m6lemad _KOOS_ (for ... in, lendab selle peale 6hku kui kasutad object.prototype't) ... aga see jah OT.
Loodetavast olin nüüd pisut v2hem sogasema jutuga x_x.
|
|
tagasi üles |
|
|
nene
Kreisi kasutaja
liitunud: 20.03.2004
|
19.01.2008 03:13:47
Re: Andmebaasi ja JavaScripti lokaliseerimine |
|
|
tanzanite kirjutas: |
nene kirjutas: |
Ma ei mõista, miks ma peaksin JavaScripti puhul üldse andmebaasi asjasse segama? |
Sest need andmed peaksid p2rinema yhest ja samast kohast - pakkusin v2lja, et andmebaasist. Teksti ise mitmesse kohta paljundamine on yldiselt paha m6te ... immho. |
OK. Selles osas olen igati päri. Aga hetkel on nii, et primaarseks allikaks on siiski tekstifail. JavaScripti osas sai just realiseeritud asi nii, nagu ma enne kirjeldasin.
Nüüd on siis nii, et PHP, Smarty ja JavaScripti jaoks tulevad tõlked kõik kenasti gettexti kaudu .po failidest. Ainus probleem on veel andmebaas.
Tegelikult andbmebaasi struktuur hetkel toimib kenasti. Ma tunnetan, et see pole ideaalne ning see häirib mind, kuid mul on tarvis mingeid vingeid argumente, et ka teisi arendajaid selle veenda.
Tore oli kuulda tanzanite'i ja Fukiku arvamust sellest, kuidas nad seda probleemi lahendaksid, ent siiski ootaks ka kellegi kommentaari, kes on ka tegelikult seda probleemi lahendanud.
|
|
Kommentaarid: 24 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
1 :: |
23 |
|
tagasi üles |
|
|
|
lisa lemmikuks |
|
|
sa ei või postitada uusi teemasid siia foorumisse sa ei või vastata selle foorumi teemadele sa ei või muuta oma postitusi selles foorumis sa ei või kustutada oma postitusi selles foorumis sa ei või vastata küsitlustele selles foorumis sa ei saa lisada manuseid selles foorumis sa võid manuseid alla laadida selles foorumis
|
|
Hinnavaatlus ei vastuta foorumis tehtud postituste eest.
|