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

StackOverflow https://stackoverflow.com/questions/156911

Вопрос

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

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

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

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

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

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

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

Это было полезно?

Решение

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

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

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

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

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

Другие советы

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

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

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

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

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

  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-дружественные фреймворки (на ум приходит Drupal).

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

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

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

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

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

Я использую параметр hl и gettext, комбинируя уже существующие переводы движка с собственным .po, что приводит к появлению новых переводов и языков, когда движок или мой 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 %}

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top