Autor Zpráva
candiess
Profil
Dobrý, chtěl bych po Vás názory, co je lepší.. jesti mutací udělat přes Pole, nebo DB..

Globální nastavení jazyka je pro oba způsoby stejné --> $_SESSION['lang'] = "cz";

Mám oba způsoby:

1) Pole
include "jazyky/".$_SESSION['lang'].".php";


jazyky/cz.php
$pole = array(
"Domů",
"Kontakt",
"Panenky",
"Ostatní hračky"
);


jazyky/en.php
$pole = array(
"Home",
"Contact",
"Dolls",
"Other toys"
);


a menu by vypadalo
<a href='index.php'><php echo $pole[0]; ?></a>
<a href='kontakt.php'><php echo $pole[1]; ?></a>
<a href='/produkty/panenky/'><php echo $pole[2]; ?></a>
<a href='/produkty/ostatni/'><php echo $pole[3]; ?></a>


2) přes DB:

tabulka:
ID|idcko|value|lang
------------------
1 | 1|Domů|cz
------------------------
2 | 1|Home|en
------------------------
3 | 2| Kontakt| cz
---------------------------
4| 2|Contact| en

<?php function mutace($idcko) {
$query = mysql_query(" SELECT value FROM mutace WHERE idcko = '$idcko' and lang = '".$_SESSION['lang']."'");
$V = mysql_fetch_array($query);
echo $V['value'];
} ?>


a menu by vypadalo
<a href='index.php'><php mutace(1); ?></a>
<a href='kontakt.php'><php mutace(2); ?></a>
<a href='/produkty/panenky/'><php mutace(3); ?></a>
<a href='/produkty/ostatni/'><php mutace(4); ?></a>

....

Uvítám veškeré nápady a vylepšení, hotová řešení nebo odkazy na články, děkuji všem :)
snake.aas
Profil *
ok.. ani jedno...
první způsob je neuvěřitelně nepřehledný... v 1000 řádcích, až budeš hledat jaký je význam hlášky $pole[425]
a druhý způsob je strašně náročný na db... pro každý kousek textu dělat výběr z databáze není zrovna košér...

doporučil bych tedy buď jak to má phpMyAdmin - každý jazyk = jeden soubor s logicky pojmenovanými proměnnými a hodnotami... takže
cz.php
$strContact = "Kontakt";
$strDolls = "Panenky"


a menu
<a href='kontakt.php'><php echo $strContact; ?></a>
<a href='/produkty/panenky/'><php echo $strDolls; ?></a>



a nebo ještě lépe použít gettext, případně jeho náhradu phpGettext...
velice jednoduchá správa překladů, člověk si nemusí hlídat jestli nezapomněl někde něco přeložit, prostě zdrojáky prožene PoEditem a vidí...
snake.aas
Profil *
ještě doplním, že v gettextu jsou množné tvary naprostá hračka...
angličtina má totiž jen jeden tvar množného čísla čísla (You have 1 new message | You have 3 new messages), kdežto čeština 3 ( Máš 1 novou zprávu | Máš 3 nové zprávy | Máš 6 nových zpráv)
pokud tohle budeš potřebovat řešit, tak to polem, proměnnými, ani databází úplně jednoduše neuděláš...
snake.aas
Profil *
za chybky se omlouvám, píšu a nečtu po sobě
candiess
Profil
gettext... nějak sem nepochytil jeho funkci, fakt není lepší si to udělat handmake.? Nebo, jako mužu zkusit ten gettext() ale mohl bys mě ním "provést"? jako nějak nechápu jeho funkce:
putenv('LC_ALL=de_DE');
setlocale(LC_ALL, 'de_DE');
bindtextdomain("myPHPApp", "./locale");
textdomain("myPHPApp");

prosím
snake.aas
Profil *
no problemo :)

gettext sám o sobě má 2 vady
- první, že musí být na serveru zapnutá podpora (viz. phpinfo())
- druhá, že na serveru musí být nainstalovány jazyky, do kterých budeš chtít mít aplikaci přeloženou

proto radši používám phpgettext který obojí odstraňuje (ale přináší do aplikace mírně vyšší režii, protože se jedná o php skripty)

základ je nastavení jazyka
putenv('LC_ALL=de_DE');
setlocale(LC_ALL, 'de_DE'); 
tímhle řekneš aplikaci, že se má přepnout do národního prostředí de_DE, tedy do němčiny

pak určíš, ke se nachází binární soubory s překladem
bindtextdomain("myPHPApp", "./locale");
textdomain("myPHPApp"); 
tímhle řekneš, že ve složce ./locale/<kód jazyka - např. cs_CZ>/LC_MESSAGES/ se nachází soubor myPHPApp.mo, který má použít jako překlad...

a samotné texty pak zobrazíš lehce
<a href='kontakt.php'><php echo _('Contact'); ?></a>


výhodou je, že pokud nemáš něco přeložené, zobrazí se to v původním tvaru

malý úvod by mohl poskytnout Interval jsou tam i další navazující články
candiess
Profil
takže na serveru je gettext povolený a zálkadní jazyky jako je: čeština, němčina, angličtina a slovenština tam budou ne.? :)

a skript by měl vypadat

if($_SESSION['lang']) {
$jazyk = $_SESSION['lang'];
} else {
$jazyk = "de_DE";
}

putenv('LC_ALL=$jazyk');
setlocale(LC_ALL, '$jazyk');

bindtextdomain("myPHPApp", "./locale");
textdomain("myPHPApp");

noo a pak už jen echo _('Contact');

ale stejnak sem z toho jelen, newím zdali je mi pomoci :)

jak vypadá ten binární soubors překlady, když mám wamp server (localhost) tak kde ho najít, nebo ho vytvořit..

vytvořil sem soubor v localhostu:
<?php
putenv('LC_ALL=de_DE');
setlocale(LC_ALL, 'de_DE');

bindtextdomain("myPHPApp", "./locale");
textdomain("myPHPApp");

echo _('Contact');

?>
a vypisuje mi to
,,Fatal error: Call to undefined function bindtextdomain() in C:\wamp\www\text.php on line 5"
snake.aas
Profil *
binární soubor s překlady se dá vytvořit pomocí PoEditu
na první pohled je to trochu složitý ten program, ale dá se na to zvyknout... vím, že na to byl tutoriál někde, ale za boha ho nemůžu najít...

ve zkratce vytvoříš katalog, nastavíš kde(cesta) a co(funkce - např. _() ) má hledat a ono ti to projede zdrojáky a ukáže všechny texty, ty si v tom přeložíš a po uložení vznikne ten *.mo soubor

a to že neexistuje bindtextdomain je divné, to by měla být součást gettextu...
candiess
Profil
už to fara, měl sem to zakomentovane v php.ini

dobrá, stáhnu si poedit a zkusím se sním naučit.. je to vaše poslední definitivní slovo, že je gettext lepší než moje $pole? :D ale zase se alejspoň něco naučím no.já jen že už tu mutaci mám skoro celou hotovou... dobrá no, děkuju moc za pomoc, vážím si takových lidí :))

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: