Как вы создаете многоязычный веб-сайт? - PullRequest
6 голосов
/ 02 сентября 2008

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

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

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

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

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

Спасибо.

Ответы [ 5 ]

14 голосов
/ 03 сентября 2008

Предупреждение: я не хакер Java, так что 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 Минусы

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

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

6 голосов
/ 02 сентября 2008

Способ, которым я раньше проектировал базу данных, состоит в том, чтобы иметь таблицу новостей, содержащую основную информацию, такую ​​как NewsID (int), NewsPubDate (datetime), NewsAuthor (varchar / int), а затем иметь связанную таблицу NewsText, которая имеет следующие столбцы: NewsID (int), NewsText (текст), NewsLanguageID (int). И, наконец, у вас есть Language-таблица, в которой есть LanguageID (int) и LanguageName (varchar).

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

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

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

2 голосов
/ 09 сентября 2008

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

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

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

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

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

1 голос
/ 16 сентября 2008

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

1 голос
/ 04 сентября 2008

@ Орон

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

Похоже, что хорошая реализация Java

...