Как бы вы превратили уже существующее веб-приложение в многоязычное? - PullRequest
21 голосов
/ 01 октября 2008

Я собираюсь поработать над проектом, в котором нужно настроить довольно большое веб-приложение для работы с несколькими языками. Эта штука работает с созданным вручную PHP-кодом, но она довольно чистая.

Мне было интересно, как лучше всего это сделать?

  1. Создание чего-то самостоятельно, пытаясь соответствовать реальной архитектуре.

  2. Переписать большую его часть с помощью фреймворка (например, Symfony), который будет управлять i18n для меня?

Для варианта 1, где мне хранить данные i18n? * .po, xliff, чистая БД?

Я подумал об альтернативе: использовать Symfony только для перевода, но настроить контроллер так, чтобы он загружал сайт как есть. Быстро, но грязно. С другой стороны, это позволяет нам вносить следующую модификацию, медленно переходя к полной версии Symfony: этот веб-сайт действительно является хорошим кандидатом для этого.

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

Ответы [ 6 ]

15 голосов
/ 01 октября 2008

Работа с языковыми файлами.

  1. Заменить каждую текстовую строку переменной
  2. Создайте один языковой файл для каждого языка и определите в нем каждую переменную с соответствующим текстом. (французский, голландский, немецкий ...)
  3. Включите нужный файл на каждой странице.

Это для небольших сайтов.

Если размер станет больше, замените файлы БД. :)

11 голосов
/ 25 октября 2009

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

правый. Решения. На основании того, что вы не хотите переписывать сайт, просто клонируйте ваш сайт и переведите копии на целевой язык. Предполагая, что база кода стабильна, вы можете использовать VCS для управления любыми изменениями кода. Вы можете настроить отдельные части сайта в соответствии с целевым языком, например, французский текст в среднем на 30% больше, чем эквивалентный текст на английском языке, поэтому использование одного сайта для этого означает, что у вас могут возникнуть проблемы с форматированием, и вам придется поменять разные CSS файлы в зависимости от языка. Это может показаться неуклюжим способом сделать это, но как долго эти сайты будут существовать? Расходы на управление этим способом могут быть меньше, чем другие варианты.

Второй способ без перестройки. Замените все содержимое на текущем сайте тегами, а затем поместите другой язык в таблицы файлов или базы данных, найдите требуемый язык пользователей (есть ли у вас зарегистрированные пользователи, которые могут сделать предпочтение, или вы хотите получить языковой тег браузера или это будет URL dot-com, точка-франк, точка-де, которая делает выбор), а затем замените теги на целевой язык. Затем вам нужно решить проблемы с размерами и изображениями отдельно. Это решение действует, когда фреймворки, такие как Symfony и Zend, реализуют l10n.

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

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

3 голосов
/ 25 октября 2009

Важно отметить, что перед переводом необходимо выполнить два шага:

  1. Интернационализация: то есть, позволяя вашему сайту обрабатывать несколько языков
  2. Локализация: включает перевод ваших текстов (полученных на шаге 1) на каждый язык, который вы планируете поддерживать

Подробнее об этом в Википедии .

Шаг 1 потребует от вас принять во внимание тот факт, что некоторые языки написаны справа налево (RTL) и неевропейские символы, такие как японский или китайский. Если вы не планируете обрабатывать эти языки и символы, это может быть проще.

Для ситуаций такого типа я предпочел бы иметь языковой файл (фактически столько языковых файлов, сколько языков, которые я планирую поддерживать, именуя каждый как langcode.php, как в en.php или fr.php) с ассоциативным массивом, содержащим все тексты, используемые на сайте. Процедура будет выглядеть следующим образом:

  1. Сканирование вашего сайта для каждого текста, который должен быть локализован
  2. Для каждой страницы / раздела я бы создал $lang['sectionname'][] массив
  3. Для каждого текста я бы создал $lang['sectionname']['textname'] запись
  4. Я бы создал класс Lang.php, который получал бы параметр lang при создании экземпляра, но имел бы значение по умолчанию, если не получено lang (этот метод загружает langcode.php в зависимости от параметра или значение по умолчанию в зависимости от ваш предпочитаемый язык)
  5. У класса будет setPage() метод, который получит страницу / раздел, который вы будете отображать
  6. Класс будет иметь метод show(), который будет получать текст для отображения (show() будет вызываться столько раз, сколько текстов отображается на данной странице ... show() является своего рода оболочкой для echo $lang['mypage']['mytext'])

Таким образом, вы можете легко получить столько языков, сколько захотите. У вас даже может быть администратор языка, на котором вы открываете страницу базового языка (вы на самом деле просто рекурсивно читаете массивы и отображаете их в текстовых областях), а затем можете «Сохранить как ...» на другом языке.

Я использую аналогичный подход в моем сайте . Это всего лишь одна страница, но я сделал многостраничных сайтов с этой идеей.

Если у вас есть пользовательский контент или какая-то довольно сложная CMS, это будет другая история. Вы можете искать i18n-friendly фреймворки (на ум приходит Drupal).

2 голосов
/ 01 октября 2008

Вы можете посмотреть на Zend_Translate , это довольно всеобъемлющий, хорошо документированный, и общее качество кода великолепно. Это также позволяет вам использовать унифицированный API для gettext, csv, db, ini-файлов, массивов или чего угодно, в чем вы сохраняете переведенные строки.

Кроме того, посмотрите / просмотрите эту ветку: Каковы хорошие инструменты / фреймворки для i18n из кодовой базы php? . Похоже на ваш вопрос.

1 голос
/ 01 октября 2008

Если это поддержка многобайтовых символов, возможно, стоит проверить многобайтовые строковые функции в PHP:

http://uk.php.net/manual/en/book.mbstring.php

Они будут лучше обрабатывать многобайтовые символы.

0 голосов
/ 25 октября 2009

Я использую параметр hl и gettext, комбинируя уже имеющиеся переводы движка с собственным .po, что заставляет новые переводы и языки появляться, когда engine или мой пример django / gae добавляет:

{% get_current_language as LANGUAGE_CODE %}{{ LANGUAGE_CODE }}{% get_available_languages as LANGUAGES %}{% for LANGUAGE in LANGUAGES %}{% ifnotequal LANGUAGE_CODE LANGUAGE.0 %}{{ LANGUAGE.0 }}{% endifnotequal %}{% endfor %}

Таким образом, за исключением дубликатов и полного использования уже существующих переводов, здесь пропущены, например, названия арабских месяцев, которые появляются непосредственно при добавлении команды разработчиков или app

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...