Здравствуй хабранарод! Хотелось бы поговорить на тему реализации многоязычного сайта на движке CakePHP. Совсем недавно пришлось с этим столкнуться, и я попробую описать как мне удалось сделать сайт на трёх языках. Если у кого-то есть какие-то идеи и реализации на данную тему буду очень рад почитать, потому как мой метод мне кажется не очень хорошим.
В общем дело было так…
В CakePHP уже есть возможность создавать сайты на нескольких языках, с помощью класса локализации.
Для того чтобы её использовать нужно в классе вашего контроллера прописать следующий код:
После чего необходимо в каталоге /app/locale/eng/LC_MESSAGES создать файл default.po — таким образом все сообщения будут доступны во всех видах вашего сайта.
Прописать необходимые msgid и msgstr для английского языка. И соотвественно если необхидмы другие языки то нужно будет создать дополнительный каталоги с названием языка. Например /app/locale/rus/LC_MESSAGES/default.po
Файлы *.po заполняются особым образом (обязательно необходимо, чтобы эти файлы были в кодировке UTF8, иначе могут возникнуть проблемы.) Также можно воспользоваться специальной программой Poedit
Для примера заполним следующие файлы текстом:
После чего в зависимости от того, какой вам нужен язык в своём контроллере прописываем:
Также можно это реализовать с помощью Cookies. Например просто записывать в них какой язык сейчас использует пользователь на сайте.
В видах вашего приложение необходимый текст выводится следующим образом:
Если будет eng — то в заголовке сайта будет текст Simple title, и соответственно если rus — Заголовок сайта.
Заголовки страницы, текст, и всё что могло быть на разных языках хранился следующим образом:
title_rus
title_eng
text_rus
text_eng
Т.е. каждое поле пришлось повторять для каждого языка отдельно. Я не знаю насколько это действующий метод и на сколько он хороший, но я буду очень признателен, если кто напишет, как именно нужно хранить информацию на разных языках в базе, буду очень благодарен.
В общем дело было так…
В CakePHP уже есть возможность создавать сайты на нескольких языках, с помощью класса локализации.
Для того чтобы её использовать нужно в классе вашего контроллера прописать следующий код:
App::import('Core','l10n');
class AppController extends Controller
{
// .. и т.д.
}
После чего необходимо в каталоге /app/locale/eng/LC_MESSAGES создать файл default.po — таким образом все сообщения будут доступны во всех видах вашего сайта.
Прописать необходимые msgid и msgstr для английского языка. И соотвественно если необхидмы другие языки то нужно будет создать дополнительный каталоги с названием языка. Например /app/locale/rus/LC_MESSAGES/default.po
Файлы *.po заполняются особым образом (обязательно необходимо, чтобы эти файлы были в кодировке UTF8, иначе могут возникнуть проблемы.) Также можно воспользоваться специальной программой Poedit
Для примера заполним следующие файлы текстом:
/app/locale/rus/LC_MESSAGES/default.po
msgid "title_text"
msgstr "Заголовок сайта"
/app/locale/eng/LC_MESSAGES/default.po
msgid "title_text"
msgstr "Simple title"
После чего в зависимости от того, какой вам нужен язык в своём контроллере прописываем:
class YourController extends AppController
{
function index()
{
$this->L10n = new L10n();
//Если нужен английский
$this->L10n->get('eng');
}
}
Также можно это реализовать с помощью Cookies. Например просто записывать в них какой язык сейчас использует пользователь на сайте.
class YourController extends AppController
{
function index()
{
$this->L10n = new L10n();
$lang_attr = $this->Cookie->read('lang'); //--Читаем язык и куки
if (!empty($lang_attr)) // ---- Если всё хорошо то ставим язык из куки
$this->L10n->get($lang_attr);
else // ---- Если нет то ставим по умолчанию
$this->L10n->get('eng');
}
}
В видах вашего приложение необходимый текст выводится следующим образом:
<html>
<head><title><?__('title_text')?></title></head>
<body>
</body>
</html>
Если будет eng — то в заголовке сайта будет текст Simple title, и соответственно если rus — Заголовок сайта.
Реализация остального контента:
Заголовки страницы, текст, и всё что могло быть на разных языках хранился следующим образом:
title_rus
title_eng
text_rus
text_eng
Т.е. каждое поле пришлось повторять для каждого языка отдельно. Я не знаю насколько это действующий метод и на сколько он хороший, но я буду очень признателен, если кто напишет, как именно нужно хранить информацию на разных языках в базе, буду очень благодарен.