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: 40070x | Kategorie: PHP Skripty | Napsal: peCan.cz |
Na pustém ostrově ztroskotají tři blondýnky. Jedna z nich chytne po půl roce rybu a zrovna zlatou. Zlatá rybka prosí, aby ji blondýnky pustili a že jim za to splní tři přání. Blondýnky souhlasí, rybku pustí a první blondýnka povídá: Já bych chtěla být chytřejší! Jen co dopověděla větu, tak se z ní stala brunetka, skočila do vody a odplavala. Druhá si přeje: Já bych chtěla být ještě chytřejší! Jen co dopověděla druhá blondýnka větu, tak se z ní stala tmavovláska, posta- vila si vor a odplula. Třetí blondýnka si zase přeje: Já bych chtěla být nejchy- třejší! A opravdu, z blondýnky se rázem stal chlap, který si uboze oddychl a odešel přes most.
Petr Graubner | ICQ- 264912843, Jabber - pecan27@njs.netlab.cz | RSS | Šlape na miniRS | Styl CoolStyle | Zpracováno za: 0.154s | Počet SQL dotazů ve fóru: 1 | Admin