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:
Pro fungování této kostry webu jsou potřeba tyto soubory:
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="&";
}
}
$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/ukazky/lang
Download skriptu: zde
. Složité to není, stačí se podívat třeba zde - odkaz
. Vadit by to melo autorovi webu - ma vice jazyku a z vyhledavacu chodi jen na standardni jazyk. Coz by asi nikdo nechtel.
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.
Jak ty ses mi tu zatoulal, to je mi záhada
.
), 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.
Vyborne, konecne jsem narazil na navod. Bez neho zatim tapu ve tme ![]()
Zajímalo by mě jak by se daly ty odkazy na jazyky ( CZ EN SK ) nahradit obrázkami , třeba stát.vlajek
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ů.
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
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 :)
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.
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="&";
}
}
$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";
}
}
?>
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
Ř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.
**Tlustě**
*Kurzíva*
"Odkaz":http://neco.cz nebo http://neco.cz (i www.neco.cz)
/---code php
php kód
\---