Я уже несколько месяцев бьюсь над этим вопросом, но у меня не было ситуации, в которой мне нужно было бы изучить все возможные варианты раньше. Прямо сейчас я чувствую, что пришло время узнать о возможностях и создать свое личное предпочтение для использования в моих будущих проектах.
Позвольте мне сначала набросать ситуацию, которую я ищу
Я собираюсь обновить / перестроить систему управления контентом, которую я использую уже довольно давно. Тем не менее, я чувствую, что мультиязычность - большое улучшение этой системы. Раньше я не использовал никаких фреймворков, но я собираюсь использовать 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's Blade или любой другой анализатор шаблонов. Как я уже сказал, это должно быть независимым от письменного решения.
- Управление базой данных : возможно, мне не нужно упоминать это снова. Но решение должно основываться на базе данных. CMS предназначена для объектно-ориентированного и MVC, поэтому мне нужно подумать о логической структуре данных для строк. Поскольку мои шаблоны будут структурированы: шаблоны / Controller / view.php возможно эта структура имеет смысл использовать :
Controller.View.parameter
. Таблица базы данных будет иметь эти поля long сvalue
полем. Внутри шаблонов мы можем использовать какой-то метод сортировки, например,echo __('Controller.View.welcome', array('name', 'Joshua'))
и параметр содержитWelcome, :name
. Таким образом, результатWelcome, Joshua
. Это кажется хорошим способом сделать это, потому что такие параметры, как: name, легко понять редактору. - Низкая загрузка базы данных : Конечно, вышеуказанная система будет вызывать загрузку базы данных, если эти строки загружаются на ходу. Поэтому мне нужна система кеширования, которая повторно отображает языковые файлы, как только они редактируются / сохраняются в среде администрирования. Поскольку файлы генерируются, необходима также хорошая структура файловой системы. Я думаю, мы можем пойти с
languages/en_EN/Controller/View.php
или .ini, что вам больше подходит. Возможно, .ini даже быстрее разбирается в конце. Это должно содержать данные вformat parameter=value;
. Я предполагаю, что это лучший способ сделать это, так как каждый представленный вид может включать свой собственный языковой файл, если он существует. Затем языковые параметры должны быть загружены в конкретное представление, а не в глобальную область видимости, чтобы параметры не перезаписывали друг друга. - Перевод таблицы базы данных : это то, что меня больше всего беспокоит. Я ищу способ создания переводов новостей / страниц / и т. Д. как можно быстрее. Наличие двух таблиц для каждого модуля (например,
News
иNews_translations
) - вариант, но кажется, что нужно много работать, чтобы получить хорошую систему. Одна из вещей , которые я придумал основан наdata versioning
системе , которую я написал: одно имя таблицы базы данныхTranslations
, эта таблица имеет уникальное сочетаниеlanguage
,tablename
иprimarykey
, Например: en_En / News / 1 (ссылается на английскую версию новости с идентификатором = 1). Но у этого метода есть два огромных недостатка: во-первых, эта таблица имеет тенденцию получать довольно много времени с большим количеством данных в базе данных, и, во-вторых, использование этой установки для поиска в таблице было бы адской работой. Например, поиск поискового SEO-элемента - это полнотекстовый поиск, который довольно глуп. Но с другой стороны: это быстрый способ очень быстро создавать переводимый контент в каждой таблице, но я не верю, что этот профессионал перевешивает доводы "против". - Работа с внешним интерфейсом. Кроме того, клиенту нужно подумать. Конечно, мы будем хранить доступные языки в базе данных и (де) активировать те, которые нам нужны. Таким образом, сценарий может создать раскрывающийся список для выбора языка, а серверная часть может автоматически решить, какие переводы можно выполнить с помощью 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-идентификации-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
:
Я забыл упомянуть: функция __ () является псевдонимом для перевода заданной строки. В этом методе, очевидно, должен быть какой-то резервный метод, в котором текст по умолчанию загружается, когда еще нет доступных переводов. Если перевод отсутствует, он должен быть либо вставлен, либо файл перевода должен быть восстановлен.