Armin Ronacher | 44fb2e1 | 2007-04-29 09:45:00 +0200 | [diff] [blame] | 1 | # -*- coding: utf-8 -*- |
| 2 | """ |
| 3 | unit test for the i18n functions |
| 4 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| 5 | |
| 6 | :copyright: 2007 by Armin Ronacher. |
| 7 | :license: BSD, see LICENSE for more details. |
| 8 | """ |
Armin Ronacher | 4f7d2d5 | 2008-04-22 10:40:26 +0200 | [diff] [blame] | 9 | from jinja2 import Environment, DictLoader, contextfunction |
Armin Ronacher | 44fb2e1 | 2007-04-29 09:45:00 +0200 | [diff] [blame] | 10 | |
| 11 | templates = { |
| 12 | 'master.html': '<title>{{ page_title|default(_("missing")) }}</title>' |
| 13 | '{% block body %}{% endblock %}', |
| 14 | 'child.html': '{% extends "master.html" %}{% block body %}' |
Armin Ronacher | 4f7d2d5 | 2008-04-22 10:40:26 +0200 | [diff] [blame] | 15 | '{% trans %}watch out{% endtrans %}{% endblock %}', |
Armin Ronacher | 44fb2e1 | 2007-04-29 09:45:00 +0200 | [diff] [blame] | 16 | 'plural.html': '{% trans user_count %}One user online{% pluralize %}' |
Armin Ronacher | ce513f2 | 2007-04-29 19:56:52 +0200 | [diff] [blame] | 17 | '{{ user_count }} users online{% endtrans %}', |
| 18 | 'stringformat.html': '{{ _("User: %d")|format(user_count) }}' |
Armin Ronacher | 44fb2e1 | 2007-04-29 09:45:00 +0200 | [diff] [blame] | 19 | } |
| 20 | |
| 21 | |
| 22 | languages = { |
| 23 | 'de': { |
| 24 | 'missing': 'fehlend', |
| 25 | 'watch out': 'pass auf', |
| 26 | 'One user online': 'Ein Benutzer online', |
Armin Ronacher | ce513f2 | 2007-04-29 19:56:52 +0200 | [diff] [blame] | 27 | '%(user_count)s users online': '%(user_count)s Benutzer online', |
| 28 | 'User: %d': 'Benutzer: %d' |
Armin Ronacher | 44fb2e1 | 2007-04-29 09:45:00 +0200 | [diff] [blame] | 29 | } |
| 30 | } |
| 31 | |
| 32 | |
Armin Ronacher | 4f7d2d5 | 2008-04-22 10:40:26 +0200 | [diff] [blame] | 33 | @contextfunction |
| 34 | def gettext(context, string): |
| 35 | language = context.get('LANGUAGE', 'en') |
| 36 | return languages.get(language, {}).get(string, string) |
Armin Ronacher | 44fb2e1 | 2007-04-29 09:45:00 +0200 | [diff] [blame] | 37 | |
| 38 | |
Armin Ronacher | 4f7d2d5 | 2008-04-22 10:40:26 +0200 | [diff] [blame] | 39 | @contextfunction |
| 40 | def ngettext(context, s, p, n): |
| 41 | language = context.get('LANGUAGE', 'en') |
| 42 | if n != 1: |
| 43 | return languages.get(language, {}).get(p, p) |
| 44 | return languages.get(language, {}).get(s, s) |
Armin Ronacher | 44fb2e1 | 2007-04-29 09:45:00 +0200 | [diff] [blame] | 45 | |
| 46 | |
Armin Ronacher | 4f7d2d5 | 2008-04-22 10:40:26 +0200 | [diff] [blame] | 47 | i18n_env = Environment( |
| 48 | loader=DictLoader(templates), |
Armin Ronacher | ed98cac | 2008-05-07 08:42:11 +0200 | [diff] [blame] | 49 | extensions=['jinja2.ext.i18n'] |
Armin Ronacher | 4f7d2d5 | 2008-04-22 10:40:26 +0200 | [diff] [blame] | 50 | ) |
| 51 | i18n_env.globals.update({ |
| 52 | '_': gettext, |
| 53 | 'gettext': gettext, |
| 54 | 'ngettext': ngettext |
| 55 | }) |
Armin Ronacher | 44fb2e1 | 2007-04-29 09:45:00 +0200 | [diff] [blame] | 56 | |
| 57 | |
| 58 | def test_trans(): |
| 59 | tmpl = i18n_env.get_template('child.html') |
| 60 | assert tmpl.render(LANGUAGE='de') == '<title>fehlend</title>pass auf' |
| 61 | |
| 62 | |
| 63 | def test_trans_plural(): |
| 64 | tmpl = i18n_env.get_template('plural.html') |
| 65 | assert tmpl.render(LANGUAGE='de', user_count=1) == 'Ein Benutzer online' |
| 66 | assert tmpl.render(LANGUAGE='de', user_count=2) == '2 Benutzer online' |
Armin Ronacher | ce513f2 | 2007-04-29 19:56:52 +0200 | [diff] [blame] | 67 | |
| 68 | |
| 69 | def test_trans_stringformatting(): |
| 70 | tmpl = i18n_env.get_template('stringformat.html') |
| 71 | assert tmpl.render(LANGUAGE='de', user_count=5) == 'Benutzer: 5' |
Armin Ronacher | 4f7d2d5 | 2008-04-22 10:40:26 +0200 | [diff] [blame] | 72 | |
| 73 | |
| 74 | def test_extract(): |
Armin Ronacher | b5124e6 | 2008-04-25 00:36:14 +0200 | [diff] [blame] | 75 | from jinja2.ext import babel_extract |
Armin Ronacher | 4f7d2d5 | 2008-04-22 10:40:26 +0200 | [diff] [blame] | 76 | from StringIO import StringIO |
| 77 | source = StringIO(''' |
| 78 | {{ gettext('Hello World') }} |
| 79 | {% trans %}Hello World{% endtrans %} |
| 80 | {% trans %}{{ users }} user{% pluralize %}{{ users }} users{% endtrans %} |
| 81 | ''') |
| 82 | assert list(babel_extract(source, ('gettext', 'ngettext', '_'), [], {})) == [ |
Armin Ronacher | b5124e6 | 2008-04-25 00:36:14 +0200 | [diff] [blame] | 83 | (2, 'gettext', u'Hello World', []), |
Armin Ronacher | 4f7d2d5 | 2008-04-22 10:40:26 +0200 | [diff] [blame] | 84 | (3, 'gettext', u'Hello World', []), |
| 85 | (4, 'ngettext', (u'%(users)s user', u'%(users)s users', None), []) |
| 86 | ] |