PHP nyelvválasztó


Egyszer mindenki elérkezik odáig, hogy több nyelvű honlapot kell készítenie. Ilyenkor jön a nagy kérdés, hogy adatbázissal csináljuk-e meg avagy sem. Ez a kérdés merült fel bennem is. Utánajártam kicsit a dolgoknak és sok helyen azt olvastam, hogy az adatbázisos megoldás eléggé macerás lehet.

A leginkább bővíthetőbb és legszebb megoldás amikor egy ini fájlban letároljuk a szavakat és utána azt dolgoztatjuk fel php-val. A kódunk is sokkal áttekinthetőbb lesz és nagyon gyorsan meg lehet csinálni.

Egy szabályos ini fájlnak így kell kinéznie :

1
2
3
Hungary = "Magyar"
English = "Angol"
About_Us = "Rólunk"

A mi fájlunk neve legyen hu.ini az egyszerűség kedvéért. Érdemes az ilyen nyelvi fájlokat külön mappában is tárolni a jó elkülöníthetőség végett.

A feldolgozó PHP jelen esetben így néz ki:

1
2
$nyelv = "hu";
$lang = parse_ini_file($nyelv.".ini");

A PHP fájl-t kell beillesztened a kódod elejére és egy asszociatív tömb formájában kapod vissza az értéket. Például a:

1
 $lang["Hungary"];

azt adja vissza, hogy Magyar .

A nyelv kiválasztásához pedig alkalmazzuk a következő kódot:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if (isset($_GET['lng']) && !empty($_GET['lng']))
{
	$nyelv = $_GET['lng'];
	$lang = parse_ini_file("lang/".$nyelv.".ini");
	echo '<div id="lang">
			<p><a href="?lng=hu">'.$lang['Hungary'].'</a> | <a href="?lng=en">'.$lang['English'].'</a></p>
		</div>';
}
else
{
	$nyelv = "hu";
	$lang = parse_ini_file("lang/".$nyelv.".ini");
	echo '<div id="lang">
			<p><a href="?lng=hu">'.$lang['Hungary'].'</a> | <a href="?lng=en">'.$lang['English'].'</a></p>
		</div>';
}

Mint látjátok az elágazásban szereplő blokk első két sora az ini fájl meghatározása és meghívása kicsit kibővítve. A két link pedig a két nyelv. Természetesen ezt lehet még bővíteni tetszés szerinti nyelvekkel. Ezzel készen is vagyunk. Sok sikert a használatához.

Kapcsolódó bejegyzések:
  • Az első kérdés, ami felmerül majdnem mindenkiben, hogy lehet egy többnyelvű honlapot megcsinálni, amin váltani lehet a nyelvek között. Vegyünk egy példát, van eg …

  • A cikk előzményeként olvasd el ezt a 2 leírást (php switch get I. és php switch get II.). A fórumon felvetődött a kérdés: hogy lehetne megoldani a nyelvválasztás …

  • Felmerült ma délután egy kérdés és mivel hirtelen én sem tudtam rá a pontos választ, utánanéztem. A kérdés az alábbi volt: hogy lehet a böngészőt letöltési ablak …

  • A speciális karakterek használata bizonyos esetekben fontos lehet. Számomra elsősorban a tananyagok készítésekor volt jelentősége. Ha például egy kódot szeretnék …

  • letölthető videóFájl: lang.zip (5430kb, AVI)Megjegyzés: a lejátszáshoz min. DivX 5.0.2 kell A leírás segítségével meglepően egyszerű módon tudtok majd r …

A cikket beküldte: aky22 ()

15 hozzászólás

  1. csubi says:

    http://phpmaster.com/localizing-php-applications-1/

  2. asam9 says:

    köszi a cikket, eddig a sima asszociatív tömbös megoldást használtuk a felesleges plusz karakterekkel.

    valaki meg tudná mondani, hogy MAMP-on mit kell beállítanom, ahhoz, hogy működjön a dolog? (WAMP-pal megy)

    ezt a hibaüzenetet kapom:
    Warning: Error parsing hu.ini on line 11 in /Applications/MAMP/htdocs/speedtest/ini_lang.php on line 4

  3. asam9 says:

    MAMP update megoldotta :)

  4. szaboolcs says:

    Egy kicsit kibővíteném az írást annyival hogy az ini fájlban a következőképpen lehet kategorizálni:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    GLOBALIS_MONDAT = Globális mondat szöveg
    GLOBALIS_MONDAT_2 = Globális mondat 2 szöveg
     
    [HEADEREK]
    ELSO_NEV = Első név szöveg
    MASODIK_NEV = Második név szöveg
     
    [FOOTERBE]
    FOOTER_ELSOJE = Footer elsője szöveg
    FOOTER_MASODIKJA = Footer másodikja szöveg

    A következő képpen kell meghívni az ini fájlt:

    1
    
    $lang = parse_ini_file("lang/".$nyelv.".ini", true);

    Ezután a következőképpen lehet elérni a szavakat/mondatokat:

    $lang[“GLOBALIS_MONDAT”] – Kiírja hogy: Globális mondat szöveg
    $lang[“GLOBALIS_MONDAT_2″] – Kiírja hogy: Globális mondat 2 szöveg
    $lang[“HEADEREK”][“ELSO_NEV”] – Kiírja hogy: Első név szöveg
    $lang[“FOOTERBE”][“FOOTER_MASODIKJA”] – Kiírja hogy: Footer másodikja szöveg

    Továbbá ajánlott UTF8-at használni többnyelvű oldal esetén.

  5. Festo says:

    Az adatbázis alapú megoldás talán azért jobb egy kicsit, mert ha menet közben bekerül egy új változó, mert kiderült, hogy kifelejtettünk valamit, közben meg már 3-4 nyelvre lefordítottuk az oldalt akkor ha felvesszük az alapértelmezett nyelven az újat ( célszerű angolul ) akkor tudunk olyat, hogy minden a kiválasztott nyelven jelenik meg, csak az az egy lesz angol.
    Mert ezzel a megoldással kicsit macera minden fájlba beszúrni az új változót. Ha figyelünk arra, hogy strukturált legyen a fájlunk akkor meg persze minden fájlba ugyan oda kell beszúrni …
    Ha az egyik fájlban nincs meg a változónk akkor jobb esetben nem jelenik meg a kívánt szöveg, rosszabbik esetben pedig kapunk egy warningot, hogy a kulcs nem létezik.

    Most ahogy ezt írom, eszembe jutott, hogy mivel ennek a megoldásnak a nagy előnye hogy statikus, nem kell még a szervert terhelni fölöslegesen, lehetne írni egy köztes megoldást, ami azon az elven működne, hogy adatbázisban vannak a nyelvi adatok, de mentésnél nem csak az adott rekordot frissítené a rendszer, hanem generálna egy ini/xml fájlt amiben megvan miden kulcs, csak esetleg üresen/angolul hagyná a változókat, ha nincs megadva fordítás.

  6. :ip says:

    ezt az ini-s megoldást univerzálisan csak olyan weblapok esetén volna szabad használni, ahol a tartalom állandó, és kevés. azaz ahol szükségtelen adatbázisban tárolni bármit is. (beolvassuk az adott nyelvű ini fájl-t és abból írunk ki mindent.)

    ha viszont egy folyamatosan frissülő oldalunk van sok tartalommal (ez az általánosabb opció), akkor az ini fájlokban kizárólag azokat a szövegeket ajánlott tárolni, amik függetlenek a tartalomtól. mi szokott ilyen lenni egy oldalon? hát például a “szólj hozzá!”, a “további cikkek”, nyelvek nevei, és hasonló, működéshez kapcsolódó kifejezések. valószínűleg elenyésző számban vannak jelen… tehát akár text editorban is látható egy-egy ini fájl közt a hasonlóság/különbség. de mégis, legyünk professzionálisak: célszerű egy nyelvi admin felületet készíteni, amivel szerkeszteni tudod az ini fájljaidat, naprakészen tudod tartani őket. (listázd ki az összes elemet és a hozzájuk tartozó fordításokat minden nyelven. ami nem létezik, azt töltsd ki, majd mentsd el fájlba…) ennyiben ki is merül az ini-s nyelvesítés. a tartalmat és az ahhoz kapcsolódó apróságokat (pl. menüpontok, tagline) viszont adatbázisban kell többnyelvűsíteni.

  7. axiomer says:

    @:ip Akkor viszont már az oldalfüggetlen tartalmakat sem feltétlen éri meg, mert akkor két különböző típusú (MySQL és INI) megoldást használunk, ami meg nem feltétlen szerencsés.

  8. szaboolcs says:

    Akkor azt is kinyilváníthatjuk hogy tökéletes megoldás nincs. Dinamikus oldalt letöbbnyelvűsíteni úgyis csak úgy lehet ha magák a felhasználók már a bizonyos “szólj hozzá” részt is több nyelven írják le. Axiomer-nek igaza van, mysql és ini keverésével csak azt érjük el hogy később bonyolultabb fordítani mert nem egy helyen van minden.

  9. Matthew says:

    Szerintem a legszebb megoldás, ha egy php-t teszel a weblap elé, ami kiolvassa a böngészőből a nyelvet és alapból azon a nyelven töltődik be a weblap..Ez a legjobb, user barát megoldás.
    Üdv:M.

  10. szaboolcs says:

    Szerintem ha ezt megteszed, és valakinek angol nyelvű böngészője van de magyar, akkor nem fogja a tartalmat lehet megérteni

  11. web5 says:

    Nekem ez nem működik. Meg tudná valaki mondani, hogy milyen formában írjam be a kódot és hova a php fájlon belül? A firefox alatt egy üres oldal jelenik meg. Chrome alatt pedig az egész forráskódot kidobja…

  12. TakiTibi says:

    Tudna valaki adni e-mailben egy sample.zip-et, ami alapján meg tudom érteni a nyelvválasztó php működését? Suükségem lenne:
    -index.html
    -nyelvvalaszt.php
    -szotar_hu.ini
    -szotar_eng.ini
    Köszi előre is a segítséget!

  13. bmann says:

    A kimaradó elemes problémát szerintem a array_replace függvénnyel lehet legjobban megoldani.
    Töltsd be mondjuk az angol ini-t (vagy azt, amelyik hiánytalan) majd a választott nyelvét és az angol tömböt írd felül a másik nyelvvel (a kimaradó elemek megmaradnak angolul)

  14. János says:

    Ezt hogyan lehetne összehozni?
    Valaki segítene?
    Az első sor az eredeti és azt szeretném, ha az adatbázisból hívná be az ott találtakat.

    $treestr = $tree ? ” ({$text[‘tree’]}: $tree)” : “”;

    Ezzel próbálkoztam, de fogalmam sincs hová rakjam.
    $query = “SELECT treename_{$lang} as text FROM $trees_table”;

  15. Collider says:

    Üdv!
    Ez a rész nem jó:

    if (isset($_GET[‘lng’]) && !empty($_GET[‘lng’]))

    mert ha nem érkezik lng változó, a második feltétel hibát dob a nem létező kulcs miatt (ha nem, akkor nincs beállítva az E_ALL).

    A $_GET, $_POST, stb. változók átvételét érdemes központosított függvénnyel megoldani, ahol hibavédelem, típuskonverzió, betörést megelőző dolgok rendesen ki vannak dolgozva. Pl.: request(‘lng’)

Szólj hozzá
a PHP nyelvválasztó c. bejegyzéshez

- Engedélyezett HTML elemek: <a> <em> <strong> <ul> <ol> <li>
- Forráskód beküldéséhez tedd a kódot ezek közé: <pre lang="php" line="1">Kódrészlet helye itt</pre>