Многоязычное PHP-приложение: лучшая практика? - PullRequest
5 голосов
/ 14 мая 2011

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

  • в папке / app я создал папку / languages, которая содержит один файл на язык (english.php, spanish.php и т. Д.)
  • каждый файл содержит серию переменных с одинаковыми именами в каждом файле, содержащую тексты для отображения в представлениях
  • эти переменные затем отображаются в разных представлениях
  • переменная «language» cookie обновляется, когда пользователь меняет язык
  • в контроллере каждого представления я включаю языковой файл в следующем формате:

включает $ _SERVER ['DOCUMENT_ROOT']. "/ app / languages ​​/". $ _COOKIE ["language"]. ".Php";

Звучит довольно аккуратно для меня. Будете ли вы негативно относиться к этому методу?

Ответы [ 4 ]

4 голосов
/ 14 мая 2011

Поскольку вы работаете на PHP 5.3.2, я определенно рекомендую проверить расширение intl , если вы можете. Он полон удобных функций и классов, чтобы помочь в i18n. Например, вы можете использовать следующий фрагмент кода, чтобы сгенерировать «наиболее подходящий» язык для вашего посетителя из доступных вам:

$langs = array('en', 'fr', 'de');
$preferences = Locale::acceptFromHttp($_SERVER['HTTP_ACCEPT_LANGUAGE']);
$locale = Locale::lookup($langs, $preferences);

Также есть над чем подумать, кроме прямой замены слова в слово. Разные языки имеют разные соглашения о форматировании. В этой Zend статье содержится много информации, которая может оказаться полезной.

Мой код использует XSL для создания шаблонов лично, когда дело доходит до переводов, я использую языковые файлы XML и запросы XPath, так что языковой файл может быть понят непосредственно шаблонами, но также доступен PHP для форматирования строк с MessageFormatter .

Я бы не стал использовать базу данных как хранилище, если честно, просто для производительности.

1 голос
/ 18 августа 2011

Поскольку у вас есть только данные в языковых файлах, я бы рекомендовал использовать GetText . Это порт стандартного GetText C ++ для интернационализации, существует множество инструментов для создания языковых файлов, и он очень быстр благодаря компилируемым файлам во время выполнения.

Вы по существу создаете свои файлы данных (например, fr.po , en.po ) с помощью своего рода формата INI-файлов и компилируете эти файлы в специализированные .mo -files ( fr.mo , en.mo , ...) и просто отображают интернационализированные строки со статической функцией _(), например echo _("Hello World"); выдаст немецкий вывод Hallo Welt или (если в .mo-файлах нет перевода) строку по умолчанию Hello World.

Что касается выбора правильного языка: это зависит от ваших требований. Как уже указывалось, вы должны использовать Accept-language -Header заголовка браузера и, возможно, захотите добавить поддержку перезаписи через информацию о сеансе.

1 голос
/ 14 мая 2011

только некоторые мысли

  • Если у вас есть один файл для каждого языка и на вашем сайте более нескольких страниц, вы быстро потеряете информацию о том, какой тег содержит какой текст на какой странице
  • Как вы гарантируете, что при создании нового тега есть теги на всех других языках и что они переведены?
  • как вы справляетесь с форматированием для разных языков? Романские языки, как правило, примерно на 30% длиннее английских, поэтому могут испортить поток страниц.
  • В том же духе, что насчет иврита, который справа налево (RTL), а не LTR, как с европейским языком? Или китайцы и японцы с потенциально разными линейными потоками и без пробелов?
  • Как вы переводите? Экспортировать файлы и импортировать их снова? Намереваетесь ли вы использовать xliff или версию TMX или gettext, чтобы облегчить жизнь переводчикам и снизить затраты на перевод?
  • Как вы проверяете переводы?
1 голос
/ 14 мая 2011

Вы также можете проанализировать заголовок accept-language, чтобы решить, что делать.

Accept-Language:en-GB,en-US;q=0.8,en;q=0.6

Моя выглядит так. Это не доказательство, но это может быть способ автоматически установить соответствующий файл cookie.

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