与 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
.
目前,我的 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
.