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

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

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

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

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

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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
23
0
8 758
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

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

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

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

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

Я думаю, что это очень элегантное решение, не знаю, почему у него всего 3 голоса за.

Yoni Hassin 07.04.2013 05:18

Этот ответ должен быть первым, поскольку он одновременно прост и эффективен.

Ahmad 06.01.2016 13:20

Элегантный? Простой? О нет. @Veynom абсолютно прав, когда говорит, что это для небольших сайтов. Когда вы открываете свой код и видите переменные вместо текстовых строк на английском языке (или на вашем родном языке), это становится все более и более громоздким в обслуживании.

Andre Polykanine 23.03.2016 02:29

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

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

Ссылка мертвая, к сожалению (

Andre Polykanine 23.03.2016 02:31

Если это поддержка многобайтовых символов, возможно, стоит проверить функции многобайтовых строк в 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. Интернационализация: то есть позволяет вашему сайту работать на нескольких языках.
  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).

Локализация - это не перевод текста. Локализация скорее адаптируется к регионам, валюте, культуре, аудитории и т. д.

Gumbo 25.10.2009 20:19

вы правы в том, что перевод - это часть локализации: «Локализация - это процесс адаптации интернационализированного программного обеспечения для определенного региона или языка путем добавления компонентов, зависящих от локали, и перевода текста». (Википедия)

mga 25.10.2009 21:09

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