Для всего, что не касается контента (текст статей и тд), заводится отдельный файл с текстом для всех нужных языков. Это самый популярный метод, при этом самый быстрый и никакой зависимости от бд. Лично у меня файлы локализации хранятся по пути
lang/ru-RU/*.php, lang/en-US/*.php
, сами файлы имеют структуру:
<?php
return [
"login" => [
"buttonText" => "Вход",
"form" => [
"bla", => [], // любая вложенность
],
],
];
Пара небольших классов считывают нужные файлы локализации и предоставляют доступ к любым полям:
$lang = Lang::get("login");
echo $lang->buttonText;
echo $lang->form->bla->blabla->blablablabla; // любая вложенность
Для контента, проще создавать отдельные статьи, а в тегах указывать перевод, а в статье ссылки на оригинал (в сайте и в бд ничего менять не надо).