Интернационализация и локализация в PHP (часть 2)

84 дн. назад

Итак, в прошлый раз разговор был о Symfony. Сегодня речь пойдет о Akelos. Кто не в курсе Akelos, скажу лишь то, что этот фреймворк является полным клоном RoR с единственным отличием – написан он на PHP. Правда ли это для вопросов интернационализации я не знаю. Но как бы то ни было все равно посмотрим, что Akelos нам приготовил.

Пару слов о документации

Как таковой для Akelos ее нет. Есть пару отписок, небольшой Readme, плюс сгенерированная с помощью phpxref дока и демонстрационный скринкаст. Все. Может быть в этом плане разработчик понадеялся на прошлый опыт с Ruby On Rails. Не знаю, но факт, как говорится, на лицо и с этим следует смириться. В оправдание могу сказать, что фреймворк достаточно само документированный и разобраться как и что происходит не составляет особого труда. Исходники благо открыты для любого применения.

Интернационализация интерфейса, сообщений и тд

Здесь Akelos ничем примечательным от Symfony не отличается. Если помните в Symfony для проблемы поддержки нескольких языков и стран использовался параметр Culture ( язык_СТРАНА в двухбуквенных кодах). Akelos используют более простую модель. В файле config задаются разрешенные локали, которые можно увидеть в банальном HTTP-заголовке «Accept-Language» (например, «ru, en_us»). После того как настроены необходимые языки Akelos будет самостоятельно создавать и следить за словарями для этих языков с помощью специального метода t() или специальных тегов _{} в виде.

Каждый раз когда вызываются эти методы, фреймворк, во-первых, обновит словарь, если переданного слова или фразы не будет в словаре, и, во-вторых, при выводе возьмет перевод слова или фразы из словаре, соответствующему выбранной локали.

Для того, чтобы сменить локаль достаточно в URL добавить код языка. Например, вот так будет выглядить классическая строка с доступными языками:


  <div align="right">
    <?php echo $url_helper->link_to($controller->t('en'), array('lang' => 'en')) ?> | 
    <?php echo $url_helper->link_to($controller->t('de'), array('lang' => 'de')) ?> | 
    <?php echo $url_helper->link_to($controller->t('ru'), array('lang' => 'ru')) ?> | 
  </div>

Это все. Akelos по щелчку на ссылку прибавит к URL выбранный язык. И даже более того, во-всех ссылках, созданных с помощью link_to(), отобразится изменения, связанные с выбором языка. Ни о чем разработчику беспокоится не приходится.

Что касается словарей, то никого XML подобия вы не встретите. Обыкновенные ассоциативные массивы:


$dictionary = array();
$dictionary['Pages'] = 'Страницы';
$dictionary['OK'] = 'OK';
$dictionary['Cancel'] = 'Отмена';

Локализация содержимого

Если с интернационализацией интерфейса все очень просто и понятно, то почему же должно быть по-другом с содержимым подумали разработчики и упростили работу нам до безобразия.

Для начала следует обьявить что твоя любимая модель имеет многоязыковую структуру и что даже несколько столбцов в соответствующей ей таблицы из базы данных имеет перевод на другие языки мира. Как это делается? А вот так:


    function up_1()
    {
        $this->createTable('pages', "
          id,
          en_title,
          de_title,
          ru_title,
          en_body text,
          de_body text,
          ru_body text
        ");
    }

Все это естественно должно находится в инсталлере приложения. Как видите, в одной таблице мы имеет сразу же и английский, и немецкий, и русский вариант заголовка и текста страницы. Ну что же, разработчики доупрощались настолько, что нарушили святые нормальные формы старика Кодда, так ревностно оберегаемые математиками и профессорам ВУЗов. Мне если честно, такой поворот событий тоже не очень нравится. Не правильно это по единственной простой причине – если не все страницы могут быть переведены на все три языка, то на что будет похожа наша таблица? Пустое пространство – это не есть хорошо и все-таки следует беречь ресурсы данные нам Богом.

Ну оставим и пойдем дальше. Дальше никаких сюрпризов не ожидается. Все те же get- и set-методы автоматом подхватываются фрейморков. И мы просто лениво наслаждаться тем, что мир прекрасен и чуден, и все так хорошо и просто. На всякий случай приведу пример как же это делается:

Контроллер:


$this->Page->setAttribute('title', $this->params['title']);
$this->Page->setAttribute('body', $this->params['body']);
$this->Page->save();

Вид:


<h1>En</h1>
<p> <label for=“page_title”>_{Title}</label><br /> <?php echo $form_helper->text_field(‘title’, ‘en’)?> </p>

<p> <label for=“page_body”>_{Body}</label><br /> <?php echo $form_helper->text_area(‘body’, “en”) ?>
</p>

<h1>Ru</h1>
<p> <label for=“page_title”>_{Title}</label><br /> <?php echo $form_helper->text_field(‘title’, ‘ru’)?>
</p>

<p> <label for=“page_body”>_{Body}</label><br /> <?php echo $form_helper->text_area(‘body’, ‘ru’) ?>
</p>

Модель (инсталлер):


$this->createTable('pages', "
  id,
  en_title,
  ru_title,
  en_body text,
  ru_body text
");

И все. Красота да и только.

Выводы

Akelos прост на уровня интуитивного понимания. Конечно хранение в одной таблицы сразу всех версий контента не очень красиво. Гораздо приятным в этом отношении выглядит Symfony, которые как заядлый отличник старается все время вытянуть на пятерку.

Но и у Symfony есть свои недостатки, которые, как мне кажется, все-таки сглаживаются на больших проектах. Взять хотя бы тот же XML для словарей. Его неудобно писать вручную. Но кто знает, возможно на большом сайте такой необходимости уже и не будет, так как можно будет использовать генерирующие XLIFF программы.

По большому счету, что Akelos, что Symfony — без разницы. Все они используют ту же модель – хеллпер, словарь, ORM, автоматом подхватывающие get- и set-методы.

Надеюсь, что это небольшая обзорная статья в чем-то поможет в реализации многоязычных приложения самостоятельно. Курс и направление движения есть. Существуют ли какие-либо другие варианты? Наверняка существуют. Если мне что-нибудь интересного в этом плане попадется, обязательно напишу.

В следующей статье я планирую немножко развить эту тему и немножко отойти к другой. Меня интересует ORM-фреймворк Doctrine. Что за вкусности там есть, опять же поддержка интернационализации, удобно ли пользоваться, насколько эффективен для применения «один разработчик – небольшой приложение». Словом, не буду загадывать – все равно сами все увидите.

Дмитрий Науменко

,

Комментарии

---

Опять гоню на блогосферу

84 дн. назад

Философ Мартин Хайдеггер обратил внимание на то, что человеческие существа привыкли воспринимать мир как бездонный источник сырья, которое в любой момент можно переработать на что-нибудь более стоящее. Лес на дрова. Зверей на мясо. У него это называется миром сырых натуральных ресурсов: Bestand. И люди, которые не имеют доступа к натуральному бештанду, то есть к нефтяным скважинам или алмазным копям, естественным образом обращаются к тому единственному ресурсу, который у них есть, — к собственным жизням.

Бештандом нашей эры во все большей степени становится наша интеллектуальная собственность. Наши идеи. Наш опыт. Все, что люди привыкли терпеть, и все, от чего они привыкли получать удовольствие, — всю эту паутину, сотканную из мелких бытовых навыков, медовых месяцев и онкологических диагнозов, — теперь можно продать. Секрет ремесла прост: нужно быть очень внимательным. И все записывать.

p Эти слова сказаны Чаком Палаником. Иногда писателей читать полезно. Хотя бы потому что такие люди подмечают то, что ты в своей профессии и жизни ни за что бы не подметил.

Я вспоминаю маркетинговую белиберду в книге «Бизнес в стили фанк». Один из загонов звучал примерно так: «Карл Маркс был прав. Ленин был прав. Троцкий был прав. Они говорили, что средства производства должны принадлежать народу. В этом они правы. В наше время главное средство производство — это небольшой по размеру орган весом в несколько килограмм, который называется твой мозг. И ты его единственный владелец.»

Это просто удивительно, как слова сказанные когда-то давно сбываются в наше время. Пелевин говорил про телевизоры. Паланик говорит про бештанд из собственной жизни. И что же сейчас происходит?

Журнал «Business Week» публикует статью про то как «social media change your life». Народ в восторге от блогов. Куда не ступи — новая социальная сеть просит тебя погундеть на своих просторах. Хз. Может быть так и надо.

Дмитрий Науменко

,

Комментарии

---

На работе было скучно

86 дн. назад

Ради собственного удовольствия и выгоды сделал news headlines . Теперь я знаю, с чего начинать прогулки по интернету.

Дмитрий Науменко

,

Комментарии

---

Читаю

87 дн. назад

Подсел на Esquire. Начал читать с первого номера.

Дмитрий Науменко

,

Комментарии

---

Две картинки Симпсонов

89 дн. назад

Так получилось, что искал с помощью Гугля картинку, которая бы по смыслу подходила под прошлый пост. Как видите не нашел, но зато наткнулся на несколько работ иллюстратора spacecoyote . На его сайте одно только аниме и прочая чуть, так что можно и его мило проигнорировать.

Что там есть интересного, так это известная картинка из «The Simpons»:

Только нарисованная в стиле аниме:

Вот так. Слава богу, что Симпсонов снимают не японцы. Надеюсь, что кого-то это и улыбнуло, а то все пхп, пхп.

Дмитрий Науменко

,

Комментарии

---

« старше