blob: d405c9c75a62a2f1506dde53c0bd6a069a92a881 [file] [log] [blame]
Armin Ronacher44fb2e12007-04-29 09:45:00 +02001# -*- 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 Ronacher4f7d2d52008-04-22 10:40:26 +02009from jinja2 import Environment, DictLoader, contextfunction
Armin Ronacher44fb2e12007-04-29 09:45:00 +020010
11templates = {
12 'master.html': '<title>{{ page_title|default(_("missing")) }}</title>'
13 '{% block body %}{% endblock %}',
14 'child.html': '{% extends "master.html" %}{% block body %}'
Armin Ronacher4f7d2d52008-04-22 10:40:26 +020015 '{% trans %}watch out{% endtrans %}{% endblock %}',
Armin Ronacher44fb2e12007-04-29 09:45:00 +020016 'plural.html': '{% trans user_count %}One user online{% pluralize %}'
Armin Ronacherce513f22007-04-29 19:56:52 +020017 '{{ user_count }} users online{% endtrans %}',
18 'stringformat.html': '{{ _("User: %d")|format(user_count) }}'
Armin Ronacher44fb2e12007-04-29 09:45:00 +020019}
20
21
22languages = {
23 'de': {
24 'missing': 'fehlend',
25 'watch out': 'pass auf',
26 'One user online': 'Ein Benutzer online',
Armin Ronacherce513f22007-04-29 19:56:52 +020027 '%(user_count)s users online': '%(user_count)s Benutzer online',
28 'User: %d': 'Benutzer: %d'
Armin Ronacher44fb2e12007-04-29 09:45:00 +020029 }
30}
31
32
Armin Ronacher4f7d2d52008-04-22 10:40:26 +020033@contextfunction
34def gettext(context, string):
35 language = context.get('LANGUAGE', 'en')
36 return languages.get(language, {}).get(string, string)
Armin Ronacher44fb2e12007-04-29 09:45:00 +020037
38
Armin Ronacher4f7d2d52008-04-22 10:40:26 +020039@contextfunction
40def 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 Ronacher44fb2e12007-04-29 09:45:00 +020045
46
Armin Ronacher4f7d2d52008-04-22 10:40:26 +020047i18n_env = Environment(
48 loader=DictLoader(templates),
Armin Ronacherb5124e62008-04-25 00:36:14 +020049 extensions=['jinja2.ext.TransExtension']
Armin Ronacher4f7d2d52008-04-22 10:40:26 +020050)
51i18n_env.globals.update({
52 '_': gettext,
53 'gettext': gettext,
54 'ngettext': ngettext
55})
Armin Ronacher44fb2e12007-04-29 09:45:00 +020056
57
58def test_trans():
59 tmpl = i18n_env.get_template('child.html')
60 assert tmpl.render(LANGUAGE='de') == '<title>fehlend</title>pass auf'
61
62
63def 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 Ronacherce513f22007-04-29 19:56:52 +020067
68
69def test_trans_stringformatting():
70 tmpl = i18n_env.get_template('stringformat.html')
71 assert tmpl.render(LANGUAGE='de', user_count=5) == 'Benutzer: 5'
Armin Ronacher4f7d2d52008-04-22 10:40:26 +020072
73
74def test_extract():
Armin Ronacherb5124e62008-04-25 00:36:14 +020075 from jinja2.ext import babel_extract
Armin Ronacher4f7d2d52008-04-22 10:40:26 +020076 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 Ronacherb5124e62008-04-25 00:36:14 +020083 (2, 'gettext', u'Hello World', []),
Armin Ronacher4f7d2d52008-04-22 10:40:26 +020084 (3, 'gettext', u'Hello World', []),
85 (4, 'ngettext', (u'%(users)s user', u'%(users)s users', None), [])
86 ]