Какое решение для многоязычного веб-дизайна наиболее быстро для пользователя, если это действительно проблема? - PullRequest
2 голосов
/ 10 ноября 2009

Контекст:

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

Дилемма:

Мне интересно, как мне предлагать эти разные языки (и, возможно, больше в будущем).

Критерий:

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

Выбор:

В настоящее время я могу придумать (и прочитал о) следующие варианты. До сих пор они сортируются в порядке предпочтения.

  1. Хранить все языковые строки в базе данных и получить хороший в зависимости от предпочтительного языка (участники могут выбрать, какой язык они предпочитают), язык браузера по умолчанию и который язык выбирается во время текущий сеанс, в таком порядке.

    Плюсы:

    • Большую часть времени, один тест в начале сессии подтверждает, какой язык использовать для оставшаяся часть сеанса (сохраняется в переменной SESSION). В противном случае, пользователь, входящий в систему, также получает правильный язык и держит его до он / она выходит из системы (никаких дальнейших тестов). Так что часть тестирования должна быть довольно быстро.

    Минусы:

    • Боюсь, что доступ к База данных все время будет довольно трудоемкий (более длительная загрузка страницы для пользователь), особенно учитывая что многие пользователи также могут быть доступ к базе данных в то же время по той же причине (получение текста сайта на правильном языке), но также для размещения комментариев и тому подобное.
    • Строки, которые включают переменные (например, "Hello" + user.name + ", как ты? ") труднее сохранить, потому что переменная (например, имя пользователя) меняется для каждого пользователя.
    • Прямая ссылка на портал для определенного языка будет некрасивой (например, www.site.com?lang=es)
  2. Хранить все строки, зависящие от языка в текстовом файле и получить хороший в зависимости от предпочтительного языка (участники могут выбрать, какой язык они предпочитают), язык браузера по умолчанию и который язык выбирается во время текущий сеанс, в таком порядке.

    Плюсы:

    • Большую часть времени, один тест в начале сессии подтверждает, какой язык использовать для оставшаяся часть сеанса (сохраняется в переменной SESSION). В противном случае, пользователь, входящий в систему, также получает правильный язык и держит его до он / она выходит из системы (никаких дальнейших тестов). Так что часть тестирования должна быть довольно быстро.

    Минусы:

    • Боюсь, что доступ к текстовый файл все время будет довольно трудоемкий (более длительная загрузка страницы для пользователь), особенно учитывая что многие пользователи также могут быть доступ к файлу в то же время по той же причине (получение текста сайта на правильном языке).
    • Строки, которые включают переменные (например, "Hello" + user.name + ", как ты? ") труднее сохранить, потому что переменная (например, имя пользователя) меняется для каждого пользователя.
    • Я не думаю, что несколько пользователей могут одновременно получать доступ к текстовому файлу, хотя я могу ошибаться. Если это так, то каждому пользователю, загружающему страницу, придется ждать своей очереди, чтобы получить доступ к текстовому файлу.
    • Получение самой последней строки текстового файла может быть довольно длинным ...
    • Прямая ссылка на портал для определенного языка будет некрасивой (например, www.site.com?lang=es)
  3. Создание нескольких версий веб-сайта в отдельных папках, где каждая версия написана на своем языке.

    Плюсы:

    • Для работы с языками дополнительная обработка не требуется, поэтому дополнительное время ожидания не требуется.

    Минусы:

    • Поддерживать сайт будет все равно, что ходить в школу: мучительно, долго, глупо, если ты снова и снова делаешь одно и то же.
    • ужасный URL (например, www.site.com/es/ вместо www.site.com)

Дополнительно , приведенные выше коды можно сочетать с одним или несколькими из следующих приемов:

  1. Кэширование определенные часто запрашиваемые страницы (в одноэлементной или статической функции PHP?). Определенные предложения также могут быть кэшированы для каждого языка.

    Плюсы

    • Быстрый доступ к часто запрашиваемым страницам.
    • Какие страницы нужно кэшировать, можно определять динамически, со временем.

    Против

    • Я не уверен насчет этого, но не приведет ли это к вздутию ОЗУ сервера?
  2. Перезапись URL может использоваться для многих целей.

    • Пользователь, который ищет прямой доступ к одному языку, может сделать это с помощью www.site.com/fr/somefile и будет перенаправлен на www.site.com/somefile, но с выбранным языком beign, сохраненным в переменной сеанса.

    Плюсы

    • Поисковые системы любят это, потому что у них есть две разные страницы для отображения на двух разных языках

    Против

    • Добавление страницы в закладки не означает, что вы вернетесь к нужному языку, когда вернетесь, если я не введу информацию о языке в URL (www.site.com/somefile?lang=fr)

Немного больше информации

Обычно я использую следующие технологии для создания сайта:

  • PHP
  • SQL
  • XHTML
  • CSS
  • Javascript (и AJAX)

При этом, если для решения требуется, чтобы я выучил новый язык или что-то еще, я был очень открыт для этого. У меня нет крайнего срока для этого проекта, и я намерен многому научиться от него!

Заключение:

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

Ответы [ 5 ]

2 голосов
/ 10 ноября 2009

Независимо от того, используете ли вы базу данных или файловую систему для хранения переводов, вам следует загрузить текст сразу и затем отправить его из памяти. У большинства приложений обычно не так много текста, что становится проблемой. В Java или .Net это может быть достигнуто путем хранения текста в одноэлементном или статическом объекте. Тогда все строки находятся в оперативной памяти и не должны быть загружены или проанализированы. Если на вашей платформе нет удобного способа хранения данных в оперативной памяти, вы можете запустить отдельное приложение для кэширования, например memcached.

Остальные проблемы могут быть смягчены путем скрытия деталей. Создайте или найдите структуру, которая позволяет загружать переводы, а затем искать их по некоторому ключу. Если вы решите переключиться на файлы или базу данных позже, остальная часть вашего кода не пострадает. В краткосрочной перспективе сделайте то, что легче для вас. Я обнаружил, что лучше иметь смесь: легче управлять текстом приложения вместе с исходным кодом в системе контроля версий. Но некоторые тексты часто изменяются или должны меняться, не требуя цикла сборки + развертывания, и этот текст должен находиться в БД.

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

(Предупреждение: пример кода Java)

//WRONG
String msg = "Hello, " + username + ", welcome back.";

//RIGHT
String fmt = "Hello, %s, welcome back."; // in real code: load this string from a file or the db
String msg = fmt.format(username);

Другой человек упомянул кодировку языка в URL. Это предпочтительный способ сделать это, если вам важно, что поисковая система думает о вашем сайте. Google рекомендует использовать разные имена хостов или другой подкаталог. Это означает, что языковые заголовки, отправленные пользователем, не могут быть использованы ни для чего, кроме, возможно, первоначальной отправки их на одну или другую целевую страницу. Вам нужно будет определить язык для каждого запроса на основе входящего URL (на самом деле это значительно упростит ваш код позже). В Java я сохранял код языка в Запросе и просто брал его всякий раз, когда мне это нужно.

Самый простой способ обработки языковых кодов в URL - это переписать. Клиент отправляет запрос на www.yoursite.com/de/somepage, и вы внутренне переписываете запрос на www.yoursite.com/somepage и где-то сохраняете идентификатор языка. В Java каждый запрос имеет объект HttpServletRequest, в котором вы можете хранить атрибуты для жизненного цикла запроса. Если ваш фреймворк не имеет ничего подобного, вы можете просто добавить параметр в URL: www.yoursite.com/de/somepage => www.yoursite.com/somepage?lang=de. Если вы используете языки на основе имени хоста, вы можете использовать имена хостов, такие как de.yoursite.com или www.yoursite.de. Есть плюсы и минусы использования этого подхода. Во-первых, использование ДВУ с кодом страны означает регистрацию новых ДВУ и попытку выяснить, подходит ли код страны для представления языка (часто это не так). Использование различных имен хостов / доменов означает, что вы должны учитывать, в каких доменах хранятся файлы cookie. Если вам нужен поддомен без файлов cookie, вам необходимо тщательно спланировать это. Но со стороны кодирования имя хоста на основе языка не требует дополнительной переписывания; вы можете прочитать имя хоста (это заголовок хоста в HTTP-запросе) и проанализировать его, чтобы определить язык.

1 голос
/ 12 ноября 2009
  • Предложить начальную страницу на языке в зависимости от заголовка HTTP Accept-Language.

  • Позволяет пользователю установить язык в текущем сеансе и, если он прошел проверку подлинности, в своем профиле пользователя.

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

  • Имеют слой, который загружает переводы из базы данных либо по отдельности, либо в виде пакета, и применяет их к загружаемой странице. Кэшируйте эти части, чтобы сделать их быстрыми - при каждой загрузке страницы не должно быть сотен обращений к базе данных для каждой переводимой строки.

Оформить заказ как Джанго это делает - это должно быть поучительно.

0 голосов
/ 10 ноября 2009

Создайте наиболее общую форму сайта, как вы можете. Импортируйте перевод из базы данных с отступлением (то есть порядок языков, если перевод не существует, тогда используйте следующий лучший язык (для немецкого: немецкий, голландский, английский и т. Д.).

Вы могли бы решить проблемы с производительностью, сохраняя кэши динамически создаваемых страниц. [Проверьте зависимые данные и при необходимости обновите]

Отточенный язык, который хотел бы получить пользователь, передается в заголовках HTTP-запроса. Наличие языка выбора + строки запроса часто не требуется.

Файлы ресурсов будут одним из способов. Проще отправить переводчикам. Однако может быть трудно повторно использовать несколько веб-сайтов.

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

0 голосов
/ 10 ноября 2009

Для моих решений я хочу это:

  • Язык должен быть указан в URL-адресе, он лучше работает при индексации страницы Google и при переходе по ссылкам в результатах поиска Google.
  • Как можно больше предварительно сгенерированных переводов для ускорения показа страниц.

Первый довольно легко сделать, если URL-адрес, такой как http://example.com/fr/and-so-on., перезапись URL-адреса может превратить его в http://example.com/and-so-on?lang=fr, который потенциально легче обрабатывать.

Для предварительной генерации переводов хорошо использовать каркас шаблона HTML, чтобы вы могли генерировать переведенные шаблоны из одного набора исходных шаблонов. Тупой подход состоит в том, чтобы сгенерировать sed-скрипт из файлов значения ключа языка и запустить этот sed-скрипт для каждого шаблона, чтобы получить переведенную версию.

Осталось тогда перевести динамически генерируемые части страниц. Есть несколько инструментов, для которых в java есть пакеты, gnu gettext - довольно хороший инструмент.

0 голосов
/ 10 ноября 2009

«Боюсь, что доступ к [базе данных / текстовому файлу] все время будет довольно трудоемким»

Было бы, но именно поэтому вы, вероятно, в некоторой степени использовали бы кеширование. Почти все крупные сайты получают доступ к данным, хранящимся за пределами самой HTML-страницы, и, как таковые, используют при необходимости методы кэширования.

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

...