Категории

Язык
Окружение
Область
Проект

17 сентября 2014 г. 0:43 (ред. 8 февраля 2017 г. 20:09)
А бывает так: только-только человек приготовился локализовать своё приложение для Django, а тут на тебе — makemessages в упор не видит некоторые строки.
Прежде всего, нужно вспомнить, что в Django существует с десяток функций для пометки строк, назначенных к переводу, самые известные из которых, пожалуй, gettext_lazy и ngettext_lazy. И вполне нормально, когда вы используете сразу несколько.

Проблемы могут возникнуть если попытаться импортировать функции под другими именами.

    from django.utils.translation import ugettext_lazy as _  # Классика.

# А теперь для краткости присвоим псевдоним ungettext_lazy:
from django.utils.translation import ungettext_lazy as _n

Присвоить-то вы присвоите, только такую пометку команда makemessages не поймёт, и не сможет собрать для вас .po-файл.

А причина вот в чём — https://github.com/<...>makemessages.py

Команда использует утилиту xgettext, и по ссылке видно, что этой утилите передаются ключевые слова, которые должны служить маркером строк для перевода. Само собой, среди этих слов нашего _n нет.

«Позвольте!» — скажете вы, так ведь и _ там тоже нет. Это верно: там подчерка нет. Однако о нём xgettext знает и сам.

For Python: gettext, ugettext, dgettext:2, ngettext:1,2, ungettext:1,2, dngettext:2,3, _.

То есть, сэкономить на символах не выйдет, придётся вернуть ungettext_lazy.