Я сделал CMS, используя PHP и MYSQL для серверной части. Проблема в том, что я хотел бы, чтобы сайт был доступен на нескольких языках; Итак, я уже перевел сам CMS и поместил его в файлы вроде:
Это прекрасно работает для самого содержимого CMS, например, для администрирования и т. Д. Фактическая проблема возникает, когда я пытаюсь перевести сайт дальше: посты и страницы блогов хранятся в базе данных, поэтому они динамические. Структура таблицы моих страниц выглядит следующим образом:
urlname | name | id | content | position | hidden | redirect | type | permission
Поэтому, если бы я перевел страницу, например, на голландский, я не хочу создавать новую таблицу с именем pages_nl
например, потому что большая часть информации будет такой же, как в другой таблице.
Я мог бы добавить строку, которая содержит доступные языки страницы, и заставить php читать массив и анализировать, если текущий $lang
соответствует одному из доступных языков страницы, а затем прочитайте content_nl
а также name_nl
строка в качестве примера.
Та же проблема возникла бы с моими сообщениями в блоге, и я искал решение, но большинство результатов были для конкретных CMS и просто плагинов.
Я спрашиваю, что было бы лучшим способом (и структурой базы данных) для хранения многоязычных страниц / постов, где языки могли бы быть добавлены динамически и иметь запасной вариант исходного контента, если нет переведенной версии.
В основном вы добавляете lang-ключ к вашей базе данных
urlname | name | id | content | position | hidden | redirect | type | permission | lang
Теперь допустим, что приходит запрос на страницу с 5 элементами содержимого. Ваша CMS сначала ищет записи с определенным lang-кодом, например, nl. Если он не находит запись с кодом языка, он возвращается к языку по умолчанию и принимает эту запись.
Допустим, вы перевели Содержание 1, 3 и 5:
Content 1 Content 1 nl
Content 2
Content 3 Content 3 nl
Content 4
Content 5 Content 5 nl
Result:
Content 1 nl
Content 2
Content 3 nl
Content 4
Content 5 nl
Другой способ — сделать перевод в файлах шаблонов (как это делает magento).
В magento у вас есть что-то вроде этого:
"Hello, this is the " . $this->__("English") . " page"
И файлы переводов. Например, lang.nl:
"English", "Dutch"
В этом случае у вас будет только 1 элемент контента, но вы завернете каждый элемент, который должен быть переведен. Это также работает с изображениями и всем, что вы хотите. Вы также можете абстрагировать эту оболочку для работы в бэкэнд-редакторе RTE. Например, вы напишите Hello, this is the English page
в вашем бэкэнде тогда отметьте English
и нажмите кнопку перевода. Это добавит тэг вокруг английского языка, и при рендеринге контента вы сканируете эти тэги и замените его, если найдете какой-либо перевод для этой строки на запрошенном языке.
Других решений пока нет …