Avaleht
uus teema   vasta Tarkvara »  Programmeerimine »  Andmebaasi ja JavaScripti lokaliseerimine märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale. Teata moderaatorile
otsing:  
nene
Kreisi kasutaja
nene

liitunud: 20.03.2004




sõnum 16.01.2008 01:18:05 Andmebaasi ja JavaScripti lokaliseerimine vasta tsitaadiga

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:
  1. function getFuelById($id) {
  2.     $text = DB::queryForValue("SELECT text FROM fuel WHERE id = ?", $id);
  3.     return gettext($text);
  4. }


Kui andmebaasi klassi veidi mudida, siis peaks olema võimalik teha ka selliseid päringuid:

php:
  1. function getFuelById($id) {
  2.     return DB::queryForValue("SELECT _(text) FROM fuel WHERE id = ?", $id);
  3. }


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:
  1. $open = _("Open");
  2. $close = _("Close");
  3. echo "<a href=\"#\"
  4.       onclick=\"this.innerHtml=(this.innerHtml=='$open')?'$close':'$open';\"
  5.          >$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:
  1. var LOCALE = {
  2.     "Open": "Ava",
  3.     "Close": "Sule",
  4.     ...
  5. };


Gettext funktsioon ise oleks umbes selline:

javascript:
  1. function gettext(text) {
  2.     return (LOCALE[text]) ? LOCALE[text] : text;
  3. };


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
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
tanzanite
HV kasutaja
tanzanite

liitunud: 13.05.2006




sõnum 16.01.2008 15:47:45 Re: Andmebaasi ja JavaScripti lokaliseerimine vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
nene
Kreisi kasutaja
nene

liitunud: 20.03.2004




sõnum 17.01.2008 00:13:03 Re: Andmebaasi ja JavaScripti lokaliseerimine vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
Fukiku
Kreisi kasutaja
Fukiku

liitunud: 06.11.2003




sõnum 18.01.2008 00:50:03 Re: Andmebaasi ja JavaScripti lokaliseerimine vasta tsitaadiga

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 icon_razz.gif

_________________
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
vaata kasutaja infot saada privaatsõnum
tanzanite
HV kasutaja
tanzanite

liitunud: 13.05.2006




sõnum 18.01.2008 15:53:18 Re: Andmebaasi ja JavaScripti lokaliseerimine vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum
nene
Kreisi kasutaja
nene

liitunud: 20.03.2004




sõnum 19.01.2008 03:13:47 Re: Andmebaasi ja JavaScripti lokaliseerimine vasta tsitaadiga

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
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  Andmebaasi ja JavaScripti lokaliseerimine
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
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.