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')

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

Последнее исправление: bryak (всего исправлений: 1)

wooman

woo man

Почему это так смешно?

_('gender_man')

man 3 gettext:

The msgid argument identifies the message to be translated. By convention, it is the English version of the message, with non-ASCII characters replaced by ASCII approximations.

Смекаешь?

eternal_sorrow ★★★★★
()

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

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 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.