与 Django i18n 和 gettext 的词共轭

Word conjugation with Django i18n and gettext

目前,我的 Django 项目的模板文件中有以下代码:

{% blocktrans with type=content.get_type %}Edit this {{ type }}{% endblocktrans %}

{{ type }} 是一个字符串,可以具有 "lecture""exercise" 等值。这是 .po 文件中的输出:

msgid "Edit this %(type)s"
msgstr ""

这适用于不共轭对象的语言,例如英语。对于这样做的语言,例如芬兰语,这会导致问题。

在芬兰语中,名词 "lecture" 翻译为 "luento",并且在这种特定情况下所需的分词形式是共轭 "luentoa"。名词"exercise"译为"tehtävä"或"harjoitus",其分词形式为"tehtävää"和"harjoitusta".

有没有办法,例如,为这种情况下的单词添加特定的翻译?或者可能有某种基于条件的方式来填充 msgstr?

显然以下内容不起作用,因为单词的共轭形式以不同的字符结尾:

msgstr "Muokkaa tätä %(type)sa"

(这会正确地导致 "luentoa",但错误地导致 "tehtäväa"。)

我认为您必须依靠 pgettext 为您的翻译提供上下文。

例如

from django.utils.translation import pgettext_lazy

type_translations = {
    'lecture': pgettext_lazy('partitive', 'lecture'),
    'exercise': pgettext_lazy('partitive', 'exercise'),
}

假设你没有很多不同的类型可能是最简单的可能性,所以解决这个问题可能只是让整个短语都可以翻译:

{% if content.get_type == 'lecture' %}
  {% trans "Edit this lecture" %}
{% else if content.get_type == '.....'
  ...
{% endif %}

否则您必须先准备 type 字符串并设置一些 Contextual Markers 如果只有几种类型,这可能比必要的工作更多。

GNU 的 gettext manual 建议人们尽可能多地翻译整个句子:

Entire sentences are also important because in many languages, the declination of some word in a sentence depends on the gender or the number (singular/plural) of another part of the sentence. There are usually more interdependencies between words than in English. The consequence is that asking a translator to translate two half-sentences and then combining these two half-sentences through dumb string concatenation will not work, for many languages, even though it would work for English. That’s why translators need to handle entire sentences.

让我们假设您的结构 "Edit this %(type)s" 适合芬兰语。例如,一旦您想支持法语,它就无法工作。对于你提到的类型,你必须用法语写这些句子:

Éditer cette leçon
Éditer cet exercice

(第一句可能要翻译成Éditer ce cours。"leçon"和"cours"哪个最好,要看"lecture"在英文中具体指的是什么您使用它的上下文。)您看到了问题,具体取决于您使用的单词,您可能需要 "cet"、"cette" 或 "ce" 在您的 type.