与Django i18n和gettext的单词共轭

时间:2015-02-11 18:56:47

标签: django internationalization gettext

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

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

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

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

这适用于没有共轭对象的英语等语言。对于像芬兰语这样的语言,这会导致问题。

在芬兰语中,名词“讲座”翻译为“luento”,并且在这个特定情况下所需的部分形式是“luento a ”。名词“exercise”翻译为“tehtävä”或“harjoitus”,其形式为“tehtävää”和“harjoitus ta ”。

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

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

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

(哪会正确导致“luentoa”,但错误地导致“tehtäväa”。)

3 个答案:

答案 0 :(得分:3)

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

  

整个句子也很重要,因为在许多语言中,句子中某些单词的下降取决于句子另一部分的性别或数字(单数/复数)。单词之间通常存在比英语更多的相互依赖关系。结果是,要求翻译人员翻译两个半句,然后通过哑弦连接将这两个半句合并,对于许多语言来说都是行不通的,即使它适用于英语。这就是译员需要处理整个句子的原因。

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

Éditer cette leçon
Éditer cet exercice

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

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:1)

我认为您必须依靠pgettext为您的翻译提供背景信息。

e.g。

from django.utils.translation import pgettext_lazy

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