2010-01-19 8 views
2

je peux utiliser jinj2 modèles avec django via render_to_response définis comme ci-dessousObtenir des chaînes de traduction pour les modèles jinja2 intégrés à django 1.x?

 
from django.conf import settings 
from django.core.exceptions import ImproperlyConfigured 
from django.http import HttpResponse 
from django.template import TemplateDoesNotExist, Context 
from django.utils import translation 
from itertools import chain 
from jinja2 import FileSystemLoader, Environment 
from jinja2 import nodes 
from jinja2.ext import Extension 
from django.conf import settings 

import jinja_filters as jf 
import traceback 

from django.utils.translation import gettext, ngettext 

class DjangoTranslator(object): 

    def __init__(self): 
     self.gettext = gettext 
     self.ngettext = ngettext 

class DjangoEnvironment(Environment): 

    def get_translator(self, context): 
     return DjangoTranslator() 


template_dirs = getattr(settings,'TEMPLATE_DIRS') 
default_mimetype = getattr(settings, 'DEFAULT_CONTENT_TYPE') 
global_exts = getattr(settings, 'JINJA_EXTENSIONS',()) 
env = DjangoEnvironment(autoescape=False, loader=FileSystemLoader(template_dirs, encoding="utf-8"), extensions=global_exts) 
env.filters.update({'myescape':jf.myescape}) 

if 'jinja2.ext.i18n' in global_exts: 
     env.install_gettext_translations(translation) 

def render_to_response(filename, context={}, context_instance=Context({}), mimetype=default_mimetype): 
    template = env.get_template(filename) 
    for d in context_instance.dicts: 
     context.update(d) 
    context.update({'settings':settings}) 
    rendered = template.render(**context) 
    return HttpResponse(rendered, mimetype=mimetype) 

mais ne peut pas faire des chaînes de traduction d'extraits de django pour les modèles de jinja2.

semble que les lignes ci-dessous dans django/utils/traduction/trans_real.py permettent de makemessages commande pour analyser les modèles de django pour i18n via [email protected]_real.py

 
inline_re = re.compile(r"""^\s*trans\s+((?:".*?")|(?:'.*?'))\s*""") 
block_re = re.compile(r"""^\s*blocktrans(?:\s+|$)""") 
endblock_re = re.compile(r"""^\s*endblocktrans$""") 
plural_re = re.compile(r"""^\s*plural$""") 
constant_re = re.compile(r"""_\(((?:".*?")|(?:'.*?'))\)""") 

est-il un moyen plus agréable que modifier le makemessages.py en réécrivant regexes tags de traduction pour une utilisation locale sur les modèles jinja2 pour extraire les chaînes de traduction?

Répondre

2

Une petite modification a fait pour moi .. La recette de base est la suivante, vous devrez peut-être ajouter/modifier un peu plus pour répondre à vos besoins.

 
$ ~ > cp $DJANGO_PATH/utils/translation/ myproject/utils/ -a 

et apporter les modifications ci-dessous:

 
$ ~ > diff $DJANGO_PATH/utils/translation/trans_real.py myproject/utils/translation/trans_real.py -u 

--- utils/translation/trans_real.py  Wed Jan 20 05:07:46 2010 
+++ myproject/utils/translation/trans_real.py Wed Jan 20 04:51:39 2010 
@@ -435,6 +435,9 @@ 
endblock_re = re.compile(r"""^\s*endblocktrans$""") 
plural_re = re.compile(r"""^\s*plural$""") 
constant_re = re.compile(r"""_\(((?:".*?")|(?:'.*?'))\)""") 

+jinja_block_re = re.compile(r"""^\s*trans(?:\s+|$)""") 
+jinja_endblock_re = re.compile(r"""^\s*endtrans$""") 

def templatize(src): 
    """ 
@@ -451,7 +454,7 @@ 
    for t in Lexer(src, None).tokenize(): 
     if intrans: 
      if t.token_type == TOKEN_BLOCK: 
-    endbmatch = endblock_re.match(t.contents) 
+    endbmatch = jinja_endblock_re.match(t.contents) 
       pluralmatch = plural_re.match(t.contents) 
       if endbmatch: 
        if inplural: 
@@ -485,7 +488,7 @@ 
     else: 
      if t.token_type == TOKEN_BLOCK: 
       imatch = inline_re.match(t.contents) 
-    bmatch = block_re.match(t.contents) 
+    bmatch = jinja_block_re.match(t.contents) 
       cmatches = constant_re.findall(t.contents) 
       if imatch: 
        g = imatch.group(1) 


$ ~ > cp $DJANGO_PATH/core/management/commands/makemessages.py myproject/myapp/management/commands/ 


$ ~/myproject/ > diff $DJANGO_PATH/core/management/commands/makemessages.py main/management/commands/makemessages.py -u 
--- /usr/lib/python2.5/site-packages/django/core/management/commands/makemessages.py Wed Jan 20 05:08:37 2010 
+++ main/management/commands/makemessages.py Wed Jan 20 05:28:41 2010 
@@ -56,7 +56,7 @@ 
    else: 
     settings.configure(USE_I18N = True) 

- from django.utils.translation import templatize 
+ from myproject.utils.translation import templatize 

    if os.path.isdir(os.path.join('conf', 'locale')): 
     localedir = os.path.abspath(os.path.join('conf', 'locale')) 


appeler ensuite faire des messages comme suit le tour est joué

 
$ ~/myproject/ > ./manage.py mymakemessages -l $LANGUAGE -e .jinja -v 2 

mes modèles sont nommés comme templ_name.jinja, vous aurez besoin pour remplacer .jinja dans la commande ci-dessus avec l'extension que vous utilisez pour vos noms de modèles.

+0

J'ai aussi fait un paquet pour faciliter django - l'intégration de Jinja, avec prise en charge des chaînes de traduction. https://github.com/altunyurt/djtemps – hinoglu

Questions connexes