【问题标题】:In Django, how to determine if translation for a given text is available?在 Django 中,如何确定给定文本的翻译是否可用?
【发布时间】:2011-05-06 03:19:39
【问题描述】:

我想确定给定字符串是否有当前语言的翻译。我想写一些类似的东西:

if not translation_available("my string"):
    log_warning_somewhere()

我没有找到合适的。 ugettext 函数只返回翻译或原始字符串(如果翻译不可用),但没有任何选项来确定翻译是否存在。

谢谢。

【问题讨论】:

  • 我相信你可以修改 NullTranslationCatalog 的 gettext 方法。一旦你到达这个目录,就意味着你已经绕过了所有的翻译,所以你可以在那里记录你的警告。最好向 Django 提交补丁 :)
  • 它肯定比公认的答案更有效(另外,我怀疑如果你使用 mofile 而不是 pofile,那也会更有效)。

标签: python django internationalization


【解决方案1】:

你可以使用 polib:https://bitbucket.org/izi/polib/wiki/Home

那些(未经测试的)代码行:

import polib
po = polib.pofile('path/your_language.po')
text == 'Your text'
is_translated = any(e for e in po if e.msgid == text and (not e.translated() or 'fuzzy' in e.flags) and not e.obsolete)

active 翻译可用时,这将给出 True。 'e.translated()' 单独为模糊和/或过时的短语返回 True。

【讨论】:

  • for e in po.translated_entries()... 可能会更有效率?
  • 对于任何未翻译的匹配条目,这不会返回 true 吗?
【解决方案2】:

对于任何寻求 hacky 解决方案的人:

from django.utils.translation import trans_real

def custom_gettext(msg):
    # Returns None when a data translation is not found
    return trans_real._active.value._catalog.get(msg)  # noqa

if custom_gettext("my string") is None:
    log_something()

【讨论】:

    【解决方案3】:

    正如你所说,如果没有可用的翻译,则 ugettext 将返回原始字符串,你不能将返回的值与原始值进行比较,看看它们是否相同?

    【讨论】:

    • 感谢您的回答,但这不是我一直在寻找的。在某些语言中,某些字符串可能会被有意翻译为英文字符串,而在其他倾向于翻译所有内容的语言中,翻译存在。所以这会给出一个错误的警告。我想检测一下翻译是否丢失。
    【解决方案4】:
    def translation_available(msg): return ugettext(msg) == msg
    

    【讨论】:

    • 感谢您的回答,但正如我上面写的:如果我故意将字符串翻译为英文,这将给出错误警告。
    • 这太依赖巧合了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-20
    • 1970-01-01
    • 2018-07-17
    • 2018-03-02
    • 1970-01-01
    • 2021-06-24
    • 1970-01-01
    相关资源
    最近更新 更多