LINUX.ORG.RU

translate choice field

 , ,


0

1

Ок, есть

https://stackoverflow.com/questions/62045788/drf-serializer-return-translated-choice-field-value

во вьюхе я делаю:

language = kwargs.get('lang')
 translation.activate(language)

и у меня не возвращаются переведенные field

message сгенерированы

msgid "gender_man"
msgstr "Мужчина"

msgid "gender_wooman"
msgstr "Женщина"
в модели вот так:
    gender_man = 0
    gender_wooman = 1
    GENDER_CHOICES = (
        (gender_man, _('gender_man')),
        (gender_wooman, _('gender_wooman')),
    )
    name = models.TextField(choices=GENDER_CHOICES, verbose_name=_("Gender"))

```python
middleware подключен, LOCALE_PATHS настроен
MIDDLEWARE_CLASSES = [
    'django.middleware.locale.LocaleMiddleware',
]
print(request.META.get('HTTP_ACCEPT_LANGUAGE'))
ru
>>> with translation.override('ru'):
...     translation.gettext('gender_man')

'Мужчина'
★★★★

Так нельзя делать

gender_man = 0
    gender_wooman = 1
    GENDER_CHOICES = (
        (gender_man, _('gender_man')),
        (gender_woman, _('gender_woman')),
    )

только так

  GENDER_TYPE = (
        ('gender_man', _('gender_man')),
        ('gender_woman', _('gender_woman')),
    )

Решено. Всем спасибо за помощь

bryak ★★★★ ()
Последнее исправление: bryak (всего исправлений: 2)
Ответ на: комментарий от eternal_sorrow

By convention, it is the English version of the message

У этой convention есть свои недостатки. Начиная от того, что придёт дизайнер/писатель и исправит «English version of the message» на более правильную, что потребует или поиска по исходником всех мест использования или появления английского «перевода» со строками типа

msgid "master"
msgstr "main"

Кроме того, где-то надо заменить на «main», а где-то на «primary», начинаем вместо _(«master») писать dgettext(«hdd», «master») и вместо _(«man») — dgettext(«gender», «man»). Так не проще ли было сразу писать _(«gender_man») ?

P.S. Ещё один плюс идентификаторов вместо английских фраз — сразу видно, какие части забыли перевести.

monk ★★★★★ ()