2015-02-11 69 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