Пишем класс мультиязычности сайта на php (Rating: +3)

Print RSS
Доброго времени суток!
Вот решил написать простой и удобный класс для реализации мультиязычности для Вашего сайта.
Итак начнем!
Структура у нас будет следующего вида:
dir: [b]/[/b]
     - dir: [b]i18n[/b]
          - file: [b]ru.php[/b] // тут будут переводы
     - dir: [b]system[/b]
          - file: [b]config.php[/b] // тут будут настройки
          - file: [b]lang.php[/b] // доп. функционал
          - file: [b]i18n.php[/b] // тут собственно сам класс
     - file: [b]index.php[/b]
Создаем файл index.php.
Содержимое:
<?php
include_once ('system/lang.php'); // Подключаем класс
echo __('Test') . '<br />'; // проверка
?>
Создаем папку system.
Создаем в папке system файл config.php.
Содержимое:
<?php
$langs = array('ru', 'en'); // массив с доступными языками
$default_lang = 'ru'; // Язык по умолчанию 
?>
Теперь перейдем к самому классу.
Создаем в папке system файл i18n.php.
Содержимое:
<?php
class I18n {
    /** задаем язык классу **/
    public static $lang = 'en';
    /** задаем путь к папке где лежат файлы с языками **/
    public static $path = 'i18n';
    /** кеширование **/
    protected static $_cache = array();
    
    /** задаем язык. Пример I18n::lang('ru') **/
    public static function lang($lang) {
        I18n::$lang = $lang;
        return I18n::$lang;
    }
    
    /** функция отвечающая за вывод **/
    public static function get($string, $lang = NULL) {
        if (!$lang) {
            $lang = I18n::$lang;
        }
        $table = I18n::load($lang);
        if (isset($table[$string])) {
            return $table[$string];
        }
        return $string;
    }
    
    /** функция отвечающая за загрузку файла с переводами **/
    public static function load($lang) {
        if (isset(I18n::$_cache[$lang])) {
            return I18n::$_cache[$lang];
        }
        $table = array();
        $path = I18n::$path . DIRECTORY_SEPARATOR . $lang . '.php';

        if (file_exists($path)) {
            $table = array_merge_recursive($table, include($path));
        }

        return I18n::$_cache[$lang] = $table;
    }

}
?>

В папке system создаем файл lang.php

<?php
header('Content-Type: text/html; charset=utf-8'); // задаем кодировку (это я для теста писал)
include('config.php'); // подключаем настройки
include('i18n.php');

// Здесь переключение языков
if (!empty($_GET['lang']) && in_array($_GET['lang'], $langs)) {
    setcookie('lang', $_GET['lang']);
    $allowed_lang = $_GET['lang'];
} elseif (!empty($_COOKIE['lang']) && in_array($_COOKIE['lang'], $langs)) {
    $allowed_lang = $_COOKIE['lang'];
} else {
    $allowed_lang = $default_lang;
}

I18n::lang($allowed_lang);

if (!function_exists('__')) {
    // функция __() выводит переведенную строку
    // Если такой строки нету в словаре, то выводит значение $string
    function __($string) {
        return I18n::get($string);
    }

}
?>

Создаем папку i18n в ней файл ru.php
Содержание:
<?php
return array(
    'Test' => 'Тест',
);
?>

Ну вот и все. Все работает)
Следующая статья будет о том как установить и настроить локальный веб сервер на виртуальной машине VitrualBox (debian). P.S. сайты будут доступны и на самой хост машине (т.е. на Windows 7)
Added:
Rating: +3
Views: 3618
Comments (6) »