Вопрос

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

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

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

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

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

Спасибо.

Это было полезно?

Решение

Способ, которым я проектировал базу данных ранее, заключается в том, чтобы иметь таблицу новостей, содержащую базовую информацию, такую как 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"]>>

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

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

Предупреждение:Я не 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

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

Минусы Gettext

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

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

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

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

для статического контента вы можете использовать просто.Он использует Java РесурсБундлs, чтобы добиться этого.мне удалось получить Пакет с поддержкой базы данных работаю с помощью этого сайта.

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

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

@Аурон

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top