Search code examples
pythoninternationalizationpyramidchameleontemplate-tal

POT file with tags instead of <dynamic element>


I'm trying to translate text out of a template file in a Pyramid project. More or less as in this example: http://docs.pylonsproject.org/projects/pyramid_cookbook/en/latest/chameleon_i18n.html

Now how do I get rid of the <dynamic element> in the comment of my .pot file? I'd like to see the rest of the code along with its tags.

My chameleon template (.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>

I use Babel and Lingua to extract the messages with the following options in my setup.py:

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

And the relevant output in my .pot file looks like this:

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

Solution

  • This is explicitly not supported: a translation should only contain the text - it should never contain markup. Otherwise you would have two problems:

    1. translators could insert markup, which may break your site or create a security problem
    2. a template toolkit would have no way to determine if any characters in a translation need to be escaped or should be output as-is.

    It is common to need to translate items with dynamic components or markup inside them: for those you use the i18n:name attribute. For example you can do this:

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

    That would give you two strings to translate: This is ${very} string and very.