【问题标题】:How to keep translations separated where the same word is used in English but a different one in other languages?如何在英语中使用相同单词但在其他语言中使用不同单词的情况下将翻译分开?
【发布时间】:2021-03-19 00:12:02
【问题描述】:

假设我有一份报告,实际上是一封信,我需要将其翻译成多种语言。我在表单中创建了一个 greeting 字段,该字段由 onchange 事件方法以编程方式填充。

if self.partner_id.gender == 'female':
    self.letter_greeting = _('Dear %s %s,') % (         # the translation should be "Estimada"
        self.repr_recipient_id.title.shorcut, surname
    )
elif self.partner_id.gender == 'male':
    self.letter_greeting = _('Dear %s %s,') % (         # translation "Estimado"
        self.repr_recipient_id.title.shorcut, surname
    )
else:
    self.letter_greeting = _('Dear %s %s,') % (         # translation: "Estimado/a"
        self.partner_id.title.shorcut, surname
    )

在这种情况下,单词Dear 应该根据使用的选项翻译成不同的西班牙语翻译,这是因为我们根据性别使用不同的终止。导出po 文件,我发现所有选项都是完全一致的,这是有道理的,因为几乎所有情况下的翻译都是相同的,但在这种情况下并非如此:

#. module: custom_module
#: code:addons/custom_module/models/sale_order.py:334
#: code:addons/custom_module/models/sale_order.py:338
#: code:addons/custom_module/models/sale_order.py:342
#, python-format
msgid "Dear %s %s,"
msgstr "Dear %s %s,"

我可以直接申请的解决方案

  • 每次我需要更新 po 文件时,将所有术语放在不同的条目中,以避免手动进行相同的翻译。如果您对这个问题有很多不同的词,这可能会很麻烦。如果我这样做并使用 poedit 打开文件,则会出现此错误:duplicate message definition

  • 将所有可能的组合都用斜线表示,这是在 Odoo 的其他部分完成的。对于两种性别都是:

#. module: stock
#: model:res.company,msg:stock.res_company
msgid "Dear"
msgstr "Estimado/a"

这只是一个例子。我可以想到许多在英语中看起来相同的单词,但根据上下文,它们在其他语言中使用不同的拼写或含义。

可能的最佳解决方案

  • 我不知道 Odoo 是否知道某个单词的 context 是否已被翻译。手动添加上下文可以解决问题,至少对于具有不同含义的单词而言。

  • 最好的解决方案是为翻译模块设置一个参数,以确保将单词作为特定翻译的独立条目导出。

你是不是觉得我太重视它了哈哈?不知道有没有更好的解决方案?为什么 poedit 根本没有考虑到这个问题?

【问题讨论】:

  • 我们已将这些半静态报表部分外包给 odoo 模型,其中 char 字段是可翻译的。使用这种方法,您在报告内容的上下文中会更加灵活。对于问候,我们还构建了一些特别的东西。我们只是扩展了 res.partner.title 并实现了功能以获得对合作伙伴的完整称呼。最后是相同的方法(可翻译的字符字段),但称呼是与合作伙伴绑定的,所以我们直接在 res.partner.title 上做了一个。我们甚至在 res.partner.title 上添加了一些性别内容。
  • 非常好的想法@CZoellner,谢谢。如果您将其写在答案中,我会接受。我希望有一些更复杂的东西可以在这些术语之间产生差异,但恐怕不会,或者至少在导出 po 文件时在 Odoo 中。一些other tranlation tools 可以考虑上下文
  • 这将是太多的代码,我可能不允许在这里发布代码;-)
  • @CZoellner 不,我不是要发布完整代码哈哈,你在评论中写的解释对我来说已经足够了:) 你可以发布它作为答案

标签: odoo translation multilingual po poedit


【解决方案1】:

在某种程度上,这是一个语言学问题。我相信最好的解决方案是使用不同的“源语言”,一种由键组成,然后将英语作为另一种翻译。英语中的“亲爱的”一词没有性别上下文(通常,大部分英语都没有),而西班牙语中的“Estimado”一词则有。从那个西班牙语单词到英语的翻译更合适的是“Masculine Dear”。因此,使用键作为源语言,您将拥有:

SourceText (EnglishDescription) -> Translation (English) -> Translation (Spanish)
DearMasculine -> Dear -> Estimado
DearFeminine -> Dear -> Estimada
DearNuetral -> Dear -> Estimado/a

【讨论】:

    【解决方案2】:

    我建议扩展模型res.partner.titleres.partner

    res.partner.title 应该获得一个可翻译的字段来保存称呼前缀,例如“Dear”或“Sehr geehrter”(德语)。也许也值得了解一些有关性别的信息,但我不会在这里详细介绍。 您可能希望向配置用户显示“Dear Mr. Name”之类的示例或类似内容。计算域应该可以工作。

    res.partner 上,您应该只实现一个计算字段或只实现一个方法来获得合作伙伴记录的完整称呼。

    【讨论】:

    • 我什至更喜欢 Andrew 的解决方案,以获得更通用的方法。看看它,你怎么看?我认为静态内容是最好的,你的很好,因为用户可以更新翻译并添加更多记录
    • 这也可以通过我的解决方案来完成。在他的解决方案中,没有提示如何在 Odoo 中做到这一点。对于性别部分,我的解决方案拥有一切,甚至 Odoo 对性别一无所知:只需创建多个“亲爱的”或像 Andrew 的回答那样做。我提到的称呼前缀将是要翻译的真实文本。
    • 是的,您的解决方案非常适合我的示例。 Andrew 的解决方案可以直接按照他在 Odoo 中针对静态内容所说的方式来完成。只需为要进行不同翻译的每个单词使用不同的键并导出英语以正确翻译单词。即使在该文档中它会是冗余的。
    猜你喜欢
    • 2019-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-23
    • 1970-01-01
    • 1970-01-01
    • 2021-05-15
    相关资源
    最近更新 更多