Autor Zpráva
majo80
Profil *
Potrebujem urobiť viacjazyčný web a chcel by som načítavať jednotlivé jazyky, resp. slová a vety čo sú na stránke, z externého súboru, nie z DB.Je niečo takéto možné? Môžete ma nasmerovať ako toto urobiť a aj ako to načítavať?
Joker
Profil
majo80:
Je niečo takéto možné?
Samozřejmě.
Moc nechápu na co konkrétně dotaz směřuje, záleží na návrhu aplikace, ale jinak databázi soubory nahradíte tak, že prostě komunikaci s databází změníte na komunikaci se soubory.
Teoreticky to při (správně udělaném) objektově orientovaném návrhu databáze může být i docela jednoduché.
majo80
Profil *
Celý web zatiaľ len vytváram a chcem ho mať vo viacerých jazykoch. Preto by som potreboval informácie ako načítavať z externého súboru jednotlivé vety do scriptov....
Joker
Profil
majo80:
To nevylučuje databázi.

Jestli to správně chápu, tématem je spíš „Jak na vícejazyčnou PHP aplikaci“, než „Načítání dat z databáze vs. ze souborů“?
(edit: Otazník na konci, má to být otázka)
Darker
Profil
Joker:
majo80:„z externého súboru, nie z DB
Asi DB nechce.

majo80:
Skus třeba simplexml.
Medvídek
Profil
majo80:
A co třeba přes pole?
$lang["homepage"]="Hlavní stránka";
$lang["logout"]="Odhlásit";

echo '<h1>'.$lang["homepage"].'</h1>';
Darker
Profil
Medvídek:
Dvě nevýhody:
Někde bude mít pole přes dvě stránky.
Ve funkcích nesmí zapomenout na global.
Joker
Profil
Já bych to asi tak jako tak zapouzdřil, ve strukturovaném programu do funkce, v objektovém do třídy.

V OOP mi pro to třída přijde dost vhodná, zejména když jazykové nastavení nejspíš bude mít další parametry (třeba obrázek vlaječky, kód jazyka, formát data a podobně)
Chro
Profil
majo80:
Soubor jazyky.txt:

ZELVA_OMLUVA||Promiňte, ale žádnou želvu tady nemáme.||Prepáčťe, ale žiadnu korytnačku tu nemáme.
ZELVA_POZADAVEK||Tak mi ji objednejte.||Tak mi ju objednajťe.


Možné provedení skriptu:
$jazyk = 'cs';
//nebo sk
$soubor = 'jazyky.txt';
if (file_exists($soubor))
{
if ($jazyk == 'cs')
{
$poradi_textu = 1;
}
else
{
$poradi_textu = 2;
}
$obsah = file($soubor);
foreach ($obsah as $radek)
{
$polozky = explode('||', $radek);
$id = trim($polozky[0]);
$text = trim($polozky[$poradi_textu]);
define($id, $text);
}
echo ZELVA_OMLUVA.' '.ZELVA_POZADAVEK;
}
Darker
Profil
Chro:
Ať žije přehlednost, ale takz řešení. Nicméně by ten tvůj skript měl cachovat, jinak otevře soubor pokaždé, když bude doplňovat potřebné slovo.
majo80
Profil *
Skôr by som bral to pole s tým, že každý jazyk by bol vo vlastnom externom súbore.

Darker:
Někde bude mít pole přes dvě stránky.
Ve funkcích nesmí zapomenout na global.

Ako je toto presne myslené?
Joker
Profil
Chro:
No tak přesně od toho existuje XML, případně CSV, plus standardní funkce na jejich zpracování, aby se tohle nemuselo dělat.

majo80:
Já bych tu úvahu začal asi takhle (když uvažuji OOP):
- Bude třída řekněme Language.
- Atributy podle potřeby aplikace.
- Metoda getText($idText) bude vracet řetězce.
- Konstruktor bude mít parametr kód jazyka

Použití by pak vypadalo nějak takhle:
$lang = new Language("cs");
echo("<h1>".$lang->getText("homepage_heading")."</h1>");

Uvnitř třídy Language by pak mohlo být jako private pole s jednotlivými texty. Naplnění textů by zařídil konstruktor na základě kódu jazyka.

Načítání jazyků už není až tak zásadní, jiný způsob načítání znamená jen jiný vnitřek konstruktoru třídy Language, všechno ostatní může zůstat.
Ale když dám nějakou ukázku, řekněme, že by byly soubory <kód jazyka>.lng (například cs.lng) a vymyslíme vhodné formátování dat- no jelikož to bude vlastně sada dvojic id-text, šel by využít "ini" formát.
Příklad- cs.lng:
; MojeAplikace 1.0, jazykový soubor pro češtinu
homepage_heading = "Vítejte na mé stránce"
hello_world = "Ahoj světe!"
V konstruktoru třídy Language by se pak data naplnila jedním voláním funkce parse-ini-file
majo80
Profil *
Presne niečo takéto by som potreboval. Len teraz neviem, ako mám pristupovať k jednotlivým súborom s preloženými textami. Dajme tomu, že pomocou PHP zistím, že užívateľ chce češtinu a do premennej $zvolenyjazyk sa uloží hodnota cs...
Aesir
Profil
A proč nepoužijete už existující knihovny? Gettext, Zend Translate, PEAR Translation, ...
majo80
Profil *
Aesir:
Tieto knižnice sú dosť obšírne a zložité. Ja potrebujem niečo jednoduché.

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

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