【问题标题】:One .po file for each .py script每个 .py 脚本一个 .po 文件
【发布时间】:2021-03-24 15:05:09
【问题描述】:

在我的包中,我想为它包含的每个 .py 脚本使用一个 .po 文件。 这是我的文件树:

foo
   mainscript.py
   commands/
      commandOne.py
   locales/fr/LC_MESSAGES/
      mainscript_fr.po
      commandOne_fr.po

在 mainscript.py 中,我得到以下行来将 gettext 应用于字符串:

if "fr" in os.environ['LANG']:
    traduction = gettext.translation('mainscript_fr', localedir='./locales', languages=['fr'])
    traduction.install()
else:
    gettext.install('')

到目前为止,它按预期工作。但现在我想添加另一个 .po 文件来翻译 commandOne.py 中的字符串。 我尝试了以下代码:

if "fr" in os.environ['LANG']:
    traduction = gettext.translation('commandOne_fr', localedir='../locales', languages=['fr'])
    traduction.install()
else:
    gettext.install('')

但我收到“FileNotFoundError: [Errno 2] No translation file found for domain: 'commandOne_fr'”

我怎样才能使用这样的多个文件?该软件包是一个 cli,由于帮助手册和详细模式等原因,单个文件中有许多字符串,而单个 .po 文件包含数百个字符串是不可接受的。

注意:mainscript.py 从 commandOne.py 调用一个函数,该函数本身继承自一个抽象类,其中包含要翻译的其他字符串...所以我希望如果存在任何解决方案,它也适用于抽象类文件。

谢谢

【问题讨论】:

    标签: python-3.x gettext


    【解决方案1】:

    .mo 文件而不是.po 文件中检索翻译,请参阅https://docs.python.org/3/library/gettext.html#gettext.translation。很可能您必须将CommandOne_fr.po 与程序msgfmt 编译成CommandOne_fr.mo

    另外两个提示:

    您所做的看起来像是过早的优化。在翻译数量变得非常大之前,您不会遇到任何性能问题。而是等待它发生。

    为什么翻译文件的名称中有_fr?语言代码fr 已经是路径组件了。

    【讨论】:

    • 是的,.mo 文件和它们的 .po 文件也在 locales 文件夹中。我不想在我的树中放置太多无用的信息。问题是我不会是唯一一个为此工作的人,几个月后它将由其他人维护,如果他们需要更正特定字符串中的某些内容,我希望他们不会丢失。 “_fr”是为了防止文件从其语言环境文件夹中丢失,但我承认这有点过分x)
    • 但是你让我想:也许我们可以将多个.po文件编译成1个.mo文件,那么问题就解决了
    • 您可以将多个 po 文件合并到一个 po 文件中,因为 xgettext 将接受 po 文件作为输入,而无需任何其他选项。然后可以将合并的 po 文件编译为一个 mo 文件。但我还是不明白这一点。
    • 从翻译人员的角度来看,要翻译多个小的.po 文件而不是一个较大的文件通常是不切实际且不方便的。
    • @LauriNurmi,请参阅我之前的评论。您可以轻松地合并和稍后拆分 .po 文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-21
    • 1970-01-01
    • 2012-03-29
    • 1970-01-01
    • 2023-03-26
    相关资源
    最近更新 更多