Za potrebe jednog projekta gde je trebalo omogućiti velik broj jezika (10-15) ali gde je procena da većina tekstova neće uopšte biti prevedena izveo sam sledeću varijantu:
Sve varijante (prevode) teksta sam spojio u jedan string, upotrebivši neki "delimiter" koji se ne pojavljuje u normalnom tekstu, dodavši prethodno svakom prevodu dvoslovnu oznaku jezika kao prefiks,
i takav string snimio u tabelu, polje tipa longtext,
čak u istu tabelu sa ostalim sadržajima stranice, dakle nema posebne tabele za prevode.
Pri prikazivanju stranice naravno, dovućiće se iz baze i nepotrebni prevodi, ali kao što rekoh većina sadržaja ima u 1 ili 2 jezika. PHP je taj koji će explode-ovati taj zapis, potražiti ima li ga u traženom jeziku, ako ga nema potražiti ga u "default" jeziku sajta, a ako nema ni takvog prikazati u bilo kojem prevodu.
Važno je napomenuti da ne prevedene tekstove uopšte ne snimam u taj zbirni string. Jednostavno ih nema.
Takvim pristupom sam dobio jednostavan mysql query, bez join-ovanja i bez kontrolne logike tipa "a ako nema u tom jeziku", ili dupliranja zapisa neprevedenih tekstova.
Mislim da sam žrtvujući malo veći transfer dobio na brzini izvršavanja querija.
Dodavanje novog jezika ne zahteva nikakvu intervenciju u bazi, jednostavno će stranica prikazati default prevod jer u novom jeziku nema ništa.
U situaciji da se očekivalo da će većina tekstova biti prevedena na tih 10+ jezika išao bih na varijatu koja mi se pokazala uspešnom:
Kôd:
CREATE TABLE IF NOT EXISTS `multilang_texts` (
`mltKey` varchar(32) NOT NULL,
`mltLang` char(2) NOT NULL,
`mltTranslated` char(1) NOT NULL,
`mltText` longtext NOT NULL,
UNIQUE KEY `mltId` (`mltKey`,`mltLang`)
);
Svi neprevedeni tekstovi se dupliraju (pišu u bazu) i ne dobijaju fleg na `mltTranslated`.
Kad se edituje tekst u default jeziku, tekst se piše i u sve zapise bez tog flega.
Kad se edituje tekst u alternativnom jeziku (prevod), postavlja se taj fleg da se više ne dira.