Search
Write a publication
Pull to refresh

CakePHP — многоязычность

Здравствуй хабранарод! Хотелось бы поговорить на тему реализации многоязычного сайта на движке CakePHP. Совсем недавно пришлось с этим столкнуться, и я попробую описать как мне удалось сделать сайт на трёх языках. Если у кого-то есть какие-то идеи и реализации на данную тему буду очень рад почитать, потому как мой метод мне кажется не очень хорошим.

В общем дело было так…

В 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

Т.е. каждое поле пришлось повторять для каждого языка отдельно. Я не знаю насколько это действующий метод и на сколько он хороший, но я буду очень признателен, если кто напишет, как именно нужно хранить информацию на разных языках в базе, буду очень благодарен.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.