“Nanana” klaida, arba kaip geriau daryti daugiakalbystę tinklalapyje?

Dar viena reali istorija iš mano gyvenimo, privertusi susimąstyti apie vieną tinklalapių kūrimo aspektą. Žodžiu, buvo taip, kad sekmadienį užėjau į Tiketa.lt svetainę, norėdamas atspausdinti savo nupirktus bilietus į “Lietuvos talentų” finalą. Užeinu, o puslapyje… nėra teksto.

Tiksliau, situacija buvo dar įdomesnė – pats puslapis užsikrovė tvarkingai ir gražiai, be jokių klaidų, išskyrus tai, kad visur, kur buvo bendro pobūdžio tekstai ir stulpelių pavadinimai vietoj jų buvo tiesiog dvi raidės: NA.

Kas įdomiausia, visos nuorodos veikė ir puslapiai vartėsi tvarkingai, tik kad visur, kur buvo kažkokie tekstai ar pavadinimai, buvo NANANA. Gerai, kad iš ankstesnių apsilankymų gerai atsiminiau Tiketos tinklalapio struktūrą ir be didelio vargo prisiminiau, kokias nuorodas spausti ir kur vesti savo vartotoją ar slaptažodį – kitaip tariant, iššifravau visus NA kodus ir sėkmingai atspausdinau bilietą :) Bet susimąsčiau, kas čia galėjo nutikti – greičiausiai tiesiog nesikrovė kurios nors kalbos failas arba tekstai iš duomenų bazės. Ir čia dar gerai, kad buvo “NA”, o ne tiesiog tuščias laukas, nes bent jau buvo kur paspausti nuorodą.

Tad ta proga pamąstykime apie daugiakalbystę tinklalapiuose – Tiketa yra tik vienas iš pavyzdžių. Jeigu jūsų svetainėje naudojamos dvi kalbos ar daugiau, neišvengiamai kyla bendrųjų tekstų ir pavadinimų klausimas – kur saugoti visus meniu pavadinimus, bendrus tekstus ir kt. Pažiūrėkime, kokie yra variantai iš PHP ar HTML pusės:

1. Atskiri HTML šablonai

Visą HTML tekstą saugoti atskiruose šablonų failuose ir atskirti juos pagal kalbą į atskirus katalogus arba pagal prefiksus. Ar naudojamas koks nors “Smarty”, ar tiesiog paprastai viskas daroma su include() funkcija, čia nėra svarbu – su visais variantais suveiks.
Pliusas: galima daryti šiek tiek skirtingus šablonus pagal kalbą ir apdoroti juos atskirai.
Minusas: jeigu ką nors reikės pakoreguoti pačioje HTML struktūroje arba, neduok Dieve, keisti dizainą, tai kiek kalbų – tiek kartų padidėja pakeitimo darbai.

2. Kalbų failai

Gana populiarus sprendimas turinio valdymo sistemose – tiesiog turėti katalogą “language”, kuriame jau atskirai saugomi visų reikalingų kalbų failai. Aišku, klausimas dar ir toks, kaip tie failai bus “parsinami” (apdorojami) – ar ten tiesiog aprašomi tekstai kaip konstantos, ar aprašomas kažkoks kalbos masyvas, ar tiesiog kalbos reikšmės surašomos kažkokiu pseudo-tekstiniu failu, kuris vėliau apdorojamas iš PHP pusės. Teko matyti visus šiuos išvardintus variantus – matyt, visi jie turi teisę į gyvavimą, kuris geresnis – spręsti jums.
Pliusas: patogumas – galima tiesiog įkelti katalogą su savo kalbos failais ir vėliau katalogus papildyti.
Minusas: tuos failus reikia specialiai apdoroti ir pasirūpinti, kad jų struktūra būtų tokia, kad nebūtų problemų juos “parsinant”.

3. Tekstai duomenų bazėje

Ir dar vienas būdas, kur saugoti tekstus. Irgi neretai naudojamas didesniuose projektuose – tiesiog padaryti tekstų lentelę duomenų bazėje, kur pagal jos struktūrą galima būtų numatyti ir kalbų plečiamumą ateityje. Iš esmės, reikėtų dviejų lentelių – “languages” (id, title) ir “languages_text” (id, lang_id, text_title, text_keyword, text_text). Pavojus dėl šio tekstų saugojimo būdo yra lėtas tinklalapio veikimas – jeigu užsikraunant kiekvienam puslapiui, bus vykdoma užklausa į DB, tai gali atsiliepti papildomoms užsikrovimo sekundės dalims. Bet ir čia sprendimų – juk galima daryti įvairius kešavimus.
Pliusas: galimybė padaryti patogią administravimo sąsają, kur vėliau kalbų tekstus galėtų saugiai papildyti ir programavimo nenusimanantys žmonės.
Minusas: gali tekti pasirūpinti DB greičio klausimu arba įgyvendinti kažkokį duomenų kešavimą.

* * * * *

O kaip jūs sprendžiate daugiakalbystės problemą savo projektuose? Kur saugote tekstus?

* * *
Ar jau skaitėte mano naują el.knygą "Kaip kurti web-projektus"?
Joje išdėsčiau savo dešimties metų tinklalapių kūrimo, tobulinimo ir vystymo patirtį.
knygą galite parsisiųsti skyrelyje "Knygos".

Komentarų: 11

    Rolandas:
    January 16, 2012 7:19 pm

    Naudoju antrą būdą – atskirame kataloge laikau LT ir EN php failus su masyvais, o po to kiekviename puslapyje includinu reikiamą failą :)

      Zero:
      January 17, 2012 8:29 pm

      Lygiai tai pat darau ir as…

    Justinas:
    January 16, 2012 7:29 pm

    Aš už gettext (.po/.mo) failus. Nebe praeitam amžiui gyvenam, kad apsirašinėtume kalbas kaip krūvą globalių konstantų :)

    darles:
    January 16, 2012 7:58 pm

    Vertimus saugau DB + Cache, taip pat, jeigu neranda vertimo, automatiškai įtraukia default reikšmę, kad nereiktų rankutėm suvedinėt :)

    Valentinas:
    January 16, 2012 8:49 pm

    Antrinu Justinui, ne akmens amžiuje gyvenam – naudoti reikia gettex arba ką nors panašaus ir jokių problemų nebus. Formatas patogus vertėjams ir programuotojams (ir kompams tikriausiai, nes ten viskas sukompiliuota) ir jeigu kas nors ekstremaliai sufailina tai blogiausiu atveju rodys defaultinę kalbą ir viskas.

    zaidimai.lt:
    January 16, 2012 11:59 pm

    Man irgi tai buvo atsitike, paprasciausiai painaudojau kita narsilke ir psio

      Povilas (SkaitykIT.lt):
      January 17, 2012 6:09 am

      Žinok, bandžiau su keliomis naršyklėmis, tas pats rezultatas buvo. Bet matyt, kad vėliau pataisė, nes jau kitą rytą klaidos nebuvo.

    Mantas:
    January 17, 2012 10:23 pm

    Pats kadangi tik WordPress tenaudoju, tai nė nesusimąstau apie ką kitą nei po/mo failai.

    matka:
    January 19, 2012 9:23 pm

    Keista, kad autorius nepaminejo gettext, yra patogi f-cija _(“tavo tekstas”). Tik pradziai reikia siek tiek laiko skirti sios technologijos perpratimui…

    krafas:
    January 25, 2012 10:02 am

    Aš esu už DB + cahche, kadangi DB – lengva administruoti, o iš cache userside pasiimti eilutę beveik nieko nekainuoja.

    mikas:
    January 27, 2012 10:58 am

    Aš tai nuo senų laikų viską laikau atskiruose failuose, bet ten jie visi kaip konstantos priskirta, gal ir neblogai būtų kada nors juos į masyvus sugrupuot..

Parašykite komentarą


Powered by WordPress | Designed by: BlueHost Coupon | Compare CD Rates, Online Brokers and Press Release