Autor Zpráva
majo80
Profil *
Zdravím.
Chcel by som vytvoriť viacjazyčný web pomocou jednoduchej funkcie a DB.
V databáze bude tabuľka s prekladmi a tá bude mať stĺpce:
ID, TEXT_SVK, TEXT_CZE, TEXT_ENG - každý riadok bude obsahovať slovenskú, českú a anglickú verziu textu.

A samotný script:

<?
include ("config.php");
function preloz($prekladany_text,$do_jazyka)
{
       $sql2 = "SELECT * FROM texty WHERE text_svk='$prekladany_text'";
       mysql_query("SET NAMES 'cp1250'");
       mysql_set_charset("cp1250");
       $vysledek2 = mysql_query("$sql2");
       while($riadok2 = mysql_fetch_array($vysledek2))
       {
       $prelozeny_text = $riadok2["text_".$do_jazyka];
       } while (false);
if ($prelozeny_text<>""){return $prelozeny_text;}else{return $prekladany_text;}

}

echo preloz('Dnes bol veľmi krásny a výnimočný deň.','eng');


?>


čo znamená, že pomocou funkcie preloz vyberiem z databázy anglický preklad slovenskej vety (alebo český, podľa druhého parametru vo funkcii) a zobrazím ho. Ak sa v DB nebude nachádzať riadok s prekladom tejto vety, zobrazí sa veta v pôvodnom slovenskom jazyku.

Chcem sa opýtať, je takéto riešenie vhodné, prípadne bezpečné? Aké úpravy by ste prípadne navrhli?
Michal Benda
Profil
Tu databázi bych si navrhl trochu jinak:

tabulka jazyky (sloupec id, sloupec nazev) - sloupec id může být integer s auto_incrementem nebo bych tam ukládal jazykové zkratky (např. cz, en, apod.)

tabulka texty (sloupec id, sloupec jazyk, sloupec text) - sloupec jazyk je cizí klíč k tabulce jazyky

Funkci preloz() bych akorát pak předělal na tento návrh databáze, ale jako její použití a parametry bych nechal, jak jsou. Jinak já používám kódování UTF-8, které doporučuji, kde mohu, ale to už je na tobě.
Mastodont
Profil
Doporučil bych podívat se na to, co je gettext. Ony totiž ty překlady je třeba taky nějak vytvořit a dostat do DB. Gettext je celkově velmi elegantní řešení.
Ben
Profil *
Pokud se bude tato tvoje funkce opakovat několikrát za sebou, dal bych toto:
<?php
 mysql_query("SET NAMES 'cp1250'");
 mysql_set_charset("cp1250");

?>

uz do souboru config.php, aby se zbytecne nekolikrat nanastavoval to same
majo80
Profil *
Mastodont:
o tom viem, ja som si chcel niečo vytvoriť sám - preto chcem rady, či to tak môže byť a prípadne nejaké odporúčania...

Ben:
aha, no nad tým som neuvažoval, ďakujem....
DJ Miky
Profil
Tohle řešení má nevýhodu v tom, že počet SQL dotazů je roven počtu překládaných textů. Pokud jich bude na stránce více (desítky, stovky), povede to k celkem zbytečnému bombardování databáze.
CZechBoY
Profil
no ale načítat to všechno u každý stránky je taky neefektivní když je na stránce většinou jen pár vět překládaných :(
ideální by bylo na začátku skriptu zjistit jaký věty budeš vypisovat a dostat je z DB, přiřadit do pole a potom je obyčejným echem vypsat (třeba)

já mám překlad řešený přes soubor /jazyk/složka.php a v tom skriptu mám pole $lng (globální) které rozšiřuju a překlady mám napevno
takhle to má řešené phpBB (tam jsem to okoukal : - )
scrand
Profil *
CZechBoY, CZechBoY:
To je docela dobré :) Takhle by se to dalo udělat i na tu DB né? Že by se tam ještě přidal do DB sloupec, který by označoval, stránku, na které se má jaký text překládat. Podle toho by se pak na začátku skriptu vypsali všechny potřebné překlady do pole, které jsou potřeba pro tu stránku a nic víc :)

A pak by se jen použilo $preklad['prekladany_text']
Nox
Profil
Tak si udělej prostě jednoduchý soubor (soubory), kde bude PHP array s textama...problém vyřešen (samozřejmě gettext, ale toto je jednodušší)
Spectator
Profil
Nebo soubory
text_en.php
text_cs.php
text_sk.php

do nich ukládej přeložené části stránek (menu, chyby, oznamovací texty, ...) jako konstanty a podle parametru v URL je načítej.

require 'text_'. $_GET['jazyk'] .'.php';


Pro texty pro články bych použil řešení pomocí db jako u tebe popř. [#2] Michal Benda.


Řekl bych, že tím omezíš již zmiňované bombardování databáze
hexcross..
Profil *
Já to mám vyřešené tak že mám v tabulce v db 3 sloupce : id, cs, en

ID je zpravidla český název bez diaktritiky.

Potom si načtu celou tabulku do pole (může tam být maximálně cca. 100 záznamů takže bych zatížení nějak neřešil) :

$sql = mysql_query("SELECT id, $lang FROM translation");
 while ($res = mysql_fetch_array($sql)){
  $preklad[$res['id']] = $res["$lang"];
 }


Kde v
$lang
je uložené buď cs nebo en

Pak kdekoliv na stránce použiju jen např.
print($preklad[uvodni_stranka]);
a šup mám překlad ;)

Nevím zda to je nejlepší řešení, každopádně je funkční a mně stačí.
1Pupik1989
Profil
Já si zjistím jazyk, třeba cs a podle něj includuji soubor v adresáři lang. Příklad "cs.php". no a jednoduchost spočívá v tom, že pole mají jen číselné klíče. Např "$land[1]". V databázi bych to vyřešil na 4 sloupce. "id,text,jazyk,strana", možná bych místo id dal zkratku.

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:

0