Totally agree on the first 4. > 5. Similarly, I don't like the changes to the template code. > Basically, I don't want to have to explain i18n to template authors > (they shouldn't have to know anything about it) and explaining why > someone needs to do:: > > <title>{{ _('Title') }}</title> > > instead of just:: > > <title>Title</title> > > And *I* barely understand what:: > > <p>{% i18n ngettext('There is %(count)d file', 'There are % (count)d > files', files|count) %}</p> > > is doing, and "leaking" %-style string formatting into the template > code seems ugly. Specifically, I'd like the template language to be as > losely coupled to Python as possible; I'd like implementations of the > template language on other platforms to be possible.
I also think it may be advisable to extract strings from templates in a different way. > We've deliberately kept the template language as simple as possible, > and I feel like this damages it. I'm not sure how to get around it > (again, I understand how you've got to mark the template files for > string collection), but off the top of my head I'd like to see > something like:: > > <title>{% translate "Title" %}</title> > <p>{% translate %}Hello, {{ name }}, welcome to {{ site }}!{% > endtranslate %}</p> > <p>{% translate %}There are {{ count }} {% pluralize count "file" > "files" %}{% endtranslate %}</p> > > In this sketch, {% translate %} as a non-block tag (when it has > arguments) replaces {{ _('title') }}; as a block tag (when it's got no > arguments) it replaces {% i18n _(...) %}, and {% pluralize %} within a > translate block replaces {% i18n ngettext %}. > > Thoughts? Issues 1. It being a block template tag will lead to people thinking they can eg stick a for loop in there. So do we raise a TemplateSyntaxError on anything other than a TextNode, VariableNode or PluralizeNode? The only other way I can see to deal with this is a new set of delimiters, eg {| |}. Not really sure I like that route either. (variable delimiters inside that? ugh.) 2. Ordering matters, so I think the embedded pluralize is a nono. The whole structure of a sentence/phrase can change afaik. Some languages have four or more plural forms. So my off the top of the head suggestion for the ngettext would be: {% translate files|count as count %} There is {{count}} file. {% plural %} There are {{count}} files. {% endtranslate %} Also, maybe we need to find a shorter name than translate, could get tedious.