Pozdrav,
nisam našao baš neko dopadljivo rješenje za izradu multilanguage (ML) weba, pa sam se odlučio na osmišljavanje vlastitog sisitema.
Uvjeti koje sam si postavio je:
-mora biti maksimalno jednostavno za tipkati code. Sve stavke koje mogu biti prevedene, se moraju pisati unutar codea s praktički minimalnim dodatnim “naporom”.
-ne smije biti asinkronog učitavanja
-maksimalno optimiziran load, tj. da opcija ML, zahtjeva minimalno CPU prilikom učitavanja WEB-a (diranje u bazu je već trn u oku). …a kamoli da se učitava nešto što se na određenoj podstranici WEB-a ne koristi.
Postavljen pred vlastite uvjete, malo sam se zabio u zid tražeći odgovarajuće rješenje…no na kraju je ispalo toliko elegantno, da eto imam potrebu podjeliti. No možda i nije dovoljno elegantno…to će strogi forumaši presuditi
Uglavnom, sve uvjete sam ispunio…i stvar zapravo šljaka besprijekorno. Ideja je sljedeća:
Stavke koje trebaju biti prevedene, tagiraju se posebnom oznakom u codeu. Ja sam odabrao {{duple vitičaste zagrade }}, što možda i nije najbolji odabir jer sam krajičkom oka vidio da se to već koristi za nekog vraga u nekim frameworcima…
No, odabir tagova je zapravo varijabilan…tako da mogu customizirati tu oznaku za buduće projekte.
Uglavnom, već sam često hvalio mogućnost preprocesiranja codea, i ovdje opet koristim tu “extra moć”, da iz coda izvučem više nego što on daje sam po sebi pisan u sintaksi nekog jezika. Znači dupla vitičasta zagrada je interna sintaksa, koju razumije i obrađuje preprocesor.
Preproces će znači ući u sve fileove projekta, pronaći sadržaj u duplim vitičastim zagradama…te njihov content prevesti iz dostupnog dictionarya…i na taj način stvoriti novi code. Taj novi code, sa prevedim vitičastim zagradama će spremiti u novi file, na lokaciju tipa: ML/HR/fileName ili ML/EN/fileName …logično, prevedeni file će se nalaziti na pathu ovisno o jeziku na koji je preveden.
Framework koji isporučuje WEB, se treba malo podesiti da postane kompatibilan s ovakvim pristupom, ali zapravo vrlo jednostavno podešavanje je potrebno. Znači, framework kod includanja određenog file treba provjeriti dali taj file postoji u folderu ML, na zadanom jeziku otvaranja stranice. Ako file postoji tamo, includa ga od tamo…ako ne postoji od tamo, includa source file. Autoloader klasa se također vrlo jednostavno podesi da inkluda klasu prvo iz ML foldera…tek zatim source file.
U codu, to je vrlo blaga izmjena, poput:
//stari include
include $filePath;
//novi include
include ML_getFile($filePath)
…jasno je, funkcija ML_getFile($filePath) …provjerava dali file postoji u ML folderu i koristi konstantu koja definira jezik na kojem se web isporučuje. (A dobro je da može primiti i vrijednost $language kao opcionalni parametar) Te ako file postoji tamo, vraća njegov path, u suprotnom vraća path koji je primila na ulazu.
I to je više manje to…stvar šljaka odlično. Jedina loša stvar ovog pristupa je da fileovi, koji sadrže neki element koji se prevodi, će biti kopirani u onoliko kopija koliko postoji ponuđenih prijevoda. Ali ta dodatna memorija ne opterećuje nikakav extra load, osim zanemarivo više utrošenog prostora na hostu gdje je web hostan.
Instalacija, tj. prevođenje file-ova je također jednokratan proces, koji se odvija lokalno (a može i na serveru) …iako taj proces je mrvicu zahtjevniji, to je ipak jednokratna radnja… I ta radnja se da prilično optimizirati, tako da ja u lokalnom radu ju automatski trigiram prije svakog otvaranja stranice. Ali ona tad prati koji fileovi su izmjenjeni…i samo njih pokušava prevesti. Tako da je na taj način i taj proces sveden na minimum…i može slobodno biti lokalno prisutan pred svako otvaranje weba.
Cijela priča se znači svodi:
-piši u vitičastim zagradama ono što želiš da bude prevedeno
-taj sadržaj će se automatski pojaviti u jednom dodatnom CMS, gdje admini imaju mogućnost unošenja prijevoda
-jedna instalacija prevede sadržaj iz vitičastih zagrada, pomoću tog dictionarya kojeg su ispunili admini. (Vjerovatno Google translate nudi neki API, pa se i taj dio prevođenja može automatizirati…gdje bi admini onda samo koregirali loše prijevode)
-framework se lagano podesi da učitava prevedeni file ako postoji, ili source file
-jedna instalacija prijevoda…i tarann…stvar radi odlično, i ja sam very happy about it.
P.S. Vitičaste zagrade omogućavaju i razvoj sintakse koji će se naći unutar njih…koju će preprocesor prepoznavati. Tako već imam mogućnost bindat varijabilne parametre koji se nalaze usred nekog prijevoda. Npr. korisničko ime…ili tako nešto… No, bitno je primjetiti da ovakav pristup ostavlja unlimited prostor razvoja sintakse koji će developeru omogućiti implementaciju kompleksnijih prijevoda, na što jednostavniji način.
I hope, you like it…as I like it.