3

使用 Python 3 对 Pyramid 的国际化支持的当前状态是什么?

目前,Pyramid 用于此的包 lingua 和 babel 似乎与 Python 3 不兼容。

https://bitbucket.org/felixschwarz/babel-py3k,但没有正式发布。

同样对于 lingua,我只能找到一个叫做 lingua3k 的东西的影子,但是到它的链接到处都被破坏了,也没有正式发布。

我怎样才能让自己启动并运行 Pyramid i18n 和 Python 3?

4

3 回答 3

5

Py3 状态 2013 年 6 月 28 日

这是对 2013 年 3 月发布的两个答案的更新答案,适用于任何偶然发现此问题的人。

Babel for Python 3 的工作尚未正式发布。维护者有一张未解决的公开票:http: //babel.edgewall.org/ticket/209

然而,一群人拿起了火炬并开始了一个非官方的 BitBucket 回购来存放他们在 Babel3 上的工作:https ://bitbucket.org/babel3_developers/babel3

Pyramid 也使用 lingua。目前如果你尝试easy_install/pip install lingua,将会失败。唯一的原因是 xlwt 尚未正式移植。

如果要安装 lingua,则必须手动修补 xlwt。

安装非官方的 Babel3

目前,Python 3 中没有 Babel 的官方版本。pypi 也没有发布任何内容(即 easy_install babel/babel3 或 pip install babel/babel3 无法正常工作)。但是,您可以使用非官方版本。

  1. 要获得非官方版本,首先您需要安装 mercurial(源代码控制工具)。你需要这个来检查来自 BitBucket 的源代码。您可以在此处获取:https ://www.mercurial-scm.org/适用于 Windows 用户。对于 Linux/Unix,使用您的发行版工具来获取二进制文件或从源代码编译。
  2. 从命令提示符导航到要临时存储 Babel3 源安装文件的目录;然后运行:hg clone https://bitbucket.org/babel3_developers/babel3(Windows用户可能需要输入 hg.exe 的完整路径或确保将目录 hg.exe 添加到他们的路径中)
  3. 这将在您的本地计算机上创建一个包含 setup.py 文件的目录。进入新目录并执行文件:python setup.py install

安装 Lingua

Pyramid 的 i18n 依赖于另一个名为 lingua 的 Python 模块。另一个名为 xlwt 的模块依赖项存在问题。它也已在此处进行了非正式修补:https ://github.com/tonyroberts/xlwt

  1. 在此处获取 xlwt 补丁版本的源代码:https ://github.com/tonyroberts/xlwt (点击右下角的下载 zip)
  2. 将内容提取到临时位置
  3. 在结果目录中导航命令提示符
  4. 运行:python setup.py install
  5. 现在通过以下方式安装 lingua:​​ pip install lingua -或- easy_install lingua
于 2013-06-28T16:25:54.387 回答
3

我无法找到有关 python 3(babel 和 lingua)中金字塔 i18n 帮助程序包状态(当前或未来)的任何信息。

为了解决这个不便,我做了4件事:

  1. 使用 python2.7 创建第二个虚拟环境
  2. 添加一个名为 setup_i18n.py 的特定 i18n 设置文件
  3. 编写一个名为 translate.py 的简单包装脚本, setup.py 将调用它来进行翻译。
  4. 在 setup.py 中添加一个入口点以指向翻译脚本。

细节:

  1. 我在我的项目中使用 python2.7 创建了一个非常精简的第二虚拟和非常精简的环境。只需将其命名为 env_python_2.7 并将其放在我项目的根目录中。

  2. 然后在 setup.py 所在的目录中,我创建了另一个安装文件 setup_i18n.py。该文件仅对 i18n 支持所需的内容提出要求。我的 setup_i18n.py 文件如下所示:


from setuptools import setup, find_packages

requires = [
    'Babel',
    'lingua',
]

setup(name='my_project',
      packages=find_packages(),
      install_requires=requires,

      message_extractors={'.': [
          ('**.py', 'lingua_python', None),
          ('**.pt', 'lingua_xml', None),
          ]},
      )

  1. 然后我创建了一个名为 translate.py 的脚本,并将它放在从模板创建项目时 initializedb.py 进入的同一脚本目录中。该脚本非常通用,可以使其具有更具体的目标,但看起来像这样

import argparse
import subprocess
import sys

from pyramid.paster import (
    get_appsettings,
    setup_logging,
    )

description = """\
A script to facilitate the translation of strings in the app.
"""
parser = argparse.ArgumentParser(description=description)
parser.add_argument('ini_file', help='Ini file to setup environment for this script')
parser.add_argument('-a', '--add', metavar='locale',
                    help='Add locale name of new language for translation (eg: en, de)')

def main(argv=sys.argv):
    args = parser.parse_args()

    setup_logging(args.ini_file)
    settings = get_appsettings(args.ini_file)

    # Python 2.7 is needed for translation strings at this time, because the
    # available translation string tools are not compatible with Python 3
    # at this time
    python27 = settings['my_project.python27_dir'] + '/bin/python'
    setup_file = settings['my_project.i18n_setup_file']

    if args.add:
        subprocess.call([python27, setup_file, 'init_catalog', '-l', args.add])

    subprocess.call([python27, setup_file, 'extract_messages'])
    subprocess.call([python27, setup_file, 'update_catalog'])
    subprocess.call([python27, setup_file, 'compile_catalog'])

if __name__ == '__main__':
    main()

  1. 最后,我修改了 setup.py 入口点以指向翻译脚本。我的入口点如下所示:

entry_points="""\
[paste.app_factory]
main = my_project:main
[console_scripts]
my_project_db = my_project.script.initializedb:main
my_project_translate = my_project.script.translate:main
""",

现在我可以通过调用'python3 setup.py my_project_translate'来 i18n 我的应用程序

于 2013-03-11T04:28:37.270 回答
1

要以您的方式翻译 Python 应用程序,您通常有两个不同的步骤:

  • 提取消息目录
  • 翻译字符串

第一部分由 Babel 和 lingua 处理,第二部分是 gettext (或任何围绕它的包装,例如translationstring

简短回答:下载 Poedit 进行目录工作并使用常规 Pyramid 库进行翻译。

长答案

因此,如果 Babel 和 lingua 不适合您,您可以自己创建消息目录。然后,使用现有.pot文件,您可以.po为每种语言创建文件。如果你使用Poedit它可以自动将你的.po文件编译成.mo文件。只需使用 Python 的标准库gettext就可以处理这些,而无需任何依赖。

所以这就是你要做的:使用 Poedit 创建一个消息目录 ( File->New Catalog)。仔细应用所有设置。Poedit 甚至可以提取字符串,这里可能不需要手动操作,只要看看Catalog 属性中的Sources 路径Sources 关键字即可。

然后翻译所有(提取或手动添加的)字符串。Pyramid 将期望以下目录结构

myproject/
    locale/
        en/
            LC_MESSAGES/
                myproject.po
                myproject.mo
        myproject.pot

pot文件是您的目录。该en文件夹用于翻译成英文。对于此处设置的任何其他语言:de德语、es西班牙语等。您可以将.po文件创建为空并让 Poedit 从.pot文件中更新。

完成翻译后,请使用 Pyramid 的有关使用这些文件的文档。如果您可以通过其他方式提取消息,则不需要 Babel。

作为旁注:您用于翻译过程的所有内容都围绕 Python 的 gettext 进行,因此如果您遇到任何问题,您甚至可以使用该库。如果您有有效的目录,这将在任何情况下都有效。

于 2013-03-08T13:30:54.680 回答