POT-файл с тегами вместо <динамического элемента> - PullRequest
2 голосов
/ 05 марта 2012

Я пытаюсь перевести текст из файла шаблона в проекте Pyramid. Более или менее как в этом примере: http://docs.pylonsproject.org/projects/pyramid_cookbook/en/latest/chameleon_i18n.html

Теперь, как мне избавиться от <dynamic element> в комментарии к моему файлу .pot? Я хотел бы видеть остальную часть кода вместе с его тегами.

Шаблон моего хамелеона (.pt):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" xmlns:tal="http://xml.zope.org/namespaces/tal"
  xmlns:i18n="http://xml.zope.org/namespaces/i18n"
  i18n:domain="MyDomain">
<head>
    ...
</head>
<body>
    <div i18n:translate="MyID">
        This will appear in the comments.
        <span>This will NOT.</span>
        While this will again appear.
    </div>
</body>
</html>

Я использую Babel и Lingua для извлечения сообщений со следующими параметрами в моем файле setup.py:

.
message_extractors = { '.': [
        ('**.py', 'lingua_python', None ),
        ('**.pt', 'lingua_xml', None ),
        ]}

И соответствующий вывод в моем файле .pot выглядит так:

#. Default: This will appear in the comments. <dynamic element> While this will
#. again appear.
#: myproject/templates/base.pt:10
msgid "MyID"
msgstr ""

1 Ответ

2 голосов
/ 12 марта 2012

Это явно не поддерживается: перевод должен содержать только текст - он никогда не должен содержать разметки. В противном случае у вас возникнут две проблемы:

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

Обычно требуется переводить элементы с динамическими компонентами или разметкой внутри: для них вы используете атрибут i18n: name. Например, вы можете сделать это:

<p i18n:translate="">This is <strong i18n:name="very" i18n:translate="">very</strong> important.

Это даст вам две строки для перевода: This is ${very} string и very.

...