与Django i18n和gettext的单词共轭



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

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

{{ type }}是可以具有诸如"lecture""exercise"之类的值的字符串。以下是.po文件中的输出:

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

这适用于像英语这样不共轭对象的语言。对于芬兰语这样的语言来说,这会造成问题。

在芬兰语中,名词"讲座"翻译为"luento",在这种特定情况下所需的助词形式是共轭的"luentoa"。名词"exercise"翻译为"tehtävä"或"harjoitus",其助词形式为"tehttävä"one_answers"harjoitosta"。

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

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

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

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

GNU的gettext手册建议人们尽可能多地翻译整句话:

完整的句子也很重要,因为在许多语言中,句子中某个单词的衰退取决于性别或句子另一部分的数量(单数/复数)。单词之间的相互依赖性通常比英语中的要多。结果是,要求译者翻译两个半句,然后通过哑串连接将这两个半句子组合在一起,对许多语言来说是行不通的,尽管这对英语来说是可行的。这就是为什么翻译人员需要处理整个句子的原因。

假设您使用结构"Edit this %(type)s"为芬兰语工作。例如,只要你想支持法语,它就不会起作用。对于你提到的类型,你必须有以下法语句子:

Éditer cette leçon
Éditer cet exercice

(第一句话可能必须翻译为Éditer ce cours。"leçon"one_answers"cours"中哪一个最好,取决于英语中的"讲座"在你使用它的上下文中到底指的是什么。)你看到了问题,根据你使用的单词,你可能需要在type前面加上"cet"、"cette"或"ce"。

假设你没有很多不同的类型,那么解决这个问题的最简单的可能性就是让短语作为一个整体可以翻译:

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

否则,您将不得不在之前准备type字符串,并设置一些上下文标记,如果只有少数类型,这可能比必要的工作更多。

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

例如

from django.utils.translation import pgettext_lazy
type_translations = {
    'lecture': pgettext_lazy('partitive', 'lecture'),
    'exercise': pgettext_lazy('partitive', 'exercise'),
}

最新更新