【问题标题】:internationalization with pyramid and python 3使用金字塔和 python 3 进行国际化
【发布时间】:2013-02-15 10:45:03
【问题描述】:

目前使用 Python 3 对 Pyramid 的国际化支持情况如何?

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

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

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

如何让自己开始使用 Pyramid i18n 和 Python 3?

【问题讨论】:

    标签: python python-3.x internationalization pyramid


    【解决方案1】:

    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

    【讨论】:

    • 当我尝试提取消息时,我收到一条错误消息:“ImportError: No module named 'StringIO'”。我认为这是 Lingua 的 Python 2 用法。那么也许还需要获取最新的 Lingua 资源?
    • 在 Flask-Babel Github 上有一个 Python 3 支持的提交,但我还没有测试过:github.com/mitsuhiko/flask-babel/commit/…
    【解决方案2】:

    我无法找到有关 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 我的应用程序

    【讨论】:

      【解决方案3】:

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

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

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

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

      长答案

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

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

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

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

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

      完成翻译后,请使用 Pyramid 在working with those files 上的文档。如果您可以通过任何其他方式提取消息,则不需要 Babel。

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

      【讨论】:

      • 感谢您的详细回复。它解释了如何很好地完成 i18n,但我没有看到与 Python 3 的联系,这正是我所追求的。我将继续回答我自己的问题。请看看我真正追求的是什么。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-13
      • 2018-02-05
      相关资源
      最近更新 更多