Делаю свою мини CMS и в ней планируется (уже есть) многоязычность, т.е. пользователь заходит на сайт, определяется его язык и ему подается соответствующий контент. Проблем со страницами нет, вопрос возникает со словами типа "Войти", "Регистрация". Суть вопроса, я опишу как я это реализовал, может кто-нибудь посоветуют что то более дельное. У меня все устроенно так, есть 3 файла: 1. шаблон 2. специальный класс со статическими методами который обслуживает шаблоны и подачу этих слов 3. файл с языковым пакетом О_о на деле это выглядит так (все в урезанном виде, для большего понимания): файл с языковым пакетом (pack.php): Код (Text): <?php $pack = array ( 'enter' => 'Войти', 'register' => 'Регистрация', 'forgot_password' => 'Забыли пароль?', ); ?> файл с классом обслуживающим шаблоны (tpl.php): Код (Text): <?php class tpl { // данная функция выводит шаблон на страницу static function main () { // тут происходит подключение файла с самим шаблоном (html кодом) include ('main_tpl.php'); } static $pack; static function gw($key) { if (tpl::$pack) { return tpl::$pack[$key]; } else { // подключаю файл в котором содержится языковой пакет // !!! так же подключается пакет с соответствующим языком, тут это не показано, но оно есть include ('pack.php'); // из него копирую в статическую переменную, что бы каждый раз не подключать один и тот же файл tpl::$pack = $pack; // отправляю нужное слово return tpl::$pack[$key]; } } } ?> шаблон (main_tpl.php): Код (Text): <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <!-- предположим что за место тегов "p" у нас ссылки на регистрацию, вход и т.д. --> <p><?php echo tpl::gw('forgot_password'); ?></p> <p><?php echo tpl::gw('register'); ?></p> <p><?php echo tpl::gw('enter'); ?></p> </body> </html> Кто, что может посоветовать лучше?
Ну дык, так оно и делается. Либо через константы. В зависимости от языка подключаешь к модулю нужный пакет. Если пакета нужного нет - подключаешь какой-нибудь по умолчанию.
Код (PHP): public function t($token, $domain = 'common') { $lang = $this->lang; if (!isset($this->base[$lang][$domain])) { $this->base[$lang][$domain] = $this->loader->load($lang, $domain); } if (!isset($this->base[$lang][$domain][$token])) { return $token; } return $this->base[$lang][$domain][$token]; }
artoodetoo, правильно ли я понимаю что это будет многомерный массив типа: Код (Text): $lang = array( 'ru' => array( /* *** */ ), 'en' => array( /* *** */ ) ); не знаю даже, я только начал у меня массив только с одним языком занимает 6 кб. а если все вместе держать..
Мне кажется, лучше создавать отдельные языковые файлы и в зависимости от выбранного языка подключать нужный файл.
VLK, в данном спримере $lang это просто строка — название текущего языка/локали: "ru" или "en" или "en_US" как угодно. $domain это предметная область. если не указано, то берется по умолчанию "common" $token это то, что переводим а вот $base это то что ты имел в виду ))) массив переводов выбранной предметной области попадает в $base[$lang][$domain]
это смешные цифры. читай код — набор переводов для связки (язык + предметная область) грузится только по требованию. как правило, в одном запросе используется только один язык и пара домейнов.