【问题标题】:Word conjugation with Django i18n and gettext与 Django i18n 和 gettext 的单词共轭
【发布时间】:2015-02-11 18:56:47
【问题描述】:

目前,我的 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”。)

【问题讨论】:

    标签: django internationalization gettext


    【解决方案1】:

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

    整个句子也很重要,因为在许多语言中,句子中某些单词的偏角取决于句子另一部分的性别或数量(单数/复数)。单词之间的相互依赖性通常比英语中的要多。结果是要求翻译者翻译两个半句,然后通过哑字符串连接将这两个半句组合起来,对于许多语言来说是行不通的,即使它适用于英语。这就是为什么翻译者需要处理整个句子。

    假设你得到了结构 "Edit this %(type)s" 来为芬兰语工作。例如,只要您想支持法语,它就行不通。对于你提到的类型,你必须用法语写这些句子:

    Éditer cette leçon
    Éditer cet exercice
    

    (第一句可能必须翻译为Éditer ce cours。“leçon”或“cours”哪个最好取决于英语中的“lecture”在您使用它的上下文中究竟指的是什么。)您看到问题了,根据您使用的词,您可能需要在type 前面加上“cet”、“cette”或“ce”。

    【讨论】:

    • 法语中的例子让我相信,这是处理翻译的正确原则。
    【解决方案2】:

    假设您没有很多不同的类型,这可能是最简单的可能性,因此解决此问题可能是使整个短语可翻译:

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

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

    【讨论】:

    • 我最终使用了这种方法,将 if-elif-elif-...-elif-endif 序列包裹在 {% with type=content.get_type %}...{% endwith%} 中。 @Louis 的回答启发了为什么这是正确的解决方案。
    【解决方案3】:

    我认为您必须依靠 pgettext 为您的翻译提供上下文。

    例如

    from django.utils.translation import pgettext_lazy
    
    type_translations = {
        'lecture': pgettext_lazy('partitive', 'lecture'),
        'exercise': pgettext_lazy('partitive', 'exercise'),
    }
    

    【讨论】:

    • 有趣。这可能确实是一种方法,我可能会将它用于其他用途,尽管通常——在我的具体问题中——我认为@Louis 和 Bernhard Vallant 的答案中的解决方案更好。
    • 我同意以上答案更好。
    猜你喜欢
    • 1970-01-01
    • 2018-03-11
    • 1970-01-01
    • 2011-02-11
    • 1970-01-01
    • 2012-04-26
    • 1970-01-01
    • 2012-03-22
    • 1970-01-01
    相关资源
    最近更新 更多