Грамматические случаи в многосайтовых развертываниях Django

Я внедряю один проект Django для управления определенным видом событий. Есть два развертывания с одной базой данных, сайты на словацком языке. Они предназначены для мероприятий под названием "Академия Тройстену" и "Клуб Тройстену". Простая часть, я могу просто использовать sites Framework, установите отображаемое имя для каждого сайта соответствующим образом и используйте его в моих шаблонах, где мне нужно сослаться на название события.

Это выглядит хорошо, пока вы не поймете, что словацкий язык использует грамматические падежи. Это означает, что в некоторых местах мне нужно написать "Program Akadémie Trojstenu" / "Program Klubu Trojstenu" или "Staré Akadémie" / "Staré Kluby", например.

Например, рассмотрим следующий фрагмент кода шаблона:

<link rel="alternate" type="application/atom+xml" title="Novinky pre {{ site.name }}" href="{% url "news_feed" %}" />

site.name содержит "Akadémia Trojstenu", но в этом случае мне нужно, чтобы он вывел "Novinky pre Akadémiu Trojstenu", то есть содержимое переменной в четвертом грамматическом случае.

Единственный способ продвинуться вперед, который я вижу в данный момент, - это особый случай всех таких случаев в шаблонах, посмотреть домен текущего сайта и вывести правильный грамматический регистр имени. Это решение, очевидно, сильно против СУХОГО, отвратительно и будет есть маленьких детей.

У кого-нибудь есть лучшее предложение? Есть какое-то стандартное решение? Я предполагаю, что есть много языков, использующих случаи грамматики, и, конечно, есть кто-то, кто сталкивался с этой проблемой до меня.

2 ответа

Решение

Как говорит @jpic, вы можете сделать это с помощью контекстных маркеров. На самом деле было бы проще с именем сайта, встроенным в шаблон, так как тогда его подхватил бы django makemessages,

<link rel="alternate" type="application/atom+xml" 
      title="Novinky pre {% trans 'Akadémia Trojstenu' context '4th' %}" 
      href="{% url "news_feed" %}" />

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

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

msgctxt "1st"
msgid "Akadémia Trojstenu"
msgstr "Akadémia Trojstenu"

msgctxt "2nd"
msgid "Akadémia Trojstenu"
msgstr "????? Trojstenu"

msgctxt "3rd"
msgid "Akadémia Trojstenu"
msgstr "Akadémie Trojstenu"

msgctxt "4th"
msgid "Akadémia Trojstenu"
msgstr "Akadémiu Trojstenu"

...

msgctxt "3rd"
msgid "Klub Trojstenu"
msgstr "Klubu Trojstenu"

...

Вставьте дополнительный.po в другой каталог и зарегистрируйте каталог в LOCALE_PATHS установка. Помните, что вы сделали это, чтобы вы знали, где искать, когда кто-то добавляет новый сайт или меняет его имя и начинает задаваться вопросом, почему перевод не работает.

После этого вы сможете использовать имя сайта следующим образом:

<link rel="alternate" type="application/atom+xml" 
      title="Novinky pre {% trans site.name context '4th' %}" 
      href="{% url "news_feed" %}" />

Конечно, если проблема ограничена только именем сайта, вы можете вместо этого добавить еще несколько полей в вашей модели сайта для хранения других случаев (подкласс его). Поскольку объекты сайта никогда не меняются, я не думаю, что такого рода денормализация вызовет какие-либо проблемы.

Просто используйте переменные в ваших строках перевода:

output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}

Это также работает в шаблонах:

{% blocktrans with site.name as site_name %}Novinky pre {{ site_name }}.{% endblocktrans %}

Finnaly, вы можете найти полезным использовать контексты перевода.

Там вам не придется "есть маленьких детей" (если вы не очень голодны).

Другие вопросы по тегам