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.

15 HOZZÁSZÓLÁS

  1. 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

  2. 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.

  3. 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.

  4. 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.

  5. @: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.

  6. 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.

  7. 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.

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

  9. 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…

  10. 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!

  11. 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)

  12. 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”;

  13. Ü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’)

HOZZÁSZÓLOK A CIKKHEZ

Kérjük, írja be véleményét!
írja be ide nevét