Как вы обрабатываете перевод текста с разметкой?

Я разрабатываю многоязычную поддержку нашего веб-приложения. Мы используем помощники Django вокруг библиотеки gettext, Все было на удивление легко, за исключением вопроса о том, как обрабатывать предложения, которые включают значительную разметку HTML. Вот простой пример:

Please <a href="/login/">log in</a> to continue.

Вот подходы, о которых я могу думать:

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

  • Отметьте всю строку выше для перевода (включая форматирование). Строки перевода также будут включать HTML непосредственно. Проблема в том, что изменение форматирования HTML требует изменения всего перевода.

  • Плотно соедините несколько переводов, затем используйте интерполяцию строк, чтобы объединить их. Например, фраза "Please% s для продолжения" и "вход в систему" ​​может быть отмечена отдельно для перевода, а затем объединена. "Вход в систему" ​​локализован, затем завернут в HREF, а затем вставлен в переведенную фразу, которая удерживает% s в переводе, чтобы отметить, куда должна идти ссылка. Этот подход усложняет код и нарушает независимость строк перевода.

Есть ли другие варианты? Как другие решили эту проблему?

Ответ 1

Решение 2 - это то, что вы хотите. Отправьте им все предложение с встроенной разметкой HTML.

Причины:

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

Ответ 2

2, с потенциальным завихрением.

Конечно, вы можете локализовать всю строку, например:

loginLink=Please <a href="/login">log in</a> to continue

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

// tokens in this string add html links
loginLink=Please {0}log in{1} to continue

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

loginLink=Please %startlink%log in%endlink% to continue

Затем выполните подстановку в вашем jsp, сервлет или эквивалент для любого языка, который вы используете...

Ответ 3

Отказ от ответственности: я сам не испытываю интернационализации программного обеспечения.

  • Я не думаю, что это было бы хорошо в любом случае - просто вводит слишком много связей...
  • Пока вы сохраняете форматирование разреженным в тех частях, которые нужно перевести, это может быть в порядке. Предоставление переводчикам возможности придавать особое значение словам (путем их ссылки или, возможно, с использованием <strong /> акцент звучит как хорошая идея. Однако эти переводы с (X) HTML, возможно, не могут быть использованы где-либо еще легко.
  • Это звучит как ненужная работа для меня...

Если бы это был я, я бы подумал, что я бы пошел со вторым подходом, но я бы поместил URI в параметр форматирования, чтобы это можно было изменить без необходимости изменять все эти переводы.

Please <a href="%s">log in</a> to continue.

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

Ответ 4

Что бы вы ни делали, все предложение следует считать одной строкой. Вам нужно понять все послание, чтобы правильно его перевести.

Не все слова должны быть переведены на все языки: например. на норвежском языке не используется "пожалуйста" (мы можем сказать "vær så snill" буквально "быть таким добрым", но при использовании в качестве команды он звучит слишком сильным), поэтому правильным норвежским может быть:

  • "Logg inn for å fortsette" горит.: "Войдите, чтобы продолжить" или
  • "Fortsett ved å logge inn" горит: "Продолжайте вход" и т.д.

Вы должны разрешить полностью изменить порядок, например. в вымышленном демо-языке:

  • "Für kontinuer Loggen bitte ins" (если это было реально) горит: "Чтобы продолжить журнал, пожалуйста,

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

Я рекомендую решение 1 или, возможно, "Пожалуйста,% {startlink} войдите в% {endlink}, чтобы продолжить", таким образом, переводчик может сделать все предложение ссылкой, если это более естественно, и может быть полностью изменено.

Ответ 5

Интересный вопрос: у меня скоро будет такая проблема. Думаю, я поеду на 2, без каких-либо сложных штучек. HTML-разметка проста, URL-адреса не будут перемещаться в ближайшее время, и если что-то изменится, новая запись будет создана в django.po, поэтому мы получим возможность просмотреть перевод (например: a script должен проверить наличие пустых переводов после makemessages).

Итак, в шаблоне:

{% load i18n %}
{% trans 'hello <a href="/">world</a>' %}

... затем, после python manage.py makemessages, я получаю в своем django.po

#: templates/out.html:3
msgid "hello <a href=\"/\">world</a>"
msgstr ""

Я меняю его на свои нужды

#: templates/out.html:3
msgid "hello <a href=\"/\">world</a>"
msgstr "bonjour <a href=\"/\">monde</a>"

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

Ваши шаблоны должны быть довольно стабильными через некоторое время, я думаю, но я не знаю, какие другие проблемы вы ожидаете. Если содержимое меняется снова и снова, возможно, это место содержания не внутри шаблона, а внутри модели.

Изменить: я просто проверил его в документации, если вам понадобятся переменные внутри перевода, есть blocktrans.

Ответ 6

  • Не имеет смысла, как бы вы переводили "вход в систему"?
  • Я не думаю, что у многих переводчиков есть опыт работы с HTML (обычные переводчики, не поддерживающие HTML, будут дешевле)
  • Я бы пошел с опцией 3 или использовал "Please% slog in% s для продолжения" и заменил% s на части ссылки.