Handleiding

Makkelijk meertalige websites maken in php


In deze handleiding presenteer ik een stukje php waarmee het heel makkelijk wordt om websites die met php gemaakt worden meertalig te maken. De taal is globaal in te stellen, maar hoe je dat doet is je eigen keuze. Ik geef een voorbeeld(je) waarbij ik gebruik maak van sessies.

Voor de ondersteuning van meerdere talen gebruik ik slechts één object en één functie. De functie geef je een argument mee dat een associatieve array is, waarbij de keys de taal identificeren en de values de inhoud zijn die bij die taal hoort. Bijvoorbeeld, in plaats van
PHP-code:
echo "This is a test."
krijg je
PHP-code:
echo SelectLang(array('en' => "This is a test."'nl' => "Dit is een test."'fr' => "C'est un test.")); 
De php code is als volgt (gedocumenteerd volgens DOXYGEN stijl).
PHP-code:
<?
/**
 * Function to select content for a specific language. The content must be
 * provided in an associative array with language IDs as keys. The value of the
 * key that equals MultiLang::$lang is returned.
 *
 * @param array $content Associative array with language IDs as keys.
 * @return unknown The value associated with the key that equals MultiLang::$lang
 * or the first value, if no key equals MultiLang::$lang.
 */
function SelectLang($content)
{
    
$tmp = new MultiLang($content);
    return 
$tmp->get();
}

/**
 * Class that stores content in one of multiple languages.
 * $_SESSION['lang'] is used to determine the selected language.
 */
class MultiLang
{
    
/// Static object used to select a value from the associative array given in the constructor.
    
public static $lang;
    private 
$content;

    
/**
     * Constructor.
     * Takes an associative array, where the key is the language ID. The value
     * in the static member variable $lang is used to retrieve the value from
     * the array that is to be stored.
     *
     * @param unknown_type $content
     * @return Lang
     */
    
function MultiLang($content)
    {
        if (
array_key_exists(MultiLang::$lang$content))
            
$this->content $content[MultiLang::$lang];
        else
            
$this->content array_shift($content);
    }

    
/// Retrieves the content of this object.
    
function get()
    {
        return 
$this->content;
    }
}
?>
De functie SelectLang maakt gebruik van de klasse MultiLang. In deze klasse zit een static member variabele die gebruikt wordt om de juiste taal te selecteren. Deze variabele moet ergens de juiste waarde worden gegeven. Je bent vrij in hoe je dat doet, maar ik vind het zelf het makkelijkst om de taal in een sessie variabele op te slaan. Dit kun je doen met het volgende stukje php.
PHP-code:
session_start();

if (isset(
$_GET['lang']))
{
    
// check if language is one of supported languages
    
if ($_GET['lang'] == 'en' || $_GET['lang'] == 'nl')
        
$_SESSION['lang'] = $_GET['lang'];
}
if (!isset(
$_SESSION['lang']))
    
$_SESSION['lang'] = 'en'// default language

MultiLang::$lang $_SESSION['lang']; 
Deze code moet in iedere pagina worden aangeroepen, dus moet je het in een bestand zetten dat je in iedere pagina includeert. Je zou het in hetzelfde bestand kunnen zetten als de functie SelectLang, maar het is beter om het in een apart bestand te zetten.

Wat de code doet, is controleren of er in de adresbalk is opgegeven welke taal gekozen moet worden (bijv. http://www.mysite.nl/index.php?lang=nl). Als daar een taal is opgegeven die wordt ondersteund, wordt de sessie variabele ingesteld op die taal. Zo niet, dan wordt gekeken of de sessie variabele al bestaat. Als die nog niet bestaat wordt die in gesteld op de standaardtaal. Vervolgens wordt de static member variabele in de klasse MultiLang de waarde van de sessie variabele gegeven.

Een voorbeeld van hoe je deze code kunt gebruiken, is bovenaan al gegeven. Je hoeft trouwens niet alleen text op te geven als inhoud. Als je bijvoorbeeld een functie hebt die een regel van een tabel wegschrijft, kun je SelectLang ook gebruiken.
PHP-code:
function DisplayRow($data)
{
    echo 
"<tr>\n";
    for (
$i 0$i sizeof($data); $i++)
        echo 
"<td>"$data[$i], "</td>\n";
    echo 
"</tr>\n";
}
// ...
DisplayRow(SelectLang(array(
    
'en' => array('one''two''three'),
    
'nl' => array('een''twee''drie'),
    ))); 


nationaalcomputerforum.nl © 2010
Created for Nationaal Computer Forum www.nationaalcomputerforum.nl  (disclaimer)