Как совместить два механизма локализации сайта, написанные на Pelican? - PullRequest
0 голосов
/ 17 сентября 2018

Я использую два механизма локализации сайта: 1. Я использую стандартный тег шаблона {{gettext 'some_text'}} в моем index.html 2. Я написал собственное расширение jinja, которое принимает содержимое файла уценки в соответствии с языком, используемым на сайте.

И я использую Babel для создания файла messages.pot, а затем для создания файла massages.po.

У меня есть такая конфигурация babel в babel.cfg:

[jinja2: theme/templates/index.html]
silent = false

А это моё собственное расширение jinja - custom_jinja_extension.py:

from jinja2 import nodes
from jinja2.ext import Extension
from markdown import Markdown


class IncludeMarkdownExtension(Extension):
    """
    a set of names that trigger the extension.
    """
    tags = set(['include_markdown'])

    def __init__(self, environment):
        super(IncludeMarkdownExtension, self).__init__(environment)

    def parse(self, parser):
        tag = parser.stream.__next__()
        ctx_ref = nodes.ContextReference()
        if tag.value == 'include_markdown':
            args = [ctx_ref, parser.parse_expression(), nodes.Const(tag.lineno)]
            body = parser.parse_statements(['name:endinclude_markdown'], drop_needle=True)
            callback = self.call_method('convert', args)
        return nodes.CallBlock(callback, [], [], body).set_lineno(tag.lineno)

    def convert(self, context, tagname, linenum, caller):
        """
        Function for converting markdown to html
        :param tagname: name of converting file
        :return: converting html
        """
        for item in context['extra_siteurls']:
            if item == context['main_lang']:
                input_file = open('content/{}/{}'.format('en', tagname))
            else:
                input_file = open('content/{}/{}'.format(context['main_lang'], tagname))
        text = input_file.read()
        html = Markdown().convert(text)
        return html

Я использую этот шаблон тега - {% include_markdown 'slide3.md' %}{% endinclude_markdown %} В моем pelicanconf.py я добавляю такие строки для расширений jinja:

# Jinja2 extensions
JINJA_ENVIRONMENT = {
    'extensions': [
        'jinja2_markdown.MarkdownExtension',
        'jinja2.ext.i18n',
        'custom_jinja_extension.IncludeMarkdownExtension'
    ]
}

Когда я запускаю команду:

 pybabel extract --mapping babel.cfg --output messages.pot ./

Я получаю эту ошибку

jinja2.exceptions.TemplateSyntaxError: Обнаружен неизвестный тег 'Include_markdown. Джинджа искал следующие теги: 'Концевого блока. Самый внутренний блок, который нужно закрыть, это «блок».

Когда я удаляю все использование пользовательского тега шаблона, gettext работает хорошо. Что я делаю не так?

1 Ответ

0 голосов
/ 01 октября 2018

Беда была в пути. Бабель ищет расширение jinja в virtualenv в папке jinja, но мое собственное расширение jinja было в папке проекта. Вот почему я запускаю эту команду в терминале

export PYTHONPATH=$PYTHONPATH:/local/path/to/the/project/ и поменяй мой babel.cfg:

[jinja2: theme/templates/index.html]
extensions=jinja2.ext.i18n, **custom_jinja_extension.IncludeMarkdownExtension**
silent = false

После этих изменений babel обнаружил мое собственное расширение custom_jinja_extension и правильно создал файл messages.pot!

...