Я уже много месяцев борюсь с этим вопросом, но я не был в ситуации, когда мне нужно было изучить все возможные варианты раньше. Сейчас я чувствую, что мне пора познакомиться с возможностями и создать собственные личные предпочтения в моих будущих проектах.
Позвольте мне сначала набросать ситуацию, которую я ищу
Я собираюсь обновить/переработать систему управления контентом, которую я использую довольно долгое время. Тем не менее, я чувствую, что многоязычность - это большое улучшение этой системы. Раньше я не использовал никаких фреймворков, но я собираюсь использовать Laraval4 для предстоящего проекта. Laravel кажется лучшим выбором более чистого способа программирования PHP. Sidenote: Laraval4 should be no factor in your answer
. Я ищу общие способы перевода, которые независимы от платформы/рамки.
Что следует перевести
Поскольку система, которую я ищу, должна быть максимально удобной для пользователя, метод управления переводом должен находиться внутри CMS. Не нужно будет запускать FTP-соединение для изменения файлов перевода или любых шаблонов, обработанных html/php.
Кроме того, я ищу самый простой способ перевести несколько таблиц базы данных, возможно, без необходимости создания дополнительных таблиц.
Что я придумал сам
Как я уже сам искал, читал и пробовал. Есть несколько вариантов, которые у меня есть. Но я до сих пор не чувствую, что достиг наилучшего метода для того, чего я действительно ищу. Прямо сейчас, это то, что я придумал, но этот метод также имеет побочные эффекты.
- PHP Parsed Templates: система шаблонов должна анализироваться PHP. Таким образом, я могу вставить переведенные параметры в HTML, не открывая шаблоны и не изменяя их. Кроме того, PHP-шаблоны дают мне возможность иметь 1 шаблон для всего веб-сайта вместо того, чтобы иметь подпапку для каждого языка (что у меня было раньше). Для достижения этой цели можно использовать Smarty, TemplatePower, Laravel Blade или любой другой парсер шаблонов. Как я уже сказал, это должно быть независимым от письменного решения.
- База данных Driven: возможно, мне не нужно упоминать об этом еще раз. Но решение должно быть основано на базе данных. CMS нацелен быть объектно-ориентированным и MVC, поэтому мне нужно будет думать о логической структуре данных для строк. Поскольку мои шаблоны будут структурированы: шаблоны /Controller/View.php, возможно, эта структура будет иметь наибольший смысл:
Controller.View.parameter
. В таблице базы данных эти поля будут длинными с полемvalue
. Внутри шаблонов мы можем использовать некоторый метод сортировки типаecho __('Controller.View.welcome', array('name', 'Joshua'))
, а параметр содержитWelcome, :name
. Таким образом, результатWelcome, Joshua
. Это хороший способ сделать это, потому что параметры, такие как: имя, легко понять в редакторе. - Низкая загрузка базы данных. Конечно, указанная выше система будет загружать нагрузку на базу данных, если эти строки будут загружены на ходу. Поэтому мне понадобится система кэширования, которая повторно отображает языковые файлы, как только они будут отредактированы/сохранены в среде администрирования. Поскольку файлы сгенерированы, необходим хороший формат файловой системы. Думаю, мы можем пойти с
languages/en_EN/Controller/View.php
или .ini, что вам больше всего подходит. Возможно, даже .ini даже разобрался быстрее. Этот файл должен содержать данные вformat parameter=value;
, Я думаю, это лучший способ сделать это, так как каждый View, который отображается, может включать в себя его собственный языковой файл, если он существует. Параметры языка затем должны быть загружены в определенное представление, а не в глобальную область, чтобы предотвратить переписывание параметров друг от друга. - Перевод таблицы базы данных: на самом деле это то, о чем я больше всего беспокоюсь. Я ищу способ создания переводов Новости/Страницы/и т.д. как можно быстрее. Наличие двух таблиц для каждого модуля (например,
News
иNews_translations
) является вариантом, но, похоже, много работы для получения хорошей системы. Одна из вещей, которые я придумал, основана на системеdata versioning
, которую я написал: есть одно имя таблицы базы данныхTranslations
, эта таблица имеет уникальную комбинациюlanguage
,tablename
иprimarykey
. Например: en_En/News/1 (ссылка на английскую версию статьи новостей с ID = 1). Но есть два огромных недостатка в этом методе: в первую очередь эта таблица имеет тенденцию довольно долгое время с большим количеством данных в базе данных, а во-вторых, было бы неплохо использовать эту настройку для поиска в таблице. Например. поиск SEO-пуля элемента будет полным текстовым поиском, который довольно тупой. Но, с другой стороны, это быстрый способ создания переводимого контента в каждой таблице очень быстро, но я не верю, что этот pro перегружает консоль. - Работа с интерфейсом. Кроме того, интерфейсу потребуется некоторое мышление. Разумеется, мы сохранили бы доступные языки в базе данных и (де) активны те, которые нам нужны. Таким образом, script может генерировать выпадающий список, чтобы выбрать язык, а внутренний сервер может автоматически решить, какие переводы можно сделать с помощью CMS. Выбранный язык (например, en_EN) затем будет использоваться при получении языкового файла для представления или для правильного перевода элемента контента на веб-сайте.
Итак, вот они. Мои идеи до сих пор. Они даже не включают параметры локализации для дат и т.д. Однако, поскольку мой сервер поддерживает PHP5.3.2 +, лучшим вариантом является использование расширения intl, как описано здесь: http://devzone.zend.com/1500/internationalization-in-php-53/ - но это было бы полезно на любом последующем стадионе развития. На данный момент основная проблема заключается в том, как лучше всего использовать перевод текста на веб-сайте.
Помимо всего, что я объяснил здесь, у меня есть еще одна вещь, которую я еще не решил, это выглядит как простой вопрос, но на самом деле это давало мне головные боли:
Перевод URL-адресов? Должны ли мы это делать или нет? и каким образом?
Итак, если у меня есть этот url: http://www.domain.com/about-us
, а английский - мой язык по умолчанию. Должен ли этот URL-адрес переводиться в http://www.domain.com/over-ons
, когда я выбираю голландский язык как мой язык? Или мы должны идти по легкой дороге и просто изменять содержимое страницы, видимое на /about
. Последнее не похоже на допустимый вариант, потому что это приведет к созданию нескольких версий одного и того же URL-адреса, что приведет к неправильному индексированию содержимого.
Другим вариантом является использование http://www.domain.com/nl/about-us
. Это создает по крайней мере уникальный URL для каждого контента. Также было бы легче перейти на другой язык, например http://www.domain.com/en/about-us
, а предоставленный URL-адрес легче понять как для посетителей Google, так и для людей. Используя этот параметр, что нам делать с языками по умолчанию? Должен ли язык по умолчанию удалять выбранный по умолчанию язык? Поэтому перенаправление http://www.domain.com/en/about-us
на http://www.domain.com/about-us
... По моему мнению, это лучшее решение, потому что, когда CMS настроен только для одного языка, нет необходимости указывать этот идентификатор в URL-адресе.
И третий вариант - комбинация из обоих вариантов: с использованием "language-ident-less--URL" (http://www.domain.com/about-us
) для основного языка. И используйте URL-адрес с переведенным блоком SEO для подъязыков: http://www.domain.com/nl/over-ons
и http://www.domain.com/de/uber-uns
Надеюсь, мой вопрос заставит вас взломать головы, они наверняка треснули мои! Это помогло мне уже сейчас разобраться в этом вопросе. Дала мне возможность просмотреть методы, которые я использовал раньше, и идею, которую я имею для моей предстоящей CMS.
Я хотел бы поблагодарить вас за то, что вы нашли время, чтобы прочитать эту кучу текста!
// Edit #1
:
Я забыл упомянуть: функция __() является псевдонимом для перевода данной строки. Внутри этого метода, очевидно, должен быть какой-то метод возврата, когда текст по умолчанию загружается, когда еще нет доступных переводов. Если перевод отсутствует, он должен быть вставлен или файл перевода должен быть регенерирован.