Pull to refresh

Моя реализация локализации интерфейса в PHP

Reading time2 min
Views3.5K
Текущее положение дел такое, что очень часто приходится реализовывать мультиязычность в своих работах. Вроде бы техники хорошо описаны и проблем не должно быть, но я решил пойти своим путем.

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

На текущий момент мне известны такие реализации:
  • В файле, предположим, ru.php есть код: $language['site_title'] = 'Заголовок сайта'; В php или smarty используем этот массив и выводим текст чем-то похожим на {$language.site_title}
  • Использование расширения GetText (с функцией для smarty)
  • Использование smarty config (или реализации мультиязычности в шаблонизаторе quicky) (на самом деле, по моему, это вариации первого варианта)
  • Использование функций в smarty, с которой идет обращение к базе данных или глобальной переменной (фактически тоже вариации на тему первого пункта)

Теперь описание моего варианта.
Есть таблица надписей (phraze_id, language_id, value) в которой хранится весь статический контент сайта, так-же есть таблица языков (language_id, title). Это те таблицы с которыми мы будем работать. Теперь рассмотрим папку с шаблонами. Есть папка, предположим users в которой хранятся исходные шаблоны (templates/users) и есть папка временных шалонов (tmp/users). Теперь самый интересный момент. В исходных шаблонах на месте надписей пишем что-то типа [phraze{site_title}]. При изменении надписей в админке или по крону (это уже частная реализация) я перегенирирую шаблоны (заменяю [phraze{site_title}] на «Заголовок сайта» ) и схораняю измененный шаблон в папке tmp/users/ru или tmp/users/en в зависимости от языка. Тут надо только «сказать» smarty откуда брать шаблоны. Такая реализация позволяет избежать расходов на постоянный вызов функции/доставания с базы и делать это только по определенному событию.
Tags:
Hubs:
+5
Comments10

Articles