Статьи

Реализация многоязычной поддержки

Создание многоязычного сайта может быть хорошим способом привлечь новых клиентов в ваш бизнес или привлечь больше участников в ваш проект. Перевод простого сайта с несколькими статическими страницами, вероятно, не будет сложным, но более сложные веб-приложения на PHP могут потребовать большой работы при запуске поддержки нескольких языков. В этой статье я представлю различные типы контента, которые необходимо учитывать при интернационализации сайта. Читайте дальше, чтобы узнать, как справиться с переводом их на разные языки.

Многоязычный статический контент

Прежде всего, ваш сайт, вероятно, содержит текстовое содержимое, жестко запрограммированное в файлах проекта, которое необходимо перевести на другие языки. Текстовые строки в файлах шаблонов или уведомления, которые обрабатываются в сценарии PHP, являются примерами такого содержимого. Если вы не планировали выходить на международный уровень при написании этих частей кода, вам придется пройтись по каждой строке и обработать перевод текстовых строк, хранящихся там.

Но как сделать фактические переводы? Распространенным способом обработки многоязычного контента является использование Gettext — программного решения, созданного для обработки переводов в приложениях, написанных на разных языках программирования. Он также доступен в PHP как отдельное расширение . Использование Gettext позволяет отделить переводы приложения от исходного кода. В результате, лицо, ответственное за подготовку переводов, не должно копаться в коде и может работать независимо от веб-разработчика. Когда переводы готовы, они помещаются в отдельный файл, который читается скриптом PHP. Приложение сопоставляет переводы с исходными текстовыми строками, хранящимися в коде, и, наконец, конечный пользователь может видеть сайт, отображаемый на правильном языке.
Как разработчику нужно преобразовать строки простого текста в приложении PHP в строки, которые могут быть переданы Gettext. Вы должны обернуть текст в функцию gettext (), к которой обычно обращаются, используя псевдоним _() Делая это, вы указываете, что определенная текстовая строка должна быть переведена и может быть обработана Gettext.
Если вы хотите узнать подробности о том, как управлять переводами Gettext в приложении PHP, есть полное руководство, подробно объясняющее предмет, написанное Абдуллой Абузекри: Локализация приложений PHP «Правильный путь» . Я рекомендую вам прочитать его, чтобы увидеть некоторые практические примеры логики, которую я описал выше.
Также помните, что если вы используете фреймворк в качестве основы для своего PHP-приложения, возможно, в нем есть компонент, отвечающий за управление переводами. Просмотрите документацию своей платформы, чтобы проверить, существуют ли какие-либо инструменты, упрощающие работу с поддержкой нескольких языков.

Содержание базы данных

В более сложных приложениях большая часть контента сайта может храниться в базе данных. Если сайт поддерживает только один язык, вам просто нужно сохранить одну версию ресурса, которая выбирается при необходимости. Но реализация многоязычного сайта требует от вас изменения способа хранения данных в базе данных. Специфичные для языка ресурсы теперь должны быть идентифицированы языковым кодом и должны быть выбраны в языковой версии, установленной посетителем. Для вас как для разработчика это означает, что вам, вероятно, придется изменить структуру базы данных, чтобы иметь возможность обрабатывать переводы.

Чтобы узнать, каковы лучшие рекомендации по созданию структуры базы данных для многоязычного сайта, вы можете просто взглянуть на решения, которые используются различными платформами. Некоторые структуры предлагают behaviors После прикрепления поведения перевода к модели, среда будет записывать и читать версии данных на разных языках, используя структуру базы данных, которая способна поддерживать поддержку нескольких языков.

Например, платформа CakePHP предлагает поведение Translate, которое может быть присоединено к вашим моделям. Для этого необходимо указать, какие поля модели зависят от языка. Представим, что у вас есть таблица articlestitletext

Чтобы сохранить переводы, вам нужно переместить эти зависящие от языка поля в отдельную таблицу переводов. Каждая строка в таблице переводов идентифицируется по языковой версии, модели и имени поля, относящегося к базовой таблице. Таким образом, таблица articles

Заголовок и текст статьи были перенесены в отдельную таблицу с переводами. Как видите, один перевод каждого из этих полей хранится в отдельной строке:

Что наиболее важно, платформа CakePHP автоматически обрабатывает чтение и запись в базу данных переведенных данных. После добавления поведения Translate вы можете вызывать методы модели так же, как и раньше, и среда связывает основную таблицу с самой таблицей переводов. Вам не нужно беспокоиться о создании объединений в операторах выбора или вставке данных в несколько таблиц при сохранении новой строки. Просто просмотрите документацию, чтобы увидеть некоторые примеры кода обработки переводов таким способом.

Другие структуры часто предлагают аналогичные решения, подобные описанному выше. Если вы используете платформу Symfony2 с Doctrine ORM , просто проверьте переводимое поведение Doctrine, чтобы увидеть пример. Если ваш сайт не работает на какой-либо платформе, вы можете обратиться к решениям, описанным выше, при реализации собственного способа обработки переводов в базе данных.

Пользователь представил контент

Если ваш сайт позволяет посетителям оставлять комментарии или отзывы, связанные с публикацией или продуктом, вам также придется обрабатывать переводы такого контента.

Прежде всего, вам необходимо сохранить языковую версию контента, введенного пользователем при отправке формы. Вы, вероятно, просто должны предположить, что он соответствует языковой версии сайта, установленной пользователем. Вы также можете использовать внешний API (например, Google Translate API ) для определения языка конкретного текста.

Затем вам нужно перевести данный текст на все языковые версии, которые поддерживаются вашим сайтом. Вместо того, чтобы делать это вручную, вы можете просто использовать внешний API, который предоставит вам машинные переводы контента, представленного посетителями вашего сайта. На сайте ProgrammableWeb перечислено более 60 API-интерфейсов перевода, доступных через Интернет, поэтому вы, вероятно, легко найдете решение, соответствующее вашим потребностям. Если вы ищете конкретное руководство по реализации API перевода в приложении PHP, я рекомендую вам прочитать мои статьи об API Переводчика Google:
Использование Google Translate API с PHP, который объясняет основы интеграции PHP-скрипта с API,
Автоматический перевод пользовательского контента с использованием Google Translate API , который содержит полный пример кода о том, как обрабатывать перевод пользовательского контента на веб-сайте PHP.

Конечно, вы можете не переводить предоставленный пользователем контент и отображать его на языке оригинала. Но, по моему мнению, отображение машинных переводов лучше, чем отображение контента на другом языке, даже если переводы, извлеченные из API, не идеальны.

Ресурсы

Поскольку ваш сайт, вероятно, состоит не только из текстового контента, вам также придется обрабатывать переводы различных ресурсов, которые размещаются на ваших веб-страницах. Изображения, видео, вложения, файлы PDF — все эти типы контента также должны обрабатываться. Чтобы упростить способ отображения правильной версии файла на веб-странице, вы можете хранить все файлы в структуре каталогов, которая отражает языки, доступные на сайте. Английская версия файла будет храниться в каталоге enfr Затем вы можете написать простой вспомогательный метод, который будет извлекать нужный файл на основе языковой версии, которая в данный момент задается пользователем. Если существует конкретная версия ресурса по умолчанию, вы можете расширить метод и извлечь файл по умолчанию, если версия для конкретного языка не была найдена.

Другие типы контента

Обработка переводов типов контента, описанных выше, часто оказывается недостаточной для создания сайта, который полностью поддерживает версии на разных языках. Помните, что сайт PHP часто включает в себя другие источники контента. Код JavaScript, который изменяет дерево DOM или отображает уведомления, часто содержит текстовые строки, которые необходимо перевести. Также не забудьте установить правильную языковую версию при использовании внешних API или виджетов, которые прикреплены к вашим веб-страницам (например, социальные плагины). Просмотр вашего сайта до реализации многоязычной поддержки может предоставить вам больше типов контента, которые необходимо учитывать при подготовке переводов.

Резюме

Как вы можете видеть, запуск сайта с поддержкой нескольких языков требует, чтобы вы по-разному обрабатывали перевод различных типов контента. Если вы планируете переводить свой сайт, я рекомендую вам составить контрольный список типов переводов, которые необходимо выполнить. Это может послужить хорошей отправной точкой для оценки объема работы, которую необходимо выполнить, и выполнения переводов.

Если у вас есть какие-либо вопросы или комментарии относительно статьи, не стесняйтесь размещать их ниже. Вы также можете связаться со мной через Google Plus .