За последние 24 часа нас посетили 16736 программистов и 1621 робот. Сейчас ищут 867 программистов ...

Организация многоязычности

Тема в разделе "PHP для новичков", создана пользователем VLK, 31 янв 2014.

  1. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Делаю свою мини CMS и в ней планируется (уже есть) многоязычность, т.е. пользователь заходит на сайт, определяется его язык и ему подается соответствующий контент.

    Проблем со страницами нет, вопрос возникает со словами типа "Войти", "Регистрация".

    Суть вопроса, я опишу как я это реализовал, может кто-нибудь посоветуют что то более дельное.

    У меня все устроенно так, есть 3 файла:
    1. шаблон
    2. специальный класс со статическими методами который обслуживает шаблоны и подачу этих слов
    3. файл с языковым пакетом О_о

    на деле это выглядит так (все в урезанном виде, для большего понимания):
    файл с языковым пакетом (pack.php):
    Код (Text):
    1. <?php
    2.  
    3. $pack = array (
    4. 'enter' => 'Войти',
    5. 'register' => 'Регистрация',
    6. 'forgot_password' => 'Забыли пароль?',
    7. );
    8.  
    9. ?>
    файл с классом обслуживающим шаблоны (tpl.php):
    Код (Text):
    1. <?php
    2.  
    3. class tpl {
    4.  
    5. // данная функция выводит шаблон на страницу
    6. static function main () {
    7. // тут происходит подключение файла с самим шаблоном (html кодом)
    8. include ('main_tpl.php');
    9. }
    10.  
    11. static $pack;
    12.  
    13. static function gw($key) {
    14.  
    15. if (tpl::$pack) {
    16. return tpl::$pack[$key];
    17. }
    18.  
    19. else {
    20.  
    21. // подключаю файл в котором содержится языковой пакет
    22. // !!! так же подключается пакет с соответствующим языком, тут это не показано, но оно есть
    23. include ('pack.php');
    24.  
    25. // из него копирую в статическую переменную, что бы каждый раз не подключать один и тот же файл
    26. tpl::$pack = $pack;
    27.  
    28. // отправляю нужное слово
    29. return tpl::$pack[$key];
    30. }
    31.  
    32. }
    33.  
    34.  
    35.  
    36. }
    37.  
    38. ?>
    шаблон (main_tpl.php):
    Код (Text):
    1. <!DOCTYPE html>
    2.  
    3. <html>
    4. <head>
    5. <meta charset="UTF-8">
    6. <title></title>
    7. </head>
    8. <body>
    9. <!-- предположим что за место тегов "p" у нас ссылки на регистрацию, вход и т.д. -->
    10.  
    11. <p><?php echo tpl::gw('forgot_password'); ?></p>
    12.  
    13. <p><?php echo tpl::gw('register'); ?></p>
    14.  
    15. <p><?php echo tpl::gw('enter'); ?></p>
    16.  
    17. </body>
    18. </html>
    Кто, что может посоветовать лучше?
     
  2. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Ну дык, так оно и делается. Либо через константы. В зависимости от языка подключаешь к модулю нужный пакет. Если пакета нужного нет - подключаешь какой-нибудь по умолчанию.
     
  3. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    Код (PHP):
    1.     public function t($token, $domain = 'common')
    2.     {
    3.         $lang = $this->lang;
    4.         if (!isset($this->base[$lang][$domain])) {
    5.             $this->base[$lang][$domain] = $this->loader->load($lang, $domain);
    6.         }
    7.         if (!isset($this->base[$lang][$domain][$token])) {
    8.             return $token;
    9.         }
    10.  
    11.         return $this->base[$lang][$domain][$token];
    12.     }
    13.  
     
  4. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    artoodetoo, правильно ли я понимаю что это будет многомерный массив типа:

    Код (Text):
    1. $lang = array(
    2. 'ru' => array( /* *** */ ),
    3. 'en' => array( /* *** */ )
    4. );
    не знаю даже, я только начал у меня массив только с одним языком занимает 6 кб. а если все вместе держать..
     
  5. imoisey

    imoisey Активный пользователь

    С нами с:
    27 янв 2014
    Сообщения:
    113
    Симпатии:
    0
    Мне кажется, лучше создавать отдельные языковые файлы и в зависимости от выбранного языка подключать нужный файл.
     
  6. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    VLK, в данном спримере
    $lang это просто строка — название текущего языка/локали: "ru" или "en" или "en_US" как угодно.
    $domain это предметная область. если не указано, то берется по умолчанию "common"
    $token это то, что переводим

    а вот $base это то что ты имел в виду ))) массив переводов выбранной предметной области попадает в $base[$lang][$domain]
     
  7. Invision

    Invision Активный пользователь

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
  8. d1gi

    d1gi Активный пользователь

    С нами с:
    24 май 2009
    Сообщения:
    326
    Симпатии:
    0
  9. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    это смешные цифры. читай код — набор переводов для связки (язык + предметная область) грузится только по требованию. как правило, в одном запросе используется только один язык и пара домейнов.