Lokalizace – PHP – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Lokalizace – PHP – Fórum – Programujte.comLokalizace – PHP – Fórum – Programujte.com

 

cheeester0
Stálý člen
6. 8. 2008   #1
-
0
-

Ahoj, chci se tady lidí na programujte.com zeptat jak by navrhli model vícejazyčného webu. Potřebuji tak 5 jazyků a zajímá mě jak se to v praxi provádí. Pokud možno čistý kod ne prasárnu. :smile1: Děkuji

Nahlásit jako SPAM
IP: 88.146.167.–
6. 8. 2008   #2
-
0
-

1. moznost - pole, treba

$lang["car"]["en"]="Auto"; // definice

echo $lang["car"][LANG]; // vyvolani


2. konstanty v includovanych souborech (stejne to jde i s temi poli)
v lang_cz.php


TXT_CAR="auto";


3. Gettext. ASi nejlepsi moznost. Preklady stringu z jednoho jayka do ostatnich si nadefinujes v externim datovem souboru (je na to externi editor) a zkompilujes. V PHP je pak vyvolavas jako
echo _("car");
Vyhoda je ze je to rychle a rychle se to pouziva (dokonce se na to da celkem jednoduse web prekonvertovat i kdyz je hotovy) a ze neprelozene stringy jsou zobrazene tak jak jsou, bez nejakych chyb (ty prekladane stringy mohou byt i cele vety, to neni problem, takze ty mas jeden zakladni jazyk v kodu a alternativy v datovem souboru). Nevyhodou je ze je to dost neobratne kdyz tam treba potrebujes pridat jeden string. Pogogli.

4. Tahat to z databaze. Ale to je fakt krkolomne a vice CPU narocne.

Nahlásit jako SPAM
IP: 213.220.192.–
Prosím, jestli potřebujete s něčím poradit,zeptejte se na fóru. Jakýkoliv bezdůvodný pokus mě kontaktovat skončí okamžitým přidáním do ignore listu![br][br] Současný počet osob, které to nepochopily: 7
Prog.0
Věrný člen
6. 8. 2008   #3
-
0
-

Dôležité je tiež uvažovať o tvare url adries pre rôzne jazyky. V žiadnom prípade neskúšaj riadiť jazyk pomocou cookies ani session premmenných. Každá jazyková verzia by mala byť dostupná pod samostatnou url a odosielať korektné hlavičky, inak ti google zožerie iba jednu verziu.

Ak používaš, alebo chceš používať nejaké pekné ("čitateľné") url, tak uvažuj aj o tom, že v každom jazyku može byť iný nie len riadiaci znak jazyka ale aj samotný základ adresy. Napríklad taká mozilla to nerieši a používa iba anglické názvy v url:

http://www.mozilla-europe.org/en/firefox/features/
http://www.mozilla-europe.org/sk/firefox/features/
http://www.mozilla-europe.org/cs/firefox/features/
...
http://www.mozilla-europe.org/firefox/features/

stránka bez riadiaceho znaku jazyka spôsobí redirect na url s jazykom podla jazykového nastavenia prehliadača...


Tiež sa často používa strčenie jazyka do subdomeny:

sk.domena.xyz/...
cs.domena.xyz/...
en.domena.xyz/...
www.domena.xyz/... bez informacie o jazyku, urobí redirect...


Neodporúčam používať viac domén najvyžšej úrovne, lebo stratíš možnosť prenášať cookies / sessions cez jednotlivé jazykové verzie.


Ja osobne by som použil asi ten subdomenový (en.domena...), alebo adresárový (domena/en/...) tvar a podľa veľkosti a typu webu, prípadne zložitosti, by som sa rozhodol, či by som prekladal aj url alebo ju nechal v jednom (asi v anglickom) jazyku. Modulom mod_rewrite by som si všetko dal presmerovať na jeden php controller a v ňom spracúval. Ako to ďalej riešiť vo vnútri php už spomenul CommanderZ. Len chcem dodať, že znova závisí od veľkosti a typu webu, či by som dáta odkladal v súboroch alebo databáze...

Nahlásit jako SPAM
IP: 213.160.186.–
Prog.
cheeester0
Stálý člen
6. 8. 2008   #4
-
0
-

pokud bych ale resil subbomenovy nebo adresarovy znamenalo by to ze bych mel pri 4 jazykovych mutacich 4x vytvoreny web? Coz mi prijde neprakticky kdyz chci neco upravit ze to musim delat presne ve 4 webecha to nemluvim o rozsahlejsich upravach. Nebo jak by s to resilo? Neco jako rikal CommanderZ?

Nahlásit jako SPAM
IP: 88.146.167.–
Santas0
Věrný člen
6. 8. 2008   #5
-
0
-

ked to mat takto:
web.tld/cs/nieco
web.tld/en/nieco
tak by sa to dalo pomocou .htaccess

Nahlásit jako SPAM
IP: 195.91.55.–
http://psandtner.sk/blog
cheeester0
Stálý člen
6. 8. 2008   #6
-
0
-

jiste presmerovani mi je jasne bud .htaccess nebo $_GET ci prevadet na $_SESSION ale kam? budu se presmerovavat rekneme do adresare cs, en, ... kde bude cekat webova jazykova mutace? Cili duplicitni web ktery jen textove vystupy bude mit v danem jazyce?

Nahlásit jako SPAM
IP: 88.146.167.–
survik1
~ Moderátor
0
Posthunter
6. 8. 2008   #7
-
0
-

Já si kdysi udělal jednu malou funkci. Je poměrně nedokonalá, ale nic lepšího předat nemůžu.

Jazyková verze se uchovává v SESSIONS. Funkce change_language_set(string $lang) mění hodnotu. Je důležité testovat, zda-li jazyková verze opravdu existuje, aby nedocházelo k problémům. Dá se testovat dynamicky výpisem složky s jazykovými verzemi, ale pro moje účely to bylo zbytečné.



<?
function change_language_set ($new_language)
{
unset($_SESSION['language']);
if ($new_language == "czech") $_SESSION['language'] = 'cs';
elseif ($new_language == "english") $_SESSION['language'] = 'us';
elseif ($new_language == "russia") $_SESSION['language'] = 'ru';
elseif ($new_language == "deutsch") $_SESSION['language'] = 'de';
else $_SESSION['language'] = 'cs';
}
?>

Jak jsem řekl, je to starý kód. Lepší by bylo použití switch.

Samotná funkce je poměrně neohrabaná, ale funkční.
//string files

if (!empty($_SESSION['language'])) $GLOBALS['soubor'] = file("include/string/string_".$_SESSION['language'].".txt");
else $GLOBALS['soubor'] = file("include/string/string_cs.txt");
//function - parameters: number of string, file, the czech text
function string($c,$soubor,$t)
{
include "include/string/preference.txt";

if ($c < 10) $cislo = '00';
elseif ($c < 100) $cislo = '0';
$string = 'STRING_'.$cislo.$c;
for ($i = 0;$i != $max_string;$i++)
{
//comments and empty rows
$arr = str_split($soubor[$i]);
if (($arr[0] == ";") OR ($arr[0] == "#") OR ($arr[0] == " ")) continue;
//searching the string
list ($number, $not_need) = explode(' ',$soubor[$i]);
if ($number == $string)
{
$text = $soubor[$i];
break;
}
}
//exploding and tooking the text without symbols
$text1 = $text;
list($not_need, $text) = explode($string, $text);
list($navrat, $not_need) = explode(';', $text);
if (empty($navrat)) $navrat = 'Text error in '.$string;
return $navrat;
}
?>


Samotný jazykový soubor může vypadat nějak takto


STRING_001 Main page; #úvodní stránka
STRING_002 Stats; #statistiky
STRING_003 Buildings; #budovy
STRING_004 Grant; #dotace
STRING_005 Attack; #útok
STRING_006 Command; #velení
STRING_007 Post; #pošta
STRING_008 List of players; #žebříček
STRING_009 Options; #nastavení
STRING_010 Logout; #odhlásit

Nahlásit jako SPAM
IP: 89.103.139.–
Život je jen hra, která se nedá vyhrát.
bukaj0
Věrný člen
6. 8. 2008   #8
-
0
-

cheeesterb
budu se presmerovavat rekneme do adresare cs, en, … kde bude cekat webova jazykova mutace? Cili duplicitni web ktery jen textove vystupy bude mit v danem jazyce?
Myslím, že tím přesměrováním Santas myslel něco jiného. Kopii webu budeš mít jenom jednu, např. v rootu, a pokud někdo bude chtít přistupovat na nějakou jazykovou mutaci, využiješ kupř. Apachí mod_rewrite a podstrčíš stránku z rootu, které přidáš parametr určující jazykovou verzi, např. lang. Takže když bude požadavek na /cs/nejaka-stranka, bude to to samé jako požadavek na /nejaka-stranka?lang=cs. (A samozřejmě by bylo dobré, kdyby když někdo zadá přímo /nejaka-stranka?lang=cs, aby ho to přesměrovalo /cs/nejaka-stranka (se stavovým kódem 301), jelikož pak, kdyby někdo na adresu s parametrem lang hodil odkaz, chytly by se toho vyhledávače a už tu máme duplicitní obsah na dvou adresách – /cs/nejaka-stranka a /nejaka-stranka?lang=cs.)

Pak tu samozřejmě nastává problém, o čemž se zmiňoval Prog., jestli když někdo zadá /en/nejaka-stranka, jestli mu jenom podstrčit /nejaka-stranka?lang=en, či ho přesměrovat na /en/some-page (které by se pak samozřejmě podstrčila /some-page?lang=en).

survik1
Já si kdysi udělal jednu malou funkci.
…aneb znovu vynalézáme kolo :o) Tohle by měl gettext zvládnout mnohem lépe, jednodušeji a rychleji.

Nahlásit jako SPAM
IP: 85.70.13.–
Jak se správně ptát? -> http://www.hash.cz/inferno/otazky.html[br][br] Po programování je člověk hladovej.
zaachi0
Newbie
6. 8. 2008   #9
-
0
-

2survik: proc zbytecne tak slozite pri kazdem nacteni stranky parsovat textovy soubor, kdyz muzes mit pole a soubor includovat.
Popripade muzes mit v jednom poli i vsechny jazykove mutace a jenom posle prefixu indexů klíčů (například) rozlisis pouzivane retezce.

Nahlásit jako SPAM
IP: 88.146.210.–
Tocimanko0
Grafoman
6. 8. 2008   #10
-
0
-

SESSION je IMHO najhoršie riešenie, aké by mohlo byť použité. Crawleri nedokážu pracovať so session. Keď nie sú informácie o jazyku uložené v URL, crawler (nehovorím len o google) proste nezistí, že existuje viac jazykových mutácií. Vlastná skúsenosť.

Nahlásit jako SPAM
IP: 195.91.84.–
cheeester0
Stálý člen
6. 8. 2008   #11
-
0
-

takze url cz/nejaka-stranka/ chapu a jeji overeni jaka lokace v $_GET lezi chapu take. Ted bych tedy potreboval nejak ucelit samotny vystup na strance pro ruzne mutace. At uz zminovane pole nebo externi soubor. Myslim ze pole bude ale rychlejsi. Rekneme aby byl samotny textovy vystup oddeleny od kodu. Je potreba pocitat i s prelozenim vet typu: Prihlaseni se nezdarilo ...

Ma nekdo nejaky model ktery by byl rychly a spolehlivy?

Nahlásit jako SPAM
IP: 88.146.167.–
bukaj0
Věrný člen
6. 8. 2008   #12
-
0
-

cheeester
Ma nekdo nejaky model ktery by byl rychly a spolehlivy?
Úplně nejjednodušší řešení, které je prakticky tototžné s gettextem, akorát zcela v PHP (takže nejspíš bude pomalejší, než samotný gettext, ale nepotřebuje zase, aby byl na hostingu nainstalován):

<?php

function __($text, $new_translations = null) // fce _() je už zabraná gettextem :o/
{
static $translations = array();

if (is_null($text) && !is_null($new_translations)) {
$translations = $new_translations;
}

if (array_key_exists($text, $translations)) {
return $translations[$text];
}

return $text;
}

Když ti přijde požadavek, tak jednoduše do funkce „propašuješ“ překlady:
if (in_array($_GET['lang'], array('en', 'cs', 'de', 'sp'))) {

__(null, require $_GET['lang'] . '.php');
}

Řekněme, že nás bude zajímat česká lokalizace (v proměnné $_GET['lang'] je řetězec 'cs'), takže soubor bude cs.php a může vypadat následovně:
<?php

return array(
'hello, world!' => 'ahoj, světe!',
'OK' => 'Budiž'
);

A teď už akorát získáváme, co potřebujeme:
echo __("hello, world!"); // ahoj, světe!

echo __("OK"); // Budiž

Nahlásit jako SPAM
IP: 85.70.13.–
Jak se správně ptát? -> http://www.hash.cz/inferno/otazky.html[br][br] Po programování je člověk hladovej.
cheeester0
Stálý člen
6. 8. 2008   #13
-
0
-

to vypada velice slibne a pomerne i prehledne a lehce editovatelne v kodu. jen se chi zeptat kam presne umistim

if (in_array($_GET['lang'], array('en', 'cs', 'de', 'sp'))) {


__(null, require $_GET['lang'] . '.php');

}


primo do rootu aplikace? jinak moc diky za pomoc je to good :smile1:

Nahlásit jako SPAM
IP: 88.146.167.–
bukaj0
Věrný člen
6. 8. 2008   #14
-
0
-

cheeester
jen se chi zeptat kam presne umistim ... primo do rootu aplikace?
Musí to být v každém skriptu, na který mohou přijít požadavky a budou se v něm užívat překlady. Samozřejmě to stačí načítat pouze jednou. Takže např. pokud budeš všem požadavkům podstrkávat index.php, mělo by to být někde na jeho začátku.

Nahlásit jako SPAM
IP: 85.70.13.–
Jak se správně ptát? -> http://www.hash.cz/inferno/otazky.html[br][br] Po programování je člověk hladovej.
hrach
~ Redaktor
+1
Boss
7. 8. 2008   #15
-
0
-

osobně bych určitě řešil pomocí gettextu. Pokud opravdu nejde o mini projekt, za chvíli narazíš na problémy jako je množné číslo, udržování překladů apod. Gettext toto už má vymyšlené....

Nahlásit jako SPAM
IP: 193.179.169.–
http://jan.skrasek.com@hrachcz – webdeveloper
cheeester0
Stálý člen
7. 8. 2008   #16
-
0
-

a jak se s gettext pracuje nebo jak by to s gettextem vypadalo?

Nahlásit jako SPAM
IP: 88.146.167.–
cheeester0
Stálý člen
7. 8. 2008   #17
-
0
-

jeste se potykam s problemem jak predavat $_GET['lang']? Musim kazdy odkaz predavat s lang?

<a herf="index?lang=$_GET['lang']&stranka=moje_stranka">


nastava problem ve formularich kde bych musel predavt lang ve formulari v nejakem hidden inputu a posilat jej postem coz mi neprijde zrovnajako reseni

Nahlásit jako SPAM
IP: 88.146.167.–
Tocimanko0
Grafoman
7. 8. 2008   #18
-
0
-

To cheeester :

<form action="xyz.php?lang=cz">

Ano, musíš mať informáciu o jazyku v GET parametroch.

Nahlásit jako SPAM
IP: 195.91.84.–
bukaj0
Věrný člen
7. 8. 2008   #19
-
0
-

cheeester
a jak se s gettext pracuje nebo jak by to s gettextem vypadalo?
Viz manuál[1]. Projdi si příklady, které jsou k jeho funkcím.

jeste se potykam s problemem jak predavat $_GET['lang']? Musim kazdy okdaz predavat s lang?
Nemusíš. Ale nevím, jak by ses pak na odkazovaných stránkách chtěl dozvědět, jaký jazyk zvolit :o)

Samozřejmě je monžné si udělat nějaký „helper“, který se ti postará o to, aby v adrese parametr lang byl.

nastava problem ve formularich kde bych musel predavt lang ve formulari v nejakem hidden inputu a posilat jej posem coz mi neprijde zrovnajako reseni
Pro formulář posílaný metodou post stačí akorát, když lang přidáš do parametru action. Pokud posíláš metodou get, všechno za otazníkem z action se vymaže a naplní daty z formuláře, takže tady asi bude nutné tam nějaký hidden dát.

[1] http://php.net/gettext

Nahlásit jako SPAM
IP: 85.70.13.–
Jak se správně ptát? -> http://www.hash.cz/inferno/otazky.html[br][br] Po programování je člověk hladovej.
Prog.0
Věrný člen
7. 8. 2008   #20
-
0
-

To cheeester :

k dispozicii máš niekoľko možností:

www.frima.com/stranka.html?lang=en

www.frima.com/stranka.html?lang=cs
www.frima.com/stranka.html?lang=sk

www.frima.com/en/stranka.html
www.frima.com/cs/stranka.html
www.frima.com/sk/stranka.html

en.frima.com/stranka.html
cs.frima.com/stranka.html
sk.frima.com/stranka.html


...prečo si si vybral práve tú s metódou get ???

Nahlásit jako SPAM
IP: 213.160.186.–
Prog.
cheeester0
Stálý člen
7. 8. 2008   #21
-
0
-

ten 'helper' by bylo asi tak co? rikam si ze proste udelam to ze co bude v $_GET['lang'] bude automatickz take $_SESSION['lang'] a pak nemusim vsude posilat jaky je zvolen jazyk ale musim to nejak z toho dostat zpet do adresy

Nahlásit jako SPAM
IP: 88.146.167.–
cheeester0
Stálý člen
7. 8. 2008   #22
-
0
-

nevim jak by to pracovaloi na subdomene a jak bych z adresy ziskal informaci jaky ze jazyk je zvolen?

Nahlásit jako SPAM
IP: 88.146.167.–
cheeester0
Stálý člen
7. 8. 2008   #23
-
0
-

To bukaj : a na odkazu gettext na php.net nic nepisi

Nahlásit jako SPAM
IP: 88.146.167.–
Prog.0
Věrný člen
7. 8. 2008   #24
-
0
-

To cheeester :

Jazyk na subdoméne

Nastavenie apache:
virtual host:

<VirtualHost ip:80>

ServerName domena.com
ServerAlias *.domena.com
DocumentRoot /cesta/k/docroot/
</VirtualHost>

v každom php ako prvý naincluduj nejaky language_controller.php
<?php


$server_name = 'domena.com';
$languages = array('en','cs','sk');

$first_dot = strpos($_SERVER['SERVER_NAME'],'.');
$language = substr($_SERVER['SERVER_NAME'],$first_dot);

if (!in_array($language,$languages))
{
$language = 'en';
// todo: skus pouzit jazyk z nastavenia browsera
}

if ($language.'.'.$server_name!==$_SERVER['SERVER_NAME'])
{
header("HTTP/1.1 303 See Other");
header('Location: http://'.$language.'.'.$server_name . $_SERVER['REQUEST_URI']);
exit();
}

echo 'jazyk: ['. $language .']';

?>



...a ešte lepšie by bolo pomocou mod_rewrite všetky requesty smerovať na jeden php súbor a v ňom spracúvať zvyšok

Ak sa chystáš používať https, tak použi radšej adresáre

Nahlásit jako SPAM
IP: 213.160.186.–
Prog.
bukaj0
Věrný člen
7. 8. 2008   #25
-
0
-

cheeester
ten 'helper' by bylo asi tak co?
Normální funkce, která by ti jednoduše sestavila adresu. Řekněme, že tedy budeš k určování stránky používat ten parametr stranka a jazyka parametr lang, pro jednoduchost řekněme, že na začátku skriptu si nadefinuješ konstantu LANG (define('LANG', $_GET['lang']);). Takový sestavovač adresy by pak mohl vypadat následovně:

function url($stranka, $params)

{
return '?' . http_build_query(array_merge(array(
'lang' => LANG,
'stranka' => $stranka
), $params
), '', '&amp;'
);
}

Pak řekněme, že se chceš odkázat na stránku foo a chceš jí předat parametr bar = baz:
<a href="<?php echo url('foo', array('bar' => 'baz')); ?>">foo</a>

==
<a href="?lang=cs&amp;stranka=foo&amp;bar=baz">foo</a>

Manuál:
http_build_query() – http://php.net/http_build_query
array_merge() – http://php.net/array_merge

rikam si ze proste udelam to ze co bude v $_GET['lang'] bude automatickz take $_SESSION['lang'] a pak nemusim vsude posilat jaky je zvolen jazyk ale musim to nejak z toho dostat zpet do adresy
Nečetl jsi, co tu již někteří psali, že takhle rozhodně ne, protože ti pak vyhledávač bude indexovat jenom jednu verzi?

a na odkazu gettext na php.net nic nepisi
To jsi takové pako, že nedokážeš proklikat odkazy, co tam jsou? :o)

nevim jak by to pracovaloi na subdomene a jak bych z adresy ziskal informaci jaky ze jazyk je zvolen?
Buď při přepisování jde přidat nějaký parametr, nebo v HTTP hlavičce Host (přístupná v PHP přes $_SERVER['HTTP_HOST']) by měla být celá doména, včetně všech subdomén, alespoň myslím.

Nahlásit jako SPAM
IP: 85.70.13.–
Jak se správně ptát? -> http://www.hash.cz/inferno/otazky.html[br][br] Po programování je člověk hladovej.
cheeester0
Stálý člen
7. 8. 2008   #26
-
0
-

To Prog. : Diky to vypada slusne. co myslis tim zkus pouzit jazyk z browsera?

Pokud se pak na strance okazuji musim i se subdomenou nebo staci jen na domenu a subdomna se presmeruje. POkud uzivatel navsevuje web poprve tak jeste nevime jakou lakalizaci chce a mela by se nastavit nejaka vychozi


jo uz to vidim $language = 'en';

Nahlásit jako SPAM
IP: 88.146.167.–
cheeester0
Stálý člen
7. 8. 2008   #27
-
0
-

To Prog. : jak pak jeste bude vypadat .htaccess. Bude muset byt specialne pravidla prokazdy okdaz na kazdou stranku dale lokalizace kdyz chci delat pekne url?



RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^kategorie/([^/]+)/([0-9]{1,3})?/?$ ?kategorie=$1&page=$2 [L]


Nahlásit jako SPAM
IP: 88.146.167.–
Prog.0
Věrný člen
7. 8. 2008   #28
-
0
-

$language = 'en';
// todo: skus pouzit jazyk z nastavenia browsera

Myslel som tým to, že namiesto toho $language='en' skús zistiť jazykové nastavenie browsera (z $_SERVER['HTTP_ACCEPT_LANGUAGE']) a podľa toho rozhodnúť o jazyku,...

Ako na stránku linkovať? Ak bude link na slovenskej stránke tak asi rovno na slovenskú verziu... z českej na českú...
Pre tých čo na linky klikajú by zasa bolo výhodné linkovať na verziu bez určenia jazyka (použiť napr. www). Potom by ich to automaticky presmerovalo na ich jazyk... Nevýhodou by zas bolo asi nerovnomerné rozloženie pageranku, google by videl linkovanie iba na jeho jazykovú verziu.
Vo výsledku to bude asi jedno, aj tak ľudia budú linkovať, ako im príde.
Hlavne nezabudni prelinkovať jednotlivé jazykové verzie medzi sebou, tak by sa mal ten pagerank rovnomernejšie rozložiť.

Link na aktuálnu stránku v jazyku $language bude vyzerať asi takto:
echo '<a href="http://'.$language.'.'.$server_name . $_SERVER['REQUEST_URI'].'">'.$language.'</a>';

Nezabudni na hlavičky:
<?php

..
Header('Content-Language: '.$language);
...

?><html lang="<?php echo $language ?>" ...>
<head>
...
<meta http-equiv="Content-Language" content="<?php echo $language ?>" />
...


V rámci stránky používaj iba relatívne adresy a máš po probléme - do linkov nemusíš vkladať žiadnu informáciu o jazyku.

tie rewrite ruly nemajú nič spoločné s doménou, takže nemáš tam čo meniť.

ale odporúčam ti sa na ne vykašlať a použi iba jedno:
RewriteEngine On

RewriteRule ^(.*)(\.html|\.htm/)$|^$ controller.php [L,QSA]
O všetky requesty končiace lomítkom alebo .htm(l) sa ti postará jeden script. Požadovanú url adresu uvidíš v $_SERVER['REDIRECT_URL'] a jednoducho si ju spracuješ phpčkom, čo mňe prijíde omnoho jednoduchšie...

Nahlásit jako SPAM
IP: 213.160.186.–
Prog.
cheeester0
Stálý člen
8. 8. 2008   #29
-
0
-

ted nechapu jako to resis v tom controller.php delam to kalsicky pres .htaccess. V controller.php mas co?

Jiank diky za radu s lokalizaci konecen vidim nejake prakticke reseni ktere neni "prasacke" a je jednoduse riditelne. Vazne diky

Nahlásit jako SPAM
IP: 88.146.167.–
Prog.0
Věrný člen
8. 8. 2008   #30
-
0
-

controller jednoducho dostane všetky requesty. Ako sa budú ďalej spracúvať sa rozhodne v php kóde. Funguje to rovnako ako keď použiješ

RewriteRule ^kategorie/([^/]+)/([0-9]{1,3})?/?$ ?kategorie=$1&page=$2 [L]
s tým rozdielom, že na controller.php sa presmerujú všetky requesty. Nepotrebuješ používať žiadne ?=$.. pretože pôvodnú url aj tak z php uvidíš a takto si aspoň neprepíšeš prípadné GET premmenné

Dosť ma tento problém zaujal, tak som zbúchal náčrt takého "mini frameworku", pre prácu s viacerými jazykmi. Na určenie jazyka podporuje aj sub-domény, aj adresáre.

všetky súbory stačí rozbaliť do docroot adresára s nastaveniami, ktoré už boli vyžšie spomenuté.

readme.txt

Štruktúra súborov
--------------------------------------------------------------------------------
|- .conf/
| |- cfg.language.php -- nastavenie subdomeny/adresare na určenie jazyka
|
|- .inc/
| |- ctl.language_and_url.php -- nastavuje jazyk a kontroluje url
| |- fns.locale.php -- funkcie na čítanie lokalizovaných reťazcov
| |- fns.path.php -- pomocné funkcie na prácu s cestami
|
|- _inc/ -- ukladá časti stránok, ktoré sa includujú (napr menu)
|- content/ -- obsah web server
|- data/ -- css, obrazky, ...
|- locale/ -- ukladá lokalizácie
|- controller.php -- skript, prijímajúci všetky requesty


Princíp:
------------
1. request => spusti sa controller.php
2. controler spusti ctl.language_and_url.php - zanalyzuje url, nastavy jazyk,
pripadne prerobi url a urboi redirect
3. naincluduje sa a vykona subor content/ [pozadovana_cesta] .php


Funkcie na lokalizaciu:
----------------------

l($vyraz,[$lang=default])

vrati preklad výrazu v požadovanom jazyku
ak nie je zadaný $lang -- použije sa aktuálny jazyk


l_e(),l_s(),l_es()

odvolavaju sa na l() vid: fns.locale.php


prekladany výraz sa sklada z dvoch častí:

l('kniznica:label');

ak je kniznica vynechaná, použije sa aktuálna knižnica:

l('label')

aktuálna knižnica je shodná s aktuálnou cestou, lepšie vysvetlenie
bude na príklade

knižnica sa môže zadávať relatívne: l('./ina/knižnica:label')
aj absolútne l('/kniznica/:label');

knižnice sú umiestnené takto: locale/ [jazyk] [/knižnica].locale.php


l_url($cesta, [$lang=default])

vytvorí url na danú cestu v požadovanom jazyku
- akceptuje relatívne aj absolútne cesty
- pre nastavenie url na aktualny súbor v inom jazyku:

l_url('',[jazyk])



-------------------------------------------------------------------------------
...ehm, radšej vysvetlím na príklade:


Request bude smerovaný na:

www.domena.com/[jazyk]/toto/je/stranka.html (pre adresárovú verziu)
(alebo)
[jazyk].domena.com/toto/je/stranka.html (pre subdoménovú verziu)

ako [pozadovana_cesta] sa chápe /toto/je/stranka.html,
takže sa spusti script

/content/toto/je/stranka.html.php

[aktuálna knižnica] sa nahra zo suboru:

/locale/[jazyk]/toto/je/stranka.html.locale.php

ak by request smeroval na adresár:

www.domena.com/[jazyk]/toto/je/adresar/ (pre adresárovú verziu)
(alebo)
[jazyk].domena.com/toto/je/adresar/ (pre subdoménovú verziu)

ako [pozadovana_cesta] sa chápe /toot/je/adresar/index.html

spusti sa script:

/content/toot/je/adresar/index.html.php

aktuálna knižnica] sa nahra zo suboru:

/locale/[jazyk]/toot/je/adresar/index.html.locale.php


-----
Myslím že tých zdrojákov nie je až tak veľa, že by sa nedali pochopiť...

v prípade otázok progman@centrum.sk, ale väčšinou za odpoveď neručím...


..v prípade otázok tu do fóra

edit: Našiel som bug, .htaccess v adresári locale/ sa chápe ako jazyk

./inc/ctl.language_and_url.php, riadok 36: doplniť:
if ($lng && $lng!=='.' && $lng!=='..' && $lng[0]!=='.')

Nahlásit jako SPAM
IP: 213.160.186.–
Prog.
cheeester0
Stálý člen
9. 8. 2008   #31
-
0
-

nevypada to vubec zle jen se mi to nedari spustit. spoustim localhost/content/index.html.php ale pisem mi to chybu hned na prvnim radku.

<?php include './_inc/page/start.php'; ?>

cesta neexistuje pokud tedy napisi spravnou cestu tak uz to jede ale zase to hodi dalsi chybu. Tobe to jede v pohode? Nevim jestli to nedela apache na localhostu

Nahlásit jako SPAM
IP: 88.146.167.–
Prog.0
Věrný člen
9. 8. 2008   #32
-
0
-

Ja to mám tiež na localhoste, teraz dokonca na windowse, a ide to...

Ak to chceš skúsiť takto, tak v .conf/cfg.language.php nastav $lang_setting_in_subdomain = false; - nastavíš tak, adresárovú verziu a zadaj url http://localhost/ malo by to spraviť redirect na http://localhost/en/ Nemám to otestované, no malo by to bežať aj takto.

Ak si to chceš ale poriadne otestovať - aj subdoménové nastavovanie jazyka - potrebuješ si "navirtualizovať" doménu...

1. na apache vytvor virtual host ktorý bude prijímať všetky requesty na (hocičo).multilang.com:

<VirtualHost *:80>

ServerName multilang.com
ServerAlias *.multilang.com
DocumentRoot /cesta/kam/si/uložíš/projekt/
</VirtualHost>

<Directory "/cesta/kam/si/uložíš/projekt/">
Options FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
</Directory>

2.1 do /cesta/kam/si/uložíš/projekt/ nakopíruj súbory
2.2 môžeš opraviť bug, ktorý som našiel v ctl.language_and_url.php na riadku 36 - doplň do podmienky && $lng[0]!=='.'
2.3 môžeš vymazať súbor .inc/.Untitled-1.marks -- je to bordel ktorý som si všimol len teraz - nechal to tam môj editor keď padol.

3. nadefinuj na svojom počítači preklad domény www.multilang.com na lokálnu adresu:
3.1. Nájdi súbor hosts
vo windowse: C:\WINDOWS\system32\drivers\etc\hosts
v linuxe: /etc/hosts

3.2. doplň do neho riadok:
127.0.0.1    multilang.com www.multilang.com cs.multilang.com sk.multilang.com en.multilang.com 
Po uložení súboru by mal tvoj pc prekladať danú doménu na ip 127.0.01 - overiť to môžeš napr programom ping:
ping cs.multilang.com


4. Naťukaj do prehliadača www.multilang.com a malo by to bežať.


spoustim localhost/content/index.html.php ale pisem mi to chybu

Neošetril som existujuce cesty, ak zadáš do url cestu do adresára, alebo k nejakému súboru, ktorý fyzicky existuje, vyhodí to chybu (forbidden). Ak by si zadal iba http://localhost/ a v .conf/cfg.language.php nastavil $lang_setting_in_subdomain = false; - asi by to potom šlo. Pri subdoménovom móde je potrebné aby doména obsahovala aspoň jednu bodku (napr: localhost.localdomain), inak to naozaj bude vyhadzovať chybu na ktorú som nemyslel.

Do prehliadača ale nezadávaj cestu /content/index.html.php. To je vnútorná cesta, pod ktorou je script uložený. Ten sa naincluduje v súbore controller.php na 18 riadku. Zadaním akejkoľvek url sa spustí práve controller.php a ten si prečíta požadovanú cestu a naincluduje potrebný súbor.

Zadaj len niektorú z týchto ciest (je tam preddefinovaný - narýchlo zbúchaný príklad):

www.multilang.com/
www.multilang.com/my_projects/
www.multilang.com/my_projects/my_first_project.html
www.multilang.com/my_projects/my_other_project.html
www.multilang.com/about_me.html

Nahlásit jako SPAM
IP: 87.244.219.–
Prog.
cheeester0
Stálý člen
10. 8. 2008   #33
-
0
-

1. na apache vytvor virtual host ktorý bude prijímať všetky requesty na (hocičo).multilang.com:

kde soubor pro editaci naleznu?

3.2. doplň do neho riadok:

nedari se mi soubor po editaci ulozit viz prihloha

Nahlásit jako SPAM
IP: 88.146.167.–
Tocimanko0
Grafoman
10. 8. 2008   #34
-
0
-

To cheeester : 1. Myslím, že myslel httpd.conf ... Je tak?

Nahlásit jako SPAM
IP: 195.91.84.–
cheeester0
Stálý člen
10. 8. 2008   #35
-
0
-

jj tak soubor mam ale stale mi nejde ulozit ten druhy.

Nahlásit jako SPAM
IP: 88.146.167.–
Prog.0
Věrný člen
10. 8. 2008   #36
-
0
-

To cheeester : Máš vo windowse práva na zápis do toho súboru? Si prihlásený ako administrátor?

Nahlásit jako SPAM
IP: 87.244.219.–
Prog.
cheeester0
Stálý člen
13. 8. 2008   #37
-
0
-

jj. chci se jeste zeptat jak by se tedy resila ta lokalizace pomoci subdomen jak nastavim pak v .htaccess hezke url? nejspise subdomena zapisu

RewriteEngine On

RewriteBase /


RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^kategorie/([^/]+)/([0-9]{1,3})?/?$ ?kategorie=$1&page=$2 [L]


vliv nema a jen meni cast za domenou ze?

Nahlásit jako SPAM
IP: 88.146.167.–
Prog.0
Věrný člen
13. 8. 2008   #38
-
0
-

Nie, tie pravidlá nie sú na subdoméne závislé.

Nahlásit jako SPAM
IP: 87.244.219.–
Prog.
Bengo0
Stálý člen
19. 8. 2008   #39
-
0
-

caute lidi, hledam nejaky nejjednodussi zpusob jak na dvou jazycny web, neslo by to nejak prez databazi ? ja bych to chtel at se to da rychle aditovat .. dikes

Nahlásit jako SPAM
IP: 76.3.91.–
19. 8. 2008   #40
-
0
-

Nejednodussi je to pres konstanty nebo pole. Priklad najdes hned ve druhem prispevku v tomhle threadu. A priste se prosimte obtezuj precist alespon to vlakno, kam prispivas s nejakym dotazem. Pouzivani nejake formy vyhledavani radsi ani nenavrhuju.

Databaze neni na tohle uplne prakticka.

Nahlásit jako SPAM
IP: 78.102.164.–
Prosím, jestli potřebujete s něčím poradit,zeptejte se na fóru. Jakýkoliv bezdůvodný pokus mě kontaktovat skončí okamžitým přidáním do ignore listu![br][br] Současný počet osob, které to nepochopily: 7
Bengo0
Stálý člen
20. 8. 2008   #41
-
0
-

jj ja si to prave cetl a nevim co vybrat .. gettext se mi zda moc slozity .. jinak diky

Nahlásit jako SPAM
IP: 76.3.91.–
20. 8. 2008   #42
-
0
-

Tak nad tim mas dve dalsi naprosto trivialni moznosti, ktere jsou pro mensi projekty naprosto dostacujici. Na maly projekt je gettext rekl bych skoro overkill.

Nahlásit jako SPAM
IP: 78.102.164.–
Prosím, jestli potřebujete s něčím poradit,zeptejte se na fóru. Jakýkoliv bezdůvodný pokus mě kontaktovat skončí okamžitým přidáním do ignore listu![br][br] Současný počet osob, které to nepochopily: 7
Bengo0
Stálý člen
25. 8. 2008   #43
-
0
-

:smile5: ok, a slo by to nejak dohromady ? Ja bych potreboval treba nazvy obrazku, clanky atd davat do databaze ve dvou jazycich. Slo by to ?

Nahlásit jako SPAM
IP: 76.3.91.–
Tocimanko0
Grafoman
25. 8. 2008   #44
-
0
-

To Bengo : No jistě :))

Nahlásit jako SPAM
IP: 195.91.81.–
Kudykam
~ Anonymní uživatel
2 příspěvky
10. 10. 2008   #45
-
0
-

Ahoj, mám dotaz ke stejnému tématu. Mám hotový web ve flashi, který čte všechen text z externího XML souboru. (ten web sem nedelal ja), potřeboval bych jej zeditovat tak aby šlo pomocí tlačítek změnit jazyky. Tedy měl bych víc XML každý v ruzne jazykove verzi a ty by se načítali podle toho jaké tlačítko by se zmáčklo v te flashove animaci (webu). Zní to docela jednoduše, ale nevím jak to provést. Pomohl by mi prosím někdo?

Nahlásit jako SPAM
IP: 194.213.42.–
ETNyx0
Newbie
26. 10. 2008   #46
-
0
-

To Prog. : Hledám něco na tento způsob, jen sem se chtěl ujistit jestli tento system nebude mít nějaký ten problém s vyhledávačí, doteďka jsem tvořil jen v češtině takže s tímto nemám zkušenosti, díky za odpověď.

Nahlásit jako SPAM
IP: 193.179.141.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 2 hosté

Podobná vlákna

Lokalizace programu — založil paashi

Lokalizace comboboxu — založil marpit

Lokalizace programu — založil paashi

Lokalizace data — založil Vitek

Lokalizace WCF — založil Jan Grygerek

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý