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

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

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

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

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

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

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

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


person Community    schedule 07.11.2008    source источник


Ответы (6)


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

Причины:

  1. Преобладающий инструмент перевода, Trados, может защитить разметку от непреднамеренного искажения переводчиком.
  2. Trados также может автоматически переводить текст, который он видел раньше, даже если содержание тегов изменилось (но количество тегов и их положение в предложении одинаковы). По крайней мере, переводчик сделает вам хорошую скидку.
  3. Стиль зависит от региона. В некоторых случаях полужирный шрифт будет неуместным в китайском или японском языках, а курсив, например, реже используется в языках Восточной Азии. Переводчик должен иметь право сохранять или удалять стили.
  4. Порядок слов зависит от языка. Если бы вы разбили приведенное выше предложение на фрагменты, оно могло бы работать для английского и французского языков, но в китайском или японском языках порядок слов при объединении будет неправильным. По этой причине лучше всего экстернализировать целые предложения, а не их фрагменты.
person Mike Sickler    schedule 21.11.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, сервлете или эквиваленте для любого языка, который вы используете ...

person Niniki    schedule 07.11.2008
comment
С gettext для продолжения, вероятно, будет% slog в% s. - person hangy; 08.11.2008
comment
Мне нравится эта идея. Мне пришло в голову отделить внутренний текст от внешнего текста как отдельные строки, но я не подумал об изменении самого HTML на интерполированные строки. Похоже, это могло бы работать лучше и меньше запутывать переводчика. - person Ryan Lundy; 26.02.2010

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

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

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

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

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

person hangy    schedule 07.11.2008
comment
В соответствии с рекомендациями Wordpress.org с примером sprintf (__ ('Заменить% 1 $ s на% 2 $ s'). Этот пример предназначен для нескольких отдельных строк HTML. - person Ryan Bayne; 03.11.2013

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

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

  • «Logg inn for å fortsette» высвечивается: «Войдите в систему, чтобы продолжить» или
  • «Fortsett ved å logge inn» высвечивается: «Продолжайте, чтобы войти в систему» ​​и т. Д.

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

  • «Für kontinuer Loggen bitte ins» (если это было на самом деле) горит: «Для продолжения авторизуйтесь»

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

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

person Stein G. Strindhaug    schedule 12.11.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.

person vincent    schedule 09.11.2008

  1. Нет смысла, как бы вы перевели "войти в систему"?
  2. Я не думаю, что у многих переводчиков есть опыт работы с HTML (обычные переводчики, не поддерживающие HTML, будут дешевле)
  3. Я бы выбрал вариант 3 или использовал «Пожалуйста,% slog в% s, чтобы продолжить» и заменил% s частями ссылки.
person Osama Al-Maadeed    schedule 08.11.2008