目前,我在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”。)
答案 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'),
}