Когда использовать ленивый перевод в Django

Когда в Django требуется ленивый перевод строковых объектов? В документации говорится, что такие значения опций, как verbose_name и help_text должны быть лениво переведены. А как насчет других опций, таких как related_name и through? Какова цель ленивого перевода опций verbose_name и help_text?

Каково значение ленивого перевода для полей, являющихся атрибутами уровня класса?

Эти функции хранят ленивую ссылку на строку - не фактический перевод. Сам перевод будет выполнен, когда строка будет использоваться в строковом контексте, например, при рендеринге шаблона.

Это необходимо, когда вызовы этих функций находятся в путях кода, которые выполняются во время загрузки модуля.

Это может легко произойти при определении моделей, форм и модельных форм, поскольку Django реализует их таким образом, что их поля фактически являются атрибутами уровня класса. По этой причине обязательно используйте ленивые переводы в следующих случаях:

class Course(models.Model):
    def __str__(self):
        return self.title

    title = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')
    subscribers = models.ManyToManyField(User, through='Subscription')

class MyThing(models.Model):
    kind = models.ForeignKey(
        ThingKind,
        on_delete=models.CASCADE,
        related_name='kinds',
        verbose_name=_('kind'),
    )

Ваш вопрос говорит о том, что вы не понимаете ленивость python.

lazy translation - это только обещание дать вам когда-нибудь строку с действительно переведенным текстом. Но если вам это не нужно, то этого не произойдет.

У нас есть много преимуществ, если мы создадим ленивый объект:

  • ничего не происходит, мы создали только обещание.
  • мы можем работать с lazy object как с обычным объектом.
  • только если нам это действительно нужно - мы можем разрешить обещание.
  • если вы правильно работаете с ленивыми объектами - действительно увеличиваете скорость вашего синхронного кода.

У нас есть недостатки:

  • ничего не происходит, вы не можете увидеть или отладить результат обещания до того, как обещание будет разрешено.
  • дополнительная ленивая обертка имеет свои издержки: память и задержка, если вам нужен результат.
  • 90% разработчиков python не понимают этого. Они получают только проблему с ленивыми объектами.

Генератор является лучшим примером - он совершенен и быстр. большинство программистов не используют генераторы: знаменитые curio или asyncio полностью забыты из-за лени.

Мне не нравится как работает ленивый перевод в django, поэтому я создал свою собственную библиотеку Django-tof (Translation-On-Fly). https://github.com/wP-soft-GmbH/django-tof

Теперь ответ на вопрос:

Вам следует использовать ленивый перевод, если:

  1. У вас есть статичный текст, но не всегда вам нужен перевод этого текста. 99 % в Django
  2. .
  3. У вас статичный текст, вам нужен перевод этого текста в 100%, но переводы приходят с задержкой. Например: Объект имеет init с переведенным текстом до загрузки блока переводов. Редкие элементы, которые должны делать что-то на старте проекта. Например: пользовательский Testrunner и сообщения о процессе. 0.01% в Django.
  4. .
  5. если вы не беспокоитесь о скорости/потреблении памяти вашей функции. 99.99% в python.
  6. .
Вернуться на верх