Add Django integration code contributed by Ramiro Morales and Massimo Scamarcia.
git-svn-id: http://svn.edgewall.org/repos/babel/contrib/django@292 59ecc08e-a131-0410-9ea7-d4c0f28ac310
This commit is contained in:
28
COPYING
Normal file
28
COPYING
Normal file
@@ -0,0 +1,28 @@
|
||||
Copyright (C) 2007 Edgewall Software
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
3. The name of the author may not be used to endorse or promote
|
||||
products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
|
||||
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
|
||||
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
|
||||
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
12
README.txt
Normal file
12
README.txt
Normal file
@@ -0,0 +1,12 @@
|
||||
Tools for using Babel with Django
|
||||
=================================
|
||||
|
||||
This package contains various utilities for integration of Babel into the
|
||||
Django web framework:
|
||||
|
||||
* A message extraction plugin for Django templates.
|
||||
* A middleware class that adds the Babel `Locale` object to requests.
|
||||
|
||||
For more information please visit the wiki page for this package:
|
||||
|
||||
<http://babel.edgewall.org/wiki/BabelDjango>
|
||||
12
babeldjango/__init__.py
Normal file
12
babeldjango/__init__.py
Normal file
@@ -0,0 +1,12 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
# Copyright (C) 2007 Edgewall Software
|
||||
# All rights reserved.
|
||||
#
|
||||
# This software is licensed as described in the file COPYING, which
|
||||
# you should have received as part of this distribution. The terms
|
||||
# are also available at http://babel.edgewall.org/wiki/License.
|
||||
#
|
||||
# This software consists of voluntary contributions made by many
|
||||
# individuals. For the exact contribution history, see the revision
|
||||
# history and logs, available at http://babel.edgewall.org/log/.
|
||||
108
babeldjango/extract.py
Normal file
108
babeldjango/extract.py
Normal file
@@ -0,0 +1,108 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
# Copyright (C) 2007 Edgewall Software
|
||||
# All rights reserved.
|
||||
#
|
||||
# This software is licensed as described in the file COPYING, which
|
||||
# you should have received as part of this distribution. The terms
|
||||
# are also available at http://babel.edgewall.org/wiki/License.
|
||||
#
|
||||
# This software consists of voluntary contributions made by many
|
||||
# individuals. For the exact contribution history, see the revision
|
||||
# history and logs, available at http://babel.edgewall.org/log/.
|
||||
|
||||
from babel.core import *
|
||||
|
||||
from django.conf import settings
|
||||
settings.configure(USE_I18N=True)
|
||||
from django.template import Lexer, TOKEN_TEXT, TOKEN_VAR, TOKEN_BLOCK
|
||||
from django.utils.translation.trans_real import inline_re, block_re, \
|
||||
endblock_re, plural_re, \
|
||||
constant_re
|
||||
|
||||
def extract_django(fileobj, keywords, comment_tags, options):
|
||||
"""Extract messages from Django template files.
|
||||
|
||||
:param fileobj: the file-like object the messages should be extracted from
|
||||
:param keywords: a list of keywords (i.e. function names) that should
|
||||
be recognized as translation functions
|
||||
:param comment_tags: a list of translator tags to search for and
|
||||
include in the results
|
||||
:param options: a dictionary of additional options (optional)
|
||||
:return: an iterator over ``(lineno, funcname, message, comments)``
|
||||
tuples
|
||||
:rtype: ``iterator``
|
||||
"""
|
||||
intrans = False
|
||||
inplural = False
|
||||
singular = []
|
||||
plural = []
|
||||
lineno = 1
|
||||
for t in Lexer(fileobj.read(), None).tokenize():
|
||||
lineno += t.contents.count('\n')
|
||||
if intrans:
|
||||
if t.token_type == TOKEN_BLOCK:
|
||||
endbmatch = endblock_re.match(t.contents)
|
||||
pluralmatch = plural_re.match(t.contents)
|
||||
if endbmatch:
|
||||
if inplural:
|
||||
yield lineno, 'ngettext', (unicode(''.join(singular)),
|
||||
unicode(''.join(plural))), []
|
||||
else:
|
||||
yield lineno, None, unicode(''.join(singular)), []
|
||||
intrans = False
|
||||
inplural = False
|
||||
singular = []
|
||||
plural = []
|
||||
elif pluralmatch:
|
||||
inplural = True
|
||||
else:
|
||||
raise SyntaxError('Translation blocks must not include '
|
||||
'other block tags: %s' % t.contents)
|
||||
elif t.token_type == TOKEN_VAR:
|
||||
if inplural:
|
||||
plural.append('%%(%s)s' % t.contents)
|
||||
else:
|
||||
singular.append('%%(%s)s' % t.contents)
|
||||
elif t.token_type == TOKEN_TEXT:
|
||||
if inplural:
|
||||
plural.append(t.contents)
|
||||
else:
|
||||
singular.append(t.contents)
|
||||
else:
|
||||
if t.token_type == TOKEN_BLOCK:
|
||||
imatch = inline_re.match(t.contents)
|
||||
bmatch = block_re.match(t.contents)
|
||||
cmatches = constant_re.findall(t.contents)
|
||||
if imatch:
|
||||
g = imatch.group(1)
|
||||
if g[0] == '"':
|
||||
g = g.strip('"')
|
||||
elif g[0] == "'":
|
||||
g = g.strip("'")
|
||||
yield lineno, None, unicode(g), []
|
||||
elif bmatch:
|
||||
intrans = True
|
||||
inplural = False
|
||||
singular = []
|
||||
plural = []
|
||||
elif cmatches:
|
||||
for cmatch in cmatches:
|
||||
yield lineno, None, unicode(cmatch), []
|
||||
elif t.token_type == TOKEN_VAR:
|
||||
parts = t.contents.split('|')
|
||||
cmatch = constant_re.match(parts[0])
|
||||
if cmatch:
|
||||
yield lineno, None, unicode(cmatch.group(1)), []
|
||||
for p in parts[1:]:
|
||||
if p.find(':_(') >= 0:
|
||||
p1 = p.split(':',1)[1]
|
||||
if p1[0] == '_':
|
||||
p1 = p1[1:]
|
||||
if p1[0] == '(':
|
||||
p1 = p1.strip('()')
|
||||
if p1[0] == "'":
|
||||
p1 = p1.strip("'")
|
||||
elif p1[0] == '"':
|
||||
p1 = p1.strip('"')
|
||||
yield lineno, None, unicode(p1), []
|
||||
44
babeldjango/middleware.py
Normal file
44
babeldjango/middleware.py
Normal file
@@ -0,0 +1,44 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
# Copyright (C) 2007 Edgewall Software
|
||||
# All rights reserved.
|
||||
#
|
||||
# This software is licensed as described in the file COPYING, which
|
||||
# you should have received as part of this distribution. The terms
|
||||
# are also available at http://babel.edgewall.org/wiki/License.
|
||||
#
|
||||
# This software consists of voluntary contributions made by many
|
||||
# individuals. For the exact contribution history, see the revision
|
||||
# history and logs, available at http://babel.edgewall.org/log/.
|
||||
|
||||
from babel import Locale, UnknownLocaleError
|
||||
try:
|
||||
from threading import local
|
||||
except ImportError:
|
||||
from django.utils._threading_local import local
|
||||
|
||||
__all__ = ['get_current_locale', 'LocaleMiddleware']
|
||||
|
||||
_thread_locals = local()
|
||||
|
||||
def get_current_locale():
|
||||
"""Get current locale data outside views.
|
||||
|
||||
See http://babel.edgewall.org/wiki/ApiDocs/babel.core for Locale
|
||||
objects documentation
|
||||
"""
|
||||
return getattr(_thread_locals, 'locale', None)
|
||||
|
||||
|
||||
class LocaleMiddleware(object):
|
||||
"""Simple Django middleware that makes available a Babel `Locale` object
|
||||
via the `request.locale` attribute.
|
||||
"""
|
||||
|
||||
def process_request(self, request):
|
||||
try:
|
||||
locale = Locale.parse(request.LANGUAGE_CODE, sep='-')
|
||||
except (ValueError, UnknownLocaleError):
|
||||
pass
|
||||
else:
|
||||
_thread_locals.locale = request.locale = locale
|
||||
3
setup.cfg
Normal file
3
setup.cfg
Normal file
@@ -0,0 +1,3 @@
|
||||
[egg_info]
|
||||
tag_build = dev
|
||||
tag_svn_revision = true
|
||||
36
setup.py
Executable file
36
setup.py
Executable file
@@ -0,0 +1,36 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
# Copyright (C) 2007 Edgewall Software
|
||||
# All rights reserved.
|
||||
#
|
||||
# This software is licensed as described in the file COPYING, which
|
||||
# you should have received as part of this distribution. The terms
|
||||
# are also available at http://babel.edgewall.org/wiki/License.
|
||||
#
|
||||
# This software consists of voluntary contributions made by many
|
||||
# individuals. For the exact contribution history, see the revision
|
||||
# history and logs, available at http://babel.edgewall.org/log/.
|
||||
|
||||
try:
|
||||
from setuptools import setup
|
||||
except ImportError:
|
||||
from distutils.core import setup
|
||||
|
||||
setup(
|
||||
name = 'BabelDjango',
|
||||
description = 'Utilities for using Babel in Django',
|
||||
version = '0.1',
|
||||
license = 'BSD',
|
||||
author = 'Edgewall Software',
|
||||
author_email = 'python-babel@googlegroups.com',
|
||||
url = 'http://babel.edgewall.org/wiki/BabelDjango',
|
||||
|
||||
packages = ['babeldjango'],
|
||||
install_requires = ['Babel'],
|
||||
|
||||
entry_points = """
|
||||
[babel.extractors]
|
||||
django = babeldjango.extract:extract_django
|
||||
""",
|
||||
)
|
||||
Reference in New Issue
Block a user