2015-02-11 68 views
3

字共轭目前,我有一个模板文件,下面的代码在我的Django项目:Django的国际化和gettext的

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

{{ type }}是可以有值,如"lecture""exercise"的字符串。下面是在.po文件输出:

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

这工作正常的语言,如英语不共轭的对象。对于像芬兰语这样的语言,这会造成问题。

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

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

显然以下是不行的,因为单词的变化形式在不同的字符结尾:(。这将正确导致“luentoa”,但不正确导致“tehtäväa”)

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

回答

3

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

完整的句子也很重要,因为在许多语言中,一些词在句子中偏角取决于性别或数(单数/复数)句子的另一部分。单词之间通常有比英语更多的相互依赖关系。其结果是,要求翻译者翻译两个半句话,然后通过哑字符串连接来组合这两个半句子对于许多语言来说都是行不通的,尽管它对英语起作用。这就是翻译员需要处理整个句子的原因。

让我们假设你的结构"Edit this %(type)s"为芬兰语工作。例如,只要你想支持法语,它就不会起作用。同类型你提到你必须在法国这些句子:

Éditer cette leçon 
Éditer cet exercice 

(第一句可能已经被翻译为“leçon” Éditer ce cours哪个或“赛道”是最好要看是什么“讲座“在英语中指的恰恰是在你使用它的上下文中)。根据你使用的是什么单词,你会看到问题,在你的type之前,你可能需要”cet“,”cette“或”ce“ 。

+0

法语中的例子让我相信,这是翻译工作的正确原则。 – miikkas 2015-03-02 18:05:47

1

我想你必须依靠pgettext为你的翻译提供一个上下文。

例如

from django.utils.translation import pgettext_lazy 

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

有趣。这可能确实是一种做法,我可以用它来做其他事情,尽管一般来说 - 在我的具体问题上 - 我认为@Louis和Bernhard Vallant的答案更好。 – miikkas 2015-03-02 18:16:46

+0

我同意上面的答案比较好。 – 2015-03-02 19:29:46

2

假设你没有太多的不同类型,也许最简单的可能性,所以解决这个问题可能是只是让这句话作为一个整体翻译:

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

否则,你将不得不准备type之前的字符串,并设置了一些Contextual Markers,如果只有少数几种类型,这可能比所需的工作量更多。

+0

我最终使用了这种方法,将if-elif-elif -...- elif-endif序列包装在“{%with type = content.get_type%} ... {%endwith%}”中。 @Louis的回答开明了为什么这是正确的解决方案。 – miikkas 2015-03-02 18:10:20