Я собираюсь работать над проектом, в котором довольно большое веб-приложение нужно настроить для работы с несколькими языками. Эта штука работает с PHP-кодом, созданным вручную, но довольно чистым.
Мне было интересно, как лучше всего это сделать?
Делал что-то самостоятельно, пытаясь подогнать под реальную архитектуру.
Переписывать большую часть его с помощью фреймворка (например, Symfony), который будет управлять i18n за меня?
Для варианта 1 где мне хранить данные i18n? * .po, xliff, чистая БД?
Я подумал об альтернативе: использовать Symfony только для перевода, но настроить контроллер на загрузку веб-сайта как есть. Быстро, но грязно. С другой стороны, это позволяет нам сделать следующую модификацию, медленно продвигаясь к полной версии Symfony: этот веб-сайт действительно хороший кандидат для этого.
Но, возможно, есть отдельные механизмы перевода, которые справятся с этой задачей лучше, чем вся веб-платформа. Это немного похоже на использование базуки, чтобы убить муху ...






Работа с языковыми файлами.
Это для небольших сайтов.
Если становится больше, замените файлы на БД. :)
Этот ответ должен быть первым, поскольку он одновременно прост и эффективен.
Элегантный? Простой? О нет. @Veynom абсолютно прав, когда говорит, что это для небольших сайтов. Когда вы открываете свой код и видите переменные вместо текстовых строк на английском языке (или на вашем родном языке), это становится все более и более громоздким в обслуживании.
Вы можете взглянуть на Zend_Translate, это довольно исчерпывающий, хорошо документированный и в целом качество кода отличное. Это также позволяет вам использовать унифицированный API для gettext, csv, db, ini-файла, массива или всего, что вы в конечном итоге сохраняете в своих переведенных строках, в формате.............................................................................................................................................................................................................................................................
Также посмотрите эту ветку: Какие хорошие инструменты / фреймворки для i18n из php codebase?. Это похоже на ваш вопрос.
Ссылка мертвая, к сожалению (
Если это поддержка многобайтовых символов, возможно, стоит проверить функции многобайтовых строк в 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 %}
Таким образом, избегая дублирования и полностью используя уже имеющиеся переводы, мы можем указать здесь отсутствующие, например, арабские названия месяцев, которые будут появляться непосредственно либо при добавлении команды движка, либо при приложение
Есть несколько способов решить эту проблему. Ни один из них не является «лучшим способом», и все они имеют проблемы в краткосрочной или долгосрочной перспективе. Первое, что нужно сказать, это то, что многоязычные сайты - это непросто, переводчики и милые люди, но с ними сложно работать, и большинство программистов видят в этой проблеме чисто техническую проблему. Есть также другое измерение, выходящее за рамки этого ответа, относительно того, переводите ли вы или локализируете. Это включает в себя изучение культурных традиций целевой аудитории, а затем адаптацию языка, стиля, макета, цвета, шрифта и т. д. К этой культуре. Наконец, не используйте машинный перевод (машинный перевод) ни для чего серьезного или если он должен быть точным, и при найме переводчиков убедитесь, что они переводят с иностранного языка на свой родной язык, что означает, что они понимают все нюансы целевого языка.
Верно. Решения. Исходя из того, что вы не хотите переписывать сайт, просто клонируйте имеющийся у вас сайт и переводите копии на целевой язык. Предполагая, что кодовая база стабильна, вы можете использовать VCS для управления любыми изменениями кода. Вы можете настроить отдельные части сайта, чтобы они соответствовали целевому языку, например, текст на французском языке в среднем на 30% больше, чем эквивалентный текст на английском языке, поэтому использование одного сайта для доставки означает, что у вас могут (возникнуть) проблемы с форматированием, и вам потребуется поменять местами разные файлы css в зависимости от языка. Это может показаться неуклюжим способом сделать это, но тогда как долго будут существовать сайты? Затраты на управление таким образом могут быть меньше, чем при использовании других вариантов.
Второй способ без перестройки. Замените весь контент на текущем сайте тегами, а затем поместите другой язык в таблицы файлов или db, обнюхайте желаемый язык пользователей (есть ли у вас зарегистрированные пользователи, которые могут указать предпочтения, или вы хотите получить тег языка браузера, или это будет URL-адрес dot-com dot-fr, dot-de, который сделает выбор), а затем замените теги на целевой язык. Затем вам нужно решить проблемы с размером и изображениями отдельно. Это решение действует, когда такие фреймворки, как Symfony и Zend, реализуют l10n.
Затем вы можете перестроить с помощью фреймворка или gettext и, возможно, получить более чистое решение, но помните, что фреймворки были разработаны для решения других проблем, а не для перевода, и компонент перевода вошел в структуру как частичное решение, а не полное.
Большая проблема со всеми решениями - постоянное обслуживание. Потому что у вас есть не только кодовая база, но и несколько языковых баз, которые нужно поддерживать. Если вы все в одном решении действительно умно и эффективно, текущая задача будет сложной.
Важно отметить, что перед переводом необходимо выполнить два этапа:
См. Больше об этом в Википедии..
Шаг 1 потребует от вас принять во внимание тот факт, что некоторые языки пишутся справа налево (RTL) и неевропейские символы, такие как японский или китайский. Если вы не планируете обрабатывать эти языки и символы, это может быть проще.
Для такого типа ситуаций я бы предпочел иметь языковой файл (фактически столько языковых файлов, сколько языков, которые я планирую поддерживать, называя каждый как langcode.php, как в en.php или fr.php) с ассоциативным массивом, содержащим все тексты, используемые на сайте. Процедура будет выглядеть следующим образом:
$lang['sectionname'][]$lang['sectionname']['textname']Lang.php, который получал бы параметр lang при создании экземпляра, но имел бы значение по умолчанию в случае, если lang не получен (этот метод загружает langcode.php в зависимости от параметра или значения по умолчанию в зависимости от вашего предпочтительного языка)setPage(), который получит страницу / раздел, который вы будете отображать.show(), который будет получать отображаемый текст (show() будет вызываться столько раз, сколько тексты отображаются на данной странице ... show() является своего рода оболочкой для echo $lang['mypage']['mytext'])Таким образом, у вас может быть столько языков, сколько вы хотите, очень простым способом. У вас даже может быть языковой администратор, где вы открываете страницу своего базового языка (на самом деле вы просто рекурсивно читаете массивы и отображаете их в текстовых областях), а затем можете «Сохранить как ...» на каком-то другом языке.
Я использую аналогичный подход в мой сайт. Это всего лишь одна страница, но я сделал многостраничные сайты с этой идеей.
Другое дело, если у вас есть пользовательский контент или какая-то довольно сложная CMS. Вы можете поискать фреймворки, дружественные к i18n (на ум приходит Drupal).
Локализация - это не перевод текста. Локализация скорее адаптируется к регионам, валюте, культуре, аудитории и т. д.
вы правы в том, что перевод - это часть локализации: «Локализация - это процесс адаптации интернационализированного программного обеспечения для определенного региона или языка путем добавления компонентов, зависящих от локали, и перевода текста». (Википедия)
Я думаю, что это очень элегантное решение, не знаю, почему у него всего 3 голоса за.