Autor Zpráva
lorin
Profil
Tak jsem tu znovu. Tentokráte řeším problém s tím, že můj web by měl podporovat více jazyků. Zatím jsou dva (čeština a angličtina), ale je možné, že budu časem přidávat nějaké další a proto by systém měl být pokud možno co nejjednodušeji rozšiřitelný.

Co se týče stránek jako takových, s překladem není problém. Zatím mám překlad uložen v php souboru, který obsahuje pole s překlady. Není to nejelegantnější řešení ale pro vývoj postačuje. Při ostrém startu nahradím php soubor gettextem.

Některé texty jsou vložené v databázi. A právě zde je kámen úrazu.

1) Nejjednodušší řešení samozřejmě je, aby se do databáze uložil identifikátor zprávy, který se po načtení dat pomocí nějaké funkce (nebo gettextu) přeloží a zobrazí.

Mysql:
product_01_description

Výstup:
Toto je popis produktu 01.

Znamenalo by to po přidání produktu zasahovat do souboru s překladem.

2) Druhou možností je opět uvést identifikátor, jenže překlad by byl v další tabulce v databázi

Mysql
produkty {
  id
  jmeno
  popis
}

produkty_preklad {
  jazyk
  identifikator
  preklad
}

U každého uživatele mám uložený jazyk, který se má použít. Před načtením stránky by se v tabulce produkty_preklad vyhledal odpovídající identifikátor, který náleží uživatelově jazyku. Ten by se pak zobrazil.

Z těchto dvou způsobů se mi líbí spíš ten druhý. Znamenalo by to menší práci při přidání dalšího jazyku.

S tím se váže ještě jeden dotaz, který sice nemá tolik společného s DB, ale patří k tématu. Je lepší, abych součásti stránky měl přeložené v souboru (ať už pomocí gettextu nebo v php souboru) nebo abych odkazoval na DB a při každém načtení stránky z ní tahal data? Slyšel jsem že gettext si uloží překlady do cache (což způsobuje taky problémy při změně souboru s překladem - proto taky nepoužívám gettext rovnou) a překlad je poté docela rychlý..

Děkuji za vaše názory.
tiso
Profil
technická: obsah v rôznych jazykoch by mal byť dostupný pod rôznymi url. Máš to tak?
Joker
Profil
lorin:
Je lepší, abych součásti stránky měl přeložené v souboru (ať už pomocí gettextu nebo v php souboru) nebo abych odkazoval na DB a při každém načtení stránky z ní tahal data?
Pokud se informace o produktu stejně tahají z databáze, je lepší je mít rovnou v databázi.
Pak jde přes JOIN vytáhnout rovnou text ve správném jazyce a bude to rychlejší, než z databáze vytáhnout klíč, pak otevírat nějaký soubor a tam dohledávat překlad.
lorin
Profil
Tiso:
Ne. Produkt musí být dostupný pod jedním URL. U něho se zobrazí text v jazyku, který má uživatel vybraný. Nebo v defaultním jazyku, pokud není přihlášen.
Dostupnost pod jedním URL je z důvodu společné diskuze pod produktem.

Joker:
Těmi součástmi stránky jsem myslel menu, okolní text atd. Na některých stránkách se z databáze nic nenačítá. Ty produkty jsou jen speciální část.
mzk
Profil *
lorin:
Ne. Produkt musí být dostupný pod jedním URL. U něho se zobrazí text v jazyku, který má uživatel vybraný. Nebo v defaultním jazyku, pokud není přihlášen. Dostupnost pod jedním URL je z důvodu společné diskuze pod produktem.
taky momentálně řeším vícejazyčné verze.. a právě nevím, jetli je to vhodné, mít ty jazykové verze pod stejným url.. (viz. tiso)
spíš bys měl mít třeba:
[jazyk]/[id_produkt]/[produkt_název případně jeho překlad]
a mít jednu diskusi, kterou budeš tahat pod tím id produktu (což je třeba PK produktu)

záleží podle toho jak si navrheš db, tak problém nastává až v případě, kdy chceš tahat produkty a neexistuje k nim překlad..

asi nejjednoduší je to mít ve struktuře
id | nazev_cz | nazev_en | .... | stav
což je ale blbé z hlediska rozšiřitelnosti (musíš upravovat db), ale za to dotazy jsou podle mě dost jednoduchý..

já se to snažím řešit přes tabulku překlady, akorát mi dělá problémy tahat data, když třeba anglický překlad neexistuje, tak aby to vzalo verzi v základním jazyku (která je dostupná vždy)

produkt (id | .. | stav) produkt_překlad (id | produkt_id | jazyk_id | nazev | ... | stav)

asi by to trošku zjednodušilo, kdyby se tam vkládal stejný název pro různé jazykové mutace (když neexistuje překlad), sice ti to zabere trošku místa, ale není to zas podle mě taková tragédie..

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: