Přepínání jazyků v php

Jednoduchá šablona pro vícejazyčný web

Nedávno jsem na icq s někým probíral přepínání jazyků. Řešení to bylo sice rychlé, ale už méně efektivní. Při změně jazyku se změnil adresář, ze kterého se načítalo menu a obsah. URL zůstávala stejná – na jedné adrese vyhledávače najdou více verzí webu což určitě není nejlepší řešení.

Teď jsem s k tomu vrátil a upravil (teda komplet přepsal) ten skript tak, aby tento neduh neměl.

V návrhu skriptu jsem si do požadavků, co by tento skript měl umět:

  • jednoduché přepnutí jazyku
  • zapamatování jazyku pro danou relaci i pro relace následující (přes sessions a cookies)
  • pro každý jazyk jinou URL. Odkazy jsou v následujícím tvaru tvujweb/jazyk/xxx
  • jednoduché přidání dalšího jazyku bez dalších složitých úprav na více místech skriptu (jen zadání další hodnoty do pole array)
  • při zobrazení obsahu stránky např. clanek1.php v češtině při přepnutí na jiný jazyk otevřít taktéž tuto stránku v jiném jazyce (jestli existuje, jinak zobrazit úvod v daném jazyce).

Ukázka fungování skriptu

Pro fungování této kostry webu jsou potřeba tyto soubory:

  • index.php (v rootu, rozhoduje na který jazyk se přesměruje)
  • funkce.php (pomocné funkce pro zjednodušení obsahu indexů, přehlednější, jednodušší úprava)
  • styl.css (nastylování výsledného webu – pro všechny jakyzy dohromady)
  • jazyk/index.php (kostra webu v každé jazykové složce)
  • jazyk/menu.php (menu webu v daném jazyce)
  • jazyk/uvod.php (úvod webu v daném jazyce)

Hlavní index.php

Jak jsem již psal, tento soubor se stará o přesměrování na správnou jazykovou verzi webu. Jeho obsah:

<?php
require "funkce.php"; // Funkce, nastavení jazyků, startování sessions

// zavolám index.php?lang=en
if(isset($_GET["lang"])){ // Pokud jsme poslali požadavek na změnu jazyku
  $lang=$_GET["lang"];  // nastavím hodnotu jazyku
  if(in_array($lang,$JazykyDir)){ // Zkontroluji, zda je požadovaný jazyk mezi jazyky, které jsou k dispozici
    $_SESSION['jazyk']=$lang; // Nastavím si do session hodnotu s jazykem

    // Pokud jsme byli na nějaké kontrétní stránce, třeba tvujweb/cz/index.php?page=odkaz1 a stránka odkaz1.php je i v novém jazyce
    if(isset($_GET['page']) and file_exists($lang."/".$_GET['page'].".php")){
      $Link=$lang."/index.php?page=".$_GET['page'];
      // Nastavíme tuto stránku zpět a před to dáme nový jazyk
    }else{
      $Link=$lang."/index.php";
      // Pokud volaný soubor v daném jazyce neexistuje, voláme jen index daného jazyku.
    }
    setcookie("lang", $lang , time()+31536000);
    // Nastavíme hodnotu jazyku do cookies, aby při další návštěvě webu se otevřel "správný jazyk"
    header("location: $Link");
    exit;
    // Přesměrujeme na požadovaný jazyk, popřípadě i s kontrétním souborem
  }else{ // Jazyk není mezi podporovanými jazyky - toto by se nemělo stát, pokud ale někdo změní URL...
    echo "This language is not between supported languages.";
    echo "See this page in default language - <a href='".$JazykyDir[0]."/index.php'>Link</a>";
    // poskytneme uživateli návrat zpět na standardní jazyk
  }
}else{ // návštěvník nevolal po změně jazyku, podíváme se jestli už nemá nastavený jazyk v cookies
  if(isset($_COOKIE['lang']) and in_array($_COOKIE['lang'],$JazykyDir) ){
    // Má v cookies hodnotu jazyku, který je mezi podporovanými, přesměrujeme ho tam, na jakém jazyce minule zkončil
    $Link=$_COOKIE['lang']."/index.php";
  }else{ // nebyl tu ještě nebo má v cookies nesmysl (třeba už nepodporovaný jazyk), přesměrujeme ho na standardní jazyk (první jazyk v poli)
    $Link=$JazykyDir[0]."/index.php";
  }
  header("location: $Link");
  exit;
}
?>

Funkce.php

V tomto souboru se dá nastavit nový jazyk a jsou zde funkce pro zjednodušení.

<?php
session_start(); // startujeme sessions


$JazykyDir= array("cz","en","sk"); // nastavení jazyků a složek, ve kterém jsou soubory.
// Pro přidání nového jazyku stačí pouze zapsat tento jazyk do tohoto pole. Název jazyku je shodný s adresářem, kde jsou umístěné soubory.

// Funkce slouží pro vtoření odkazů k přepnutí na jiný jazyk.
// Její parametr je $Vyrad a $SetToLang
function UdelejOdkazBez($Vyrad,$SetToLang){
  $Href = "../index.php"; // odkaz na hlavní index
  $FirstChar="?";
  $QueryString=null;
  foreach ( $_GET as $key=>$value) {
    if ($key != $Vyrad){
        $QueryString.= $FirstChar.$key."=".$value;
        $FirstChar="&amp;";
    }
  }
  $Odkaz=$Href.$QueryString.$FirstChar."lang=".$SetToLang;
  return $Odkaz; // funkce vrací odkaz
}

// Funkce pro zapsání odkazů na jiné jazyky
function OdkazyJazyku(){
  $SlozkaJazyku=substr(strrchr(dirname($_SERVER['SCRIPT_FILENAME']), "/" ), 1); // Zjistíme, v kterém souboru se momentálně nacházíme
  $JazykyDir=$GLOBALS['JazykyDir']; // Vezmeme si dovnitř funkce proměnnou $JazykyDir
  if(in_array($SlozkaJazyku,$JazykyDir)){ // jestli je aktuální složka v jazycích -
    $OdkazyJazyku=null;
    for($i=0;$i<count($JazykyDir);$i++){
      if($SlozkaJazyku==$JazykyDir[$i]){
        $OdkazyJazyku.="<a href='".UdelejOdkazBez("lang",$JazykyDir[$i])."'><strong>".strtoupper($JazykyDir[$i])."</strong></a> ";
      }else{
        $OdkazyJazyku.="<a href='".UdelejOdkazBez("lang",$JazykyDir[$i])."'>".strtoupper($JazykyDir[$i])."</a> ";
      }
    }
  }else{
    $OdkazyJazyku=null;
    for($i=0;$i<count($JazykyDir);$i++){
      if($i==0){
        $OdkazyJazyku.="<a href='".UdelejOdkazBez("lang",$JazykyDir[$i])."'><strong>".strtoupper($JazykyDir[$i])."</strong></a> ";
      }else{
        $OdkazyJazyku.="<a href='".UdelejOdkazBez("lang",$JazykyDir[$i])."'>".strtoupper($JazykyDir[$i])."</a> ";
      }
    }
  }
  echo $OdkazyJazyku;
}

// Funkce - popis viz http://pecan.cz/index.php?id=44&n=konec-ramcu-v-cechach
function ZobrazObsah(){
  if (isset($_GET['page'])){        // pokud byl odeslán ?page= ...
    $soubor=$_GET['page'];
    $soubor2= dirname($_SERVER['SCRIPT_FILENAME'])."/".$soubor.".php";
      if(file_exists($soubor2)){      //pokud soubor existuje, načteme ho do středu
        if(substr_count($soubor,"../")>0){ // pokud je v parametru alespoň 1x ../ neumožíme soubor načíst
          echo "<h3>Upozornění</h3>Nelze nahrát soubor v nadřazeném adresáři!";
        }elseif($soubor=="index" or $soubor=="/index"){
          echo "<h3>Upozornění</h3>Index nemůže načíst sám sebe!";
        }else{
           include ($soubor2);
        }
      }else{                //pokud soubor neexistuje, zavoláme 404.php
        include "404.php";
      }
  }else{                  // Pokud nebyl paramentr page volaný, načteme uvod.php
    include "uvod.php";
  }
}
?>

Změna Nastavení jazyků:
Standardně je to pole

$JazykyDir= array("cz","en","sk");

// Chceme-li např. přidat francoužštinu ve složce fr, upravíme pole na
 $JazykyDir= array("cz","en","sk","fr");

Jazyk, který je uveden jako první v tomto poli je ve skriptu dále veden jako standardní.

index.php v každé složce jazyku

S tímto souborem můžete dále pracovat jak potřebujete. Na začátku souboru však musí být načten soubor funkce.php. Funkce OdkazyJazyku() už podle názvu zobrazuje jazyky, include „menu.php“ vloží menu a funkce ZobrazObsah() se postará o zobrazení obsahu ve středu stránky.

<?php require "../funkce.php"; ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="cs">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=win-1250" />
  <meta http-equiv="Content-Language" content="cs" />
  <link rel='stylesheet' type='text/css' href='../styl.css' />
  <title>peCan.cz - Přepínání jazyků v php tutorial</title>
</head>
<body>
<div id="okraj">
  <p align="right">
    <?php OdkazyJazyku(); ?>
  </p>
    <div id="logo">
    <h1>peCan.cz - Přepínání jazyků v php tutorial</h1>
    </div>
        <div id="menu">
      <?php include "menu.php"; ?>
        </div>
        <div id="obsah">
      <?php ZobrazObsah();?>
        </div>
  <div id="reset"></div>
  <div id="paticka">
    Patička, (c) 2007 peCan.cz - <a href="http://pecan.cz/index.php?id=47">stáhni skript</a>
  </div>
</div>
</body>
</html>

Každý jazyk má svoje menu.

Ukázka skriptu: pecan.cz/ukaz­ky/lang

Download skriptu: zde


<Starší | tento článek | Novější>

Napsáno: 26. 4. 2007, 13:58 | Přečteno: 16338x | Kategorie: PHP Skripty | Napsal: peCan.cz |
Komentáře: 29
.:. Huggi | www
Neslo by jeste vylepseni, ze by to nastavilo jazyk podle ip prichoziho..jako napr pro CZ/SK cestinu zbytek anglictinu..
Odpověď | 2007-04-26 14:16:09
.:. peCan | www | mail
Tak udělat by to šlo. Realizaci ale nechám na někom jiném;-). Složité to není, stačí se podívat třeba zde - odkaz
Odpověď | 2007-04-26 14:49:36 | Příspěvek upraven: 2007-04-26 14:51:07
No já osobně bych to řešil spíš pomocí define("zprava","Zpráva v daném jazyce"); a pak to ze scriptu zavolám pouze pomocí echo zprava;. Takle si udělám všechny zprávy do souboru lang_cz.php a do lang_en.php atd... Pak jen stačí přepínat jeden soubor pomocí např. require $_SESSION["Lang"]; a toť vše funguje.
To se mi zdá o něco pohodlnější ;-)
Odpověď | 2007-04-26 22:20:14
.:. peCan | www | mail
No řešení je to je, ale dosti nepraktické. Jednak když chceš něco napsat, musíš editovat alespoň 2 soubory a navíc jak jsem psal v úvodu - budeš mít více jazyků na jedné URL a to není dobré. Navíc pokud budeš něco chtít napsat, vždy musíš psát <?php ?> což za chvíli přestane bavit.
Odpověď | 2007-04-27 08:30:47
Dva soubory - no to ano.
Více jazyků na jedné URL - no nevím čemu by to mělo vadit; najednou tam bude vždycky jen jeden takže návštěvníkovi to je IMHO vlastně fuk a vyhledávače stejnak uviděj jen default jazyk.
Psaní <?php ?> - no to ale musíš vždycky když chceš kombinovat suchej HTML kód a php... V tom tvojem zdrojáku na jazyk/index.php to tam taky hodně je. ;-)
Ta moje metoda má využití spíš v redakčních systémech a tak (např. jeden dost známej konkurenčí tvojemu, ale rozhodně ne lepší to používá). Tam se většinou všechno dělá pomocí php komplet (symčky na výpisy dat apod.) a tak ti to <?php ?> moc nevadí :-)
PS: Neber to jako hádku to je jakože slušná debata 8-|
Odpověď | 2007-04-27 23:54:46
.:. peCan | www | mail
Vsak v pohode;-). Vadit by to melo autorovi webu - ma vice jazyku a z vyhledavacu chodi jen na standardni jazyk. Coz by asi nikdo nechtel.

Pokud bych to mel resit jazykovymi soubory - udelal bych si 1 xml soubor kde bych psal vsechny jazyky... Melo by to aspon tu vyhodu, ze bych nemel tech jazykovych souboru nekolik.
2007-04-28 10:10:02

Editovat se musí víc souborů vždy. Ale řešení s jazykovou definicí mi připadá méně náročné na uhlídání než udržovat a upravovat třeba čtyři php pro čtyři jazyky.

Odpověď | 2007-05-26 23:18:35
.:. Ronnie | www | mail
ad konstnanty a jazykové verze

Pro překlady používejte gettext, konstanty jsou naprosto nevhodné.

ad skript

Zaměřil bych se na dodržování štábní kultury, porošuješ snad všechna pravidla, která existují co se týče konvencí.

1. za header() musíš skript ukončit (header() jej neukončí) třeba pomocí exit() + odkaz.

2. proč se vytváří další proměnná $lang, když existuje $_GET['lang']?

3. Znak & je třeba zakódovat jako &amp;. Stačí použít funkci urlencode().
Odpověď | 2007-04-28 20:46:20
.:. peCan | www | mail
Profík;-) Jak ty ses mi tu zatoulal, to je mi záhada;-)

ad 1) OK, my bad.
ad 2) Zlozvyk. Navíc jazyk přepínáš snad jen jednou, takže snad nevadí že si alokuji pár bajtů z paměti na vytvoření nové proměnné.
ad 3) Není třeba ale je to vhodné;-)

Ad kultura: nejspíš patříš k těm, kteří komentář "//" na konci řádku považují za chybu a píšou jedině "/* */ " nebo složené závorky píšou na nový řádek. Jinak nechápu, co se ti na mém stylu psaní nelíbí, osobně mi přijde přehledný;-).
Odpověď | 2007-04-29 00:00:15
Gettext - pokud se to musí instalovat, tak bych s tim na většině (free)hostingů nepočítal - na vlastním serveru to je asi dobrý.

1) Pokud vím, tak parser postupně vykonává příkazy scriptu a když je všechny vykoná tak se jeho práce ukončí. Takže pokud je header na konci tak se po jeho odeslání script stejnak ukončí, ne?

2) Přehlednost, jednoduchost - příklad s mysql dotazem:
insert into clanky (id, jmeno, popis, text, odkazy, prilohy) values ('".$_POST["id"]."', '".$_POST["jmeno"]."', '".$_POST["popis"]."', '".$_POST["text"]."', '".$_POST["odkazy"]."', '".$_POST["prilohy"]."')

NEBO
insert into clanky (id, jmeno, popis, text, odkazy, prilohy) values ('".$id."', '".$jmeno."', '".$popis."', '".$text."', '".$odkazy."', '".$prilohy."')

Co je přehlednější? :-)

3) Podle norem W3C by tam mělo být $amp;

Kultura: Právě dělám vlastní RS (při porovnání funkcí by to bylo PikoRS :-D ), takže mam v compu i na freehostingu několik RS u kterejch pozoruju funkce atd. Ale pokud potřebuju zjistit ve zdrojáku jak některá funkce funguje, tak nahlížim jen do zdrojáků MiniRS, protože u ostatních RS jsou zdrojáky (pro mě) dost nepřehledný. Takže myslim že tenhle styl je dobrej.
Odpověď | 2007-04-29 10:24:09
.:. Ronnie | www | mail
gettext - téměř každý hosting gettext podopruje

1) header() pouze odesílá hlavičku HTTP, která způsobí odeslání, samotná konstrukce header() tedy nezpůsobuje přesměrování. Podívej se na komentáře na php.net k header(), zmiňují tam důvody používání exit().

2. Ani jedno. Raději bych použil předpřipravené dotazy (mysqli nebo PDO), kde se předává pole

array('id' => $_POST['id'], 'name' => $_POST['name']);

nebo

array('id' => $id, 'name' => $name);

je myslím jedno. Navíc se ošetří vstup uživatele.

3. Pokud se použije &, způsobí se tři problémy:

a) bude to nevalidní
b) bude to proti určitým pravidlům
c) pokud budeš chtít použít funkci i při práci s XML, parser selže a objeví se chyba (škoda, že tohle není v XHTML)

Styl je problém. V Pythonu je styl programování součástí programu, java má také jasně dané pravidla, jen PHP je výjimka. Viz Pear Coding Standards nebo Zend Framework coding standards, v utery bude o tom článek na Intervalu.
Odpověď | 2007-04-29 12:42:20
.:. peCan | www | mail
Jak jsem říkal, exit po headeru je moje chyba a mělo by to tam být.

Co se týče zbytku - to je příklad. Nebylo mým cílem upozornit na všechny detaily. Na ošetření vstupu od uživatele mám ve svých projektech funkci, která se o vše stará. Tady jsou vstupy od uživatele 2, oba jsou doufám dostatečně ošetřené.

Ad styl: Tady si opravdu nerozumíme. Nevím co je na daném stylu špatného. Osobně se mi zdá přehledný (až na komentáře), které samozřejmě jsou v rozsahu větším než obvyklém a zde znepřehledňují kód. Ve standardech jsou kraviny jako např. 80 znaků na řádek; některé doporučení používat prostě nehodlám - přeci jen při rozlišení 1600x1200 je to asi jen 1/3 plochy a v dnešní době obdobné rozlišení má každý programátor.
Odpověď | 2007-04-30 09:07:19
.:. Ronnie | www | mail
Třeba proměnné $lang a $JazykyDir? Proč je jedna s malým počátečním písmenem a druhá s velký? Jedna část anglicky a druhá část česky? Je to zmatek, proto existují určitá pravidla.

Co se týče 80 (a max. 120) znaků na řádek, to je jedno z nejdůležitějších pravidel a rozlišení 1600x1200 v tom nehraje žádnou roli. Když máš IDE, po stranách budeš mít otevřená další okýnka pro debugger, projekt manager ap., okno pro editaci bude podstatně menší...
Odpověď | 2007-05-01 08:21:31
.:. peCan | www | mail
$lang mam malym protoze je to pres GET, zbytek v tom skriptu jsou velkym, krome $soubor, coz je promenna taky z GETu.

Pouzivam 2 IDE (doma obvas ZDE a praci VS) a vzdy se mi vlezou 2 postrani sloupce a je tam vice nez 80 znaku na radek. Pravdou je, ze vice jak 120 znaku na radek pouzivam vyjimecne.

Tato diskuse se mi ale zda zbytecna - ja se ve svem stylu dokonale vyznam a to je pro me dulezite. Jedine co mi "vadi", ze soucasne pouzivam CZ i EN, ale to je podle me detail;-)

Jinak dik za rady, budu se snazit dbat na kazdy detail.
Odpověď | 2007-05-01 21:00:56

Jo, pekny kod :-) hodi se

Odpověď | 2007-07-20 21:42:39

test test2

test3 test4

test5

test6

Odpověď | 2008-01-17 00:00:24
.:. Lojza | www

Tak tohle je bomba!

Odpověď | 2008-02-07 01:23:28
.:. Lojza | www

To vubec neni spatny

Odpověď | 2008-02-07 01:23:53
.:. Mch81 | www

Vyborne, konecne jsem narazil na navod. Bez neho zatim tapu ve tme :-D

Odpověď | 2008-02-25 15:25:12

Zajímalo by mě jak by se daly ty odkazy na jazyky ( CZ EN SK ) nahradit obrázkami , třeba stát.vlajek

Odpověď | 2008-04-03 19:17:11
.:. lunaros

Tk už jsem na to mám hotový a ještě jsem todoplnill i o generování .html jak pro generování do středu tak i do jazyků.

Odpověď | 2008-04-17 20:11:44

no když jsem to uviděl poprvé, byl jsem z toho de… , ale na druhý pokus jsem to už zvládnul a po hodoně to šlape.Díky pecane:-D

Odpověď | 2008-07-22 20:07:54

Díky za výborný skript. Jsem začátečník a moc mi to pomohlo. Mel bych ještě dotaz jak dostat místo textu CZ, EN, SK obrázky.

Díky :)

Odpověď | 2009-01-20 10:39:58
.:. toor | mail

Ahoj skvělý skript, hodně mi pomohl. Jeno nemůžu přijít na to jak místo odkazu v textu CZ, EN, DE vložit malé vlaječky. Jde to vůbec? Ha teď jsem si všiml, ža tady podobný dotaz je. Nic méně nechám to tady a za případnou odpověď díky. Toor.

Odpověď | 2009-03-07 19:47:09

Asi nějak takto:

<?php
session_start(); // startujeme sessions


$JazykyDir= array("cz","en","sk"); // nastavení jazyků a složek, ve kterém jsou soubory.
$JazykyDirFlags= array("<img src='obrCZ.jpg' alt='cz'/>","<img src='obrEN.jpg' alt='en'/>","<img src='obrFR.jpg' alt='fr'/>");


// Pro přidání nového jazyku stačí pouze zapsat tento jazyk do tohoto pole. Název jazyku je shodný s adresářem, kde jsou umístěné soubory.

// Funkce slouží pro vtoření odkazů k přepnutí na jiný jazyk.
// Její parametr je $Vyrad a $SetToLang
function UdelejOdkazBez($Vyrad,$SetToLang){
  $Href = "../index.php"; // odkaz na hlavní index
  $FirstChar="?";
  $QueryString=null;
  foreach ( $_GET as $key=>$value) {
    if ($key != $Vyrad){
        $QueryString.= $FirstChar.$key."=".$value;
        $FirstChar="&amp;";
    }
  }
  $Odkaz=$Href.$QueryString.$FirstChar."lang=".$SetToLang;
  return $Odkaz; // funkce vrací odkaz
}

// Funkce pro zapsání odkazů na jiné jazyky
function OdkazyJazyku(){
  $SlozkaJazyku=substr(strrchr(dirname($_SERVER['SCRIPT_FILENAME']), "/" ), 1); // Zjistíme, v kterém souboru se momentálně nacházíme
  $JazykyDir=$GLOBALS['JazykyDir']; // Vezmeme si dovnitř funkce proměnnou $JazykyDir
  if(in_array($SlozkaJazyku,$JazykyDir)){ // jestli je aktuální složka v jazycích -
    $OdkazyJazyku=null;
    for($i=0;$i<count($JazykyDir);$i++){
      if($SlozkaJazyku==$JazykyDir[$i]){
        $OdkazyJazyku.="<a href='".UdelejOdkazBez("lang",$JazykyDir[$i])."'><strong>".$JazykyDirFlags[$i]."</strong></a> ";
      }else{
        $OdkazyJazyku.="<a href='".UdelejOdkazBez("lang",$JazykyDir[$i])."'>".$JazykyDirFlags[$i]."</a> ";
      }
    }
  }else{
    $OdkazyJazyku=null;
    for($i=0;$i<count($JazykyDir);$i++){
      if($i==0){
        $OdkazyJazyku.="<a href='".UdelejOdkazBez("lang",$JazykyDir[$i])."'><strong>".$JazykyDirFlags[$i]."</strong></a> ";
      }else{
        $OdkazyJazyku.="<a href='".UdelejOdkazBez("lang",$JazykyDir[$i])."'>".$JazykyDirFlags[$i]."</a> ";
      }
    }
  }
  echo $OdkazyJazyku;
}

// Funkce - popis viz http://pecan.cz/index.php?id=44&n=konec-ramcu-v-cechach
function ZobrazObsah(){
  if (isset($_GET['page'])){        // pokud byl odeslán ?page= ...
    $soubor=$_GET['page'];
    $soubor2= dirname($_SERVER['SCRIPT_FILENAME'])."/".$soubor.".php";
      if(file_exists($soubor2)){      //pokud soubor existuje, načteme ho do středu
        if(substr_count($soubor,"../")>0){ // pokud je v parametru alespoň 1x ../ neumožíme soubor načíst
          echo "<h3>Upozornění</h3>Nelze nahrát soubor v nadřazeném adresáři!";
        }elseif($soubor=="index" or $soubor=="/index"){
          echo "<h3>Upozornění</h3>Index nemůže načíst sám sebe!";
        }else{
           include ($soubor2);
        }
      }else{                //pokud soubor neexistuje, zavoláme 404.php
        include "404.php";
      }
  }else{                  // Pokud nebyl paramentr page volaný, načteme uvod.php
    include "uvod.php";
  }
}
?>
Odpověď | 2009-06-16 10:49:24
.:. Piranha

nějak mi to s těmi vlaječkami nefunguje … 8-|

Odpověď | 2009-11-17 19:44:40
.:. :D

Debilove..:D:D:D:D:D:­DD: RFI

Odpověď | 2009-08-23 01:35:49

Chtěla jsem se zeptat, jestli se tím živíte, nebo je to jenom váš koníček? Potřebovala bych udělat web, ale moc na to nemám peněz… Dělá to někdo z vás? díky Lůca

Odpověď | 2009-08-27 14:23:11

Řešení vlaječek: I mě nefungovalo výše zmíněné řešení s vlaječkami a tak jsem přišel na vlastní způsob. Navíc je zde velkou výhodou to, že zde nemusíte vytvářet další pole s jednotlivými odkazy na ikonky vlaječek. Podmínkou však je, aby se ikonky jmenovali stejně, jako názvy jazyků v poli (tedy např. cz.bmp, sk.bmp atd.). Také je důležité upravit cesty k ikonkám a nezapomenout na koncovky (*.bmp, *.jpg…). Vzhledem k tomu, že je soubor funkce.php includován, je u cesty k ikonkám ../design i když je složka design na stejné úrovni jako soubor funkce.php, tak nezapomeňte.

Teď už samotný kód:

// nastavení jazyků.
$JazykyDir= array("cz","en");
// Pro přidání nového jazyku stačí pouze zapsat tento jazyk do tohoto pole. Název jazyku je shodný s adresářem, kde jsou umístěné soubory.

function UdelejOdkazBez($Vyrad,$SetToLang){ // Funkce slouží pro vtoření odkazů k přepnutí na jiný jazyk.
  $Href = "../index.php";
  $FirstChar="?";
  $QueryString=null;
  foreach ( $_GET as $key=>$value) {
    if ($key != $Vyrad){
        $QueryString.= $FirstChar.$key."=".$value;
        $FirstChar="&";
    }
  }
  $Odkaz=$Href.$QueryString.$FirstChar."lang=".$SetToLang;
  return $Odkaz; // funkce vrací odkaz
}

// Funkce pro zapsání odkazů na jiné jazyky
function OdkazyJazyku(){
  $SlozkaJazyku=substr(strrchr(dirname($_SERVER['SCRIPT_FILENAME']), "/" ), 1); // Zjistíme, v kterém souboru se momentálně nacházíme
  $JazykyDir=$GLOBALS['JazykyDir']; // Vezmeme si dovnitř funkce proměnnou $JazykyDir
  if(in_array($SlozkaJazyku,$JazykyDir)){ // jestli je aktuální složka v jazycích -
    $OdkazyJazyku=null;
    for($i=0;$i<count($JazykyDir);$i++){
      if($SlozkaJazyku==$JazykyDir[$i]){
        $OdkazyJazyku.="<a href='".UdelejOdkazBez("lang",$JazykyDir[$i])."'><img src='../design/".$JazykyDir[$i].".bmp' alt='".strtoupper($JazykyDir[$i])."' title='".strtoupper($JazykyDir[$i])."' /></a> ";
      }else{
        $OdkazyJazyku.="<a href='".UdelejOdkazBez("lang",$JazykyDir[$i])."'><img src='../design/".$JazykyDir[$i].".bmp' alt='".strtoupper($JazykyDir[$i])."' title='".strtoupper($JazykyDir[$i])."' /></a> ";
      }
    }
  }else{
    $OdkazyJazyku=null;
    for($i=0;$i<count($JazykyDir);$i++){
      if($i==0){
        $OdkazyJazyku.="<a href='".UdelejOdkazBez("lang",$JazykyDir[$i])."'><img src='../design/".$JazykyDir[$i].".bmp' alt='".strtoupper($JazykyDir[$i])."' title='".strtoupper($JazykyDir[$i])."' /></a> ";
      }else{
        $OdkazyJazyku.="<a href='".UdelejOdkazBez("lang",$JazykyDir[$i])."'><img src='../design/".$JazykyDir[$i].".bmp' alt='".strtoupper($JazykyDir[$i])."' title='".strtoupper($JazykyDir[$i])."' /></a> ";
      }
    }
  }
  echo $OdkazyJazyku;
}

function ZobrazObsah(){
...

Enjoy It.

Odpověď | 2009-12-23 00:00:50
Přidej komentář
Jméno
Web
Mail
Kontrola Zadejte číslo pět
Text

:-)
:-D
:-(
|-/
:-[]
;-)
8-|
8-o
Zde formátuje Texy! (syntaxe)
  • Příklad formátování příspěvku:

    **Tlustě**
    *Kurzíva*
    "Odkaz":http://neco.cz nebo http://neco.cz (i www.neco.cz)
    /---code php
    php kód
    \---

  • Pro odeslání zprávy můžete použít klávesovou zkratku Alt+S. (Podporují jen některé prohlížeče)
  • HTML znaky budou převedeny na entity.
  • Vyjadřujte se tu jako doma, ať víme jak to u Vás vypadá.
  • Odkazy začínající http:// budou automaticky převedeny na odkazy , nepoužívejte však v jednom příspěvku více jak 3 - to dělají jen spam roboti:-)
- Ako nájsť ženský pupok?- Priložíš jej prst na zátylok a pomaly ideš smerom dolu. Tretia dierka v poradí je pupok.
Petr Graubner | ICQ- 264912843, Jabber - pecan27@njs.netlab.cz | RSS | Šlape na miniRS | Styl CoolStyle | Zpracováno za: 0.438s | Počet SQL dotazů ve fóru: 0 | Admin