Как вы справляетесь с переводом текста с разметкой? - PullRequest
33 голосов
/ 08 ноября 2008

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

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

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

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

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

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

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

Ответы [ 6 ]

18 голосов
/ 21 ноября 2008

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

Причины:

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

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, сервлете или аналоге для любого языка, который вы используете ...

7 голосов
/ 08 ноября 2008

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

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

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

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

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

3 голосов
/ 12 ноября 2008

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

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

  • «Logn inn for å fortsette» горит .: «Войдите, чтобы продолжить» или
  • «Fortsett ved å logge inn» горит: «Продолжить, чтобы войти» и т. Д.

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

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

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

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

1 голос
/ 10 ноября 2008

Интересный вопрос, очень скоро у меня возникнет эта проблема. Я думаю, я пойду на 2, без каких-либо хитрых вещей. HTML-разметка проста, URL-адреса не будут перемещаться в ближайшее время, и если что-то будет изменено, в django.po будет создана новая запись, поэтому у нас есть возможность просмотреть перевод (например: скрипт должен проверять пустые переводы после 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.

0 голосов
/ 09 ноября 2008
  1. Нет смысла, как бы вы перевели "войти"?
  2. Я не думаю, что многие переводчики имеют опыт работы с HTML (обычные переводчики, не поддерживающие HTML, будут дешевле)
  3. Я бы выбрал вариант 3 или использовал «Пожалуйста,% slog в% s для продолжения» и заменил% s частями ссылки.
...