Как вы строите многоязычный веб-сайт?

Друг мой теперь создает веб-приложение с J2EE и Struts, и он будет готов отображать страницы на нескольких языках.

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

welcome.english = "Welcome!"
welcome.spanish = "¡Bienvenido!"
...

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

Как вы создаете базу данных для поддержки такого рода реализации?

Спасибо.

Ответ 1

Они, как я разработал базу данных до того, чтобы иметь Новости-таблица, содержащая основную информацию, как NewSID (INT), NewsPubDate (DateTime), NewsAuthor (VARCHAR/INT) и затем связанную таблицу NewsText, которая имеет следующие столбцы: NewsID (int), NewsText (текст), NewsLanguageID (int). И, наконец, у вас есть языковая таблица, которая имеет LanguageID (int) и LanguageName (varchar).

Затем, когда вы хотите показать своим пользователям страницу новостей:

SELECT NewsText FROM News INNER JOIN NewsText ON News.NewsID = NewsText.NewsID
WHERE NewsText.NewsLanguageID = <<Session["UserLanguageID"]>>

Этот бит сеанса является локальной переменной, в которой вы сохраняете язык пользователя при первом входе в систему или входе в нее.

Ответ 2

Предупреждение: я не хакер, поэтому YMMV, но...

Проблема с использованием списка "свойств" заключается в том, что вам нужно много дисциплины. Каждый раз, когда вы добавляете строку, которая должна выводиться пользователю, вам нужно открыть файл свойств, посмотрите, находится ли эта строка (или что-то примерно эквивалентное ей) уже в файле, а затем перейдите и добавьте новое свойство если это не так. Кроме того, вам нужно надеяться, что файл свойств будет достаточно читабельным для пользователя/редактируемым, если вы хотите передать его внешней команде перевода.

Подход, основанный на базе данных, полезен для всего содержимого на основе базы данных. В идеале вы хотите упростить связывание фрагментов контента с их переводами. Это действительно действительно падает для всех мест, которые вы, возможно, захотите вывести то, что находится вне базы данных (сообщения об ошибках и т.д.).

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

echo _("Please do not press this button again");

Затем запуск инструментов gettext поверх исходного кода будет извлекать все экземпляры, завернутые в файл po. Это будет содержать такие записи, как:

#: myfolder/my.source:239
msgid "Please do not press this button again"
msgstr ""

И вы можете добавить перевод в соответствующее место:

#: myfolder/my.source:239
msgid "Please do not press this button again"
msgstr "s’il vous plaît ne pas appuyer sur le bouton ci-dessous à nouveau"

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

Gettext Pros

  • Не мешает при кодировании
  • Очень легко добавлять переводы.
  • Файлы PO могут быть скомпилированы для скорости
  • Доступны библиотеки для большинства языков/платформ.
  • Есть хорошие кросс-платформенные инструменты для работы с переводами. На самом деле вы можете настроить команду перевода, используя poEdit, чтобы упростить управление проектами перевода

Gettext Cons

  • Решает потребности вашего сайта в "мебели", но вам, как правило, по-прежнему нужен подход, основанный на базе данных для контента, управляемого базой данных.

Для получения дополнительной информации о gettext см. эту страницу в Википедии

Ответ 3

Java-приложения Java поддерживают интернационализацию с использованием стандартной библиотеки тегов java.

У вас действительно есть 2 проблемы. Статический контент и динамический контент.

для статического контента вы можете использовать jstl. Для этого он использует java ResourceBundle. Мне удалось получить Databased backed bundle, работающий с помощью этого сайта.

Вторая проблема - динамический контент. Чтобы решить эту проблему, вам необходимо сохранить данные, чтобы вы могли получать разные переводы на основе пользовательской локали. (Locale включает страну и язык).

Это не тривиально, но это то, что вы можете сделать с небольшим планированием впереди.

Ответ 4

@Auron

это то, к чему мы его применим. Наши приложения - все PHP, но gettext имеет длинное наследие.

Похоже, существует хорошая реализация Java

Ответ 5

Библиотеки тегов прекрасны, если вы используете JSP, но вы также можете достичь I18N с использованием технологии на основе шаблонов, например FreeMarker.