Hallo, ik heb een klein probleempje met het vertalen van mijn website.
De translatie werkt prima maar zodra je navigeert naar een andere pagina moet je opnieuw de taal aanklikken.
Mijn vraag was om deze translatie keuze vast te houden zodat elke pagina in de juiste taal verschijnt.


Demo :
http://joeytest321.webuda.com/

Files


de.txt

index.php
page1.php
page2.php

class.translation.php


de.txt


Translation=Übersetzer
Home=Zuhause
Page 1=Seite 1
Page 2=Seite 2
Bye=Freilos
Mouse=Maus


class.translation.php


<?php
class Translator {

    private $language	= 'en';
	private $lang 		= array();
	
	public function __construct($language){
		$this->language = $language;
	}
	
    private function findString($str) {
        if (array_key_exists($str, $this->lang[$this->language])) {
			echo $this->lang[$this->language][$str];
			return;
        }
        echo $str;
    }
    
	private function splitStrings($str) {
        return explode('=',trim($str));
    }
	
	public function __($str) {	
        if (!array_key_exists($this->language, $this->lang)) {
            if (file_exists($this->language.'.txt')) {
                $strings = array_map(array($this,'splitStrings'),file($this->language.'.txt'));
                foreach ($strings as $k => $v) {
					$this->lang[$this->language][$v[0]] = $v[1];
                }
                return $this->findString($str);
            }
            else {
                echo $str;
            }
        }
        else {
            return $this->findString($str);
        }
    }
}
?>


index.php


<?php
require_once('class.translation.php');

if(isset($_GET['lang']))
	$translate = new Translator($_GET['lang']);
else
	$translate = new Translator('en');
?>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
    <head>
        <title><?php $translate->__('Translation'); ?></title>
        <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-15"/>
    </head>
    <body>    
	<a title="Deutsch" href="?lang=de"><img src="img/de.png" alt="Deutsch" ></a>
	<a title="English" href="?lang=en"><img src="img/us.png" alt="English" ></a>
	
	<a title="Home" href="index.php"><?php $translate->__('Home'); ?></a>
	<a title="Home" href="page1.php"><?php $translate->__('Page 1'); ?></a>
	<a title="Home" href="page2.php"><?php $translate->__('Page 2'); ?></a>
	
	
		<h1><?php $translate->__('Home'); ?></h1>
		<h3><?php $translate->__('Bye'); ?></h3>
		<h3><?php $translate->__('Mouse'); ?></h3>					
    </body>
</html>


page1.php


<?php
require_once('class.translation.php');

if(isset($_GET['lang']))
	$translate = new Translator($_GET['lang']);
else
	$translate = new Translator('en');
?>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
    <head>
        <title><?php $translate->__('Translation'); ?></title>
        <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-15"/>
    </head>
    <body>    
	<a title="Deutsch" href="?lang=de"><img src="img/de.png" alt="Deutsch" ></a>
	<a title="English" href="?lang=en"><img src="img/us.png" alt="English" ></a>
	
	<a title="Home" href="index.php"><?php $translate->__('Home'); ?></a>
	<a title="Home" href="page1.php"><?php $translate->__('Page 1'); ?></a>
	<a title="Home" href="page2.php"><?php $translate->__('Page 2'); ?></a>
	
	
		<h1><?php $translate->__('Page 1'); ?></h1>
		<h3><?php $translate->__('Bye'); ?></h3>
		<h3><?php $translate->__('Mouse'); ?></h3>					
    </body>
</html>


page2.php


<?php
require_once('class.translation.php');

if(isset($_GET['lang']))
	$translate = new Translator($_GET['lang']);
else
	$translate = new Translator('en');
?>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
    <head>
        <title><?php $translate->__('Translation'); ?></title>
        <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-15"/>
    </head>
    <body>    
	<a title="Deutsch" href="?lang=de"><img src="img/de.png" alt="Deutsch" ></a>
	<a title="English" href="?lang=en"><img src="img/us.png" alt="English" ></a>
	
	<a title="Home" href="index.php"><?php $translate->__('Home'); ?></a>
	<a title="Home" href="page1.php"><?php $translate->__('Page 1'); ?></a>
	<a title="Home" href="page2.php"><?php $translate->__('Page 2'); ?></a>
	
	
		<h1><?php $translate->__('Page 2'); ?></h1>
		<h3><?php $translate->__('Bye'); ?></h3>
		<h3><?php $translate->__('Mouse'); ?></h3>					
    </body>
</html>


Zit al een tijdje met dit probleem, advies of hulp is meer dan welkom.

Gr Joey
Je kunt 2 dingen doen:

1) Een waarde (GET) in de link blijven geven
2) Een sessie starten met de gekozen taal erin. Dat wordt dan iets als:


<?php
session_start();
if(!isset($_SESSION['language'])){
    $_SESSION['language'] = 'en';
}
if(isset($_GET['lang'])){
    $_SESSION['language'] = $_GET['lang'];
}
if($_SESSION['language'] == 'en'){
    $translate = new Translator('en');
}
if($_SESSION['language'] == 'de'){
    $translate = new Translator('de');
}
?>
Joey, ik zou ook geen txt bestanden gebruiken voor je teksten. Ik zou een php bestand hebben waar de taal in een array staat.

Ik zou zeker iets met een sessie doen of in de url altijd te taal neerzetten. Dit wordt door veel websites gebruikt.
Je kan dan een scriptje schrijven die ophaalt wat er in de link staat en dit in een sessie neerzet, dan heb je dubbelop.

Voorbeeld en_lang.php

<?php
// Manier 1
$lang = array
(
	'menu_link_1'	=> 'Home',
	'menu_link_2'	=> 'Page 2',
);

// Manier 2
$lang['menu_link_1']		= 'Home';
$lang['menu_link_2']		= 'Page 2';
?>


Zo houdt je dynamiek in je pagina's/talen en kan je ook nog eens wat PHP erdoor gooien.
Om de bepaalde teksten op te halen kan je een functie als dit gebruiken.
Voorbeeld functions.php (zorg dat deze altijd ingeladen wordt op je website)

<?php
if(!function_exists('textvar'))
{
	function textvar($identifier, $lang=null)
	{
		// Even kijken of we een taal hebben in de sessie, zo nee dan pakken we engels als standaard
		if(is_null($lang))
		{
			$lang = (isset($_SESSION['language']) ? $_SESSION['language'] : 'en';
		}
		
		// We werken met een array van een bepaalde taal dus deze gaan we nu includen
		include_once("map_met_talen/{$lang}_lang.php");
		
		// We weten dat alles met $lang begint we hoeven alleen nog maar de identifier te selecteren en dit terug te geven
		return $lang[$identifier];
	}
}
?>


Uitleg staat in de code, mocht je vragen dan leg ik het nog graag even uit
En voor de bezoeker die voor de aller eerste keer op je website komt en dus nog geen kans heeft gehad om zijn/haar taal te kiezen uit de talen die jij aanbiedt op je website kun je uitvissen welke talen als accepted meegegeven worden door de browser.

Hier even een functie die de 'beste' taal uitkiest uit de talen die je aanbiedt:
<?php

function getBestLanguage($available, $default)
{
$accepted = array();
foreach(explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']) as $a)
{
$accepted[strtolower(substr($a, 0, 2))] = '';
}
$accepted = array_keys($accepted);

foreach($accepted as $a)
{
if(in_array($a, $available))
return $a;
}

return $default;
}

// geef op welke talen je wilt ondersteunen op je website
$aangebodenTalenOpDezeWebsite = array('en','nl', 'fr', 'de');

// geef op welke taal getoond moet worden indien er geen matches zijn
$standaardTaal = 'en';

echo getBestLanguage($aangebodenTalenOpDezeWebsite, $standaardTaal);

?>
Super bedankt allemaal, session_start oplossing werkt perfect.
Ik moet nog even kijken of het lukt om geen .txt bestanden meer te gebruiken en over te stappen naar arrays.

Reageren