Dit automatische talen systeem heeft de volgende functies:
- Talen van de bezoekers browser achterhalen
- De bezoeker zelf een taal laten kiezen
- De keuze van de bezoeker opslaan in een cookie
- Automatisch taalbestanden zoeken
- Taalbestanden includen
Een korte uitleg hoe het werkt:
- Eerst word er een array gemaakt met taalbestanden
- Structuur van de taalmap
[Languages] -> lang.all.php
-> [*1]
-> lang.*2.php
*1 is steeds een taal, bijvoorbeeld 'en', 'nl', 'de'
*2 is de naam van het taalbestand, die mag je zelf verzinnen
- De talen worden uit $_SERVER['HTTP_ACCEPT_LANGUAGE'] gefilterd
Daarbij word gelet op:
- Streken waar de taal wordt gesproken, bijvoorbeeld 'fr-be' (frans in belgië), worden weggelaten
- Dubbele talen worden weggelaten, bijvoorbeeld 'en' en 'en-us'
- Er word een taal voor de pagina uitgezocht
- Eerst word gecontroleerd of er een nieuwe taal is opgegeven
- Dan of er nog een taal in het cookie staat
- Daarna word gekeken of de taal van de bezoeker beschikbaar is
- Anders wordt de standaard taal gebruikt
- De taal balk word gemaakt
Ook is er een functie die je eenvoudig taalbestanden laat includen:
- Eerst probeert hij het bestand met de taal van de pagina te includen
- Als die niet bestaat word er gezocht in de array met talen uit $_SERVER['HTTP_ACCEPT_LANGUAGE']
- En anders wordt een bestand met de standaard taal geladen
De installatie:
- Pas de config naar jouw wensen aan
Als je kijkt wat er bij het voorbeeld is ingevuld denk ik dat er verder geen uitleg nodig is. ;)
Het gebruik:
- Include het bestand waar het script in staat. Als je het script laad vannuit een andere map dan waarin het staat is het nodig om voor het includen $config['path']['script'] in te stellen op de map van het script. Anders kunnen de taalbestanden niet goed worden geladen.
- Include taalbestanden met de functie 'include_lang_file()'
Maar hoe werken die taalbestanden?
In een taalbestand staan regels als "$lang['title'] = 'Welkom!';" daarvan kan je zoveel toevoegen als je er maar wilt, ook hier lijkt het voorbeeld als uitleg me genoeg...
- Laat tekst op de pagina zien! Bijvoorbeeld "echo $lang['title'];"
In de zip staat het script zoals je het zou kunnen gebruiken.
<?php
// Some config stuff :)
$config['default_lang'] = 'nl';
if (!isset($config['path']['script'])) {
$config['path']['script'] = './';
}
$config['path']['lang'] = $config['path']['script'] . 'languages/';
$config['path']['flags'] = $config['path']['script'] . 'images/flags/';
$config['lang_save_time'] = 7 * 24 * 60 * 60; // A week
$config['inc_alt_lang'] = true;
$config['make_lang_bar'] = true;
// Initiate language var
$GLOBALS['lang'] = array();
/* Search for language files */
$lang_files = array(); // This array will hold the installed languages
// Open the language file directory
$handle = opendir($config['path']['lang']);
// Loop over the files
while (($file = readdir($handle)) !== false)
{
// Filter out non-files
if ($file != '.' && $file != '..')
{
// Check if the 'file' is an valid language directory
if (is_dir($config['path']['lang'] . $file) && ereg('^[a-z]{2}$', $file))
{
$lang_files[] = $file;
}
}
}
/* Search for user selected languages */
$user_langs = array(); // This array will hold the user selected languages
if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE']))
{
// The user has selected preferred languages, prepare them to read
$accept_lang = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
$accept_lang = preg_replace('/(;q=[0-9]+\.[0-9]+)/i', '', $accept_lang);
$accept_langs = explode(',', $accept_lang);
// Loop over the languages and add them to the array
foreach ($accept_langs as $accept_lang)
{
// Remove potential countries
$accept_lang = explode('-', $accept_lang);
$user_langs[] = $accept_lang[0];
}
// Remove duplicate values from the array
$user_langs = array_unique($user_langs);
}
/* Determine the language in which the page will be shown */
// First check if the user selected a language to show the page
if (isset($_GET['lang']))
{
$suggested_lang = $_GET['lang'];
}
// Check for a previously selected language
elseif (isset($_COOKIE['lang']))
{
$suggested_lang = $_COOKIE['lang'];
}
// If a preferred language is selected check if that language file is available
if (isset($suggested_lang) && !empty($suggested_lang) && in_array($suggested_lang, $lang_files))
{
$page['lang'] = $suggested_lang;
// Save the preferred language in a cookie
setcookie('lang', $suggested_lang, time() + $config['lang_save_time']);
}
else
{
/* None or invalid language preference is expressed, obtain a language automatically */
// Select the first language which is available
foreach ($user_langs as $user_lang)
{
if (in_array($user_lang, $lang_files))
{
$page['lang'] = $user_lang;
// Stop searching
break;
}
}
if (empty($page['lang']))
{
// Still no language has been selected use the default one
$page['lang'] = $config['default_lang'];
}
}
// Include some language files
include_lang_file('all');
include_lang_file('standard');
// Make the language bar if enabled in the config
if ($config['make_lang_bar'])
{
// These flags dont't have the same name as their language
$flag_fix = array(
'en' => 'gb'
);
// Start making the language bar
$lang_bar = '';
foreach ($lang_files as $lang_file)
{
if ($lang_file != $page['lang'])
{
// Fix some flags
$flag = $lang_file;
foreach ($flag_fix as $old => $new)
{
$flag = ereg_replace($old, $new, $lang_file);
}
// The path to each flag
$path = $config['path']['flags'] . $flag . '.gif';
// Add current language to the language bar
$lang_bar .= '<a href="?lang=' . $lang_file . '" title="'. $lang[$lang_file] . '"><img src="' . $path . '" alt="' . $lang[$lang_file] . '" border="0" /></a>' . "\n";
}
}
}
/* Include the given or an alternative language file */
function include_lang_file($name)
{
if (!empty($name))
{
// Also make the config and page arrays available
global $config, $page;
// Make the path to the language file
$path = $config['path']['lang'];
$path .= $name == 'all' ? 'lang.all.php' : $page['lang'] . '/lang.' . $name . '.php';
if (file_exists($path))
{
include $path;
}
// Try to include another file if enabled in the config
elseif ($name != 'all' && $config['inc_alt_lang'])
{
global $user_langs;
// Make the path to an alternative language file
$alt_path = '';
// Select the first user language which is available
foreach ($user_langs as $user_lang)
{
if (file_exists($config['path']['lang'] . $user_lang . '/lang.' . $name . '.php'))
{
$alt_path = $config['path']['lang'] . $user_lang . '/lang.' . $name . '.php';
// Stop searching
break;
}
}
// If still no language has been found, use the default one
if (empty($alt_path))
{
$alt_path = $config['path']['lang'] . $config['default_lang'] . '/lang.' . $name . '.php';
}
// Try to include the language file;
if (file_exists($alt_path))
{
include $alt_path;
}
}
}
// Make globally available
return $GLOBALS['lang'] = array_merge($GLOBALS['lang'], $lang);
}