跳转到主要内容

库和应用程序的国际化服务

项目描述

应用程序和库的翻译文本。

什么是morphi?

morphi 是为了创建一个具有内部本地化文本的可分发库而诞生的。尽管存在一些处理可翻译文本的现有包,但它们似乎都侧重于独立应用程序;似乎很少有可以与与打包库一起分发的消息一起工作的可用的。

基础

morphi 建立在以下想法之上

  • 内置的gettext模块

  • Babel

翻译

“morphi”模块提供了从本地文件系统或直接从包中加载与gettext兼容的翻译器的实用工具。默认的查找器将首先尝试在本地文件系统中定位消息文件(允许在特定系统上覆盖消息),但如果提供了包名,则将自动在包中搜索消息文件。这允许库将默认翻译消息存储在库包本身中,并在运行时成功加载这些消息。

“morphi”模块主要基于Babel包构建,使用speaklater进行懒加载。

消息管理

由于“morphi”模块基于“Babel”构建,因此“Babel”提供的标准“distutils”命令都可用,并对外暴露。因此,标准的“extract_messages”、“init_catalog”、“update_catalog”和“compile_catalog”命令都存在,并且像Babel文档中描述的那样工作。

除了标准的“Babel”“distutils”命令外,还增加了一个“compile_json”命令。该“compile_json”命令将消息编译成与gettext.jsjavascript库兼容的JSON文件。

在库中使用翻译

使用翻译的最简单方法是利用封装查找和“gettext”方法的“Manager”类,它还提供了一种在实例化后加载新消息文件的方法(允许在初始化后更改语言)。

例如,假设您正在创建一个名为“mylib”的启用翻译的库。以下代码可用于初始化和加载翻译以供使用。有关“地区注册表”的详细信息,请见下文。

# import the translation library
from morphi.messages import Manager
from morphi.registry import default_registry

# instantiate the translations manager
translation_manager = Manager(package_name='mylib')

# register the manager with the default locales registry
default_registry.subscribe(translation_manager)

# initialize shorter names for the gettext functions
gettext = translation_manager.gettext
lazy_gettext = translation_manager.lazy_gettext
lazy_ngettext = translation_manager.lazy_ngettext
ngettext = translation_manager.ngettext

请注意,通常,此代码应针对给定的包执行一次。建议将此代码添加到“extensions.py”或类似文件中,从该文件中可以加载“gettext”函数作为单例。

from mylib.extensions import gettext as _

print(_('My translatable text'))

格式变量

所有“gettext”函数都允许使用额外的命名参数,用于格式化翻译的字符串。库目前支持新式的.format类型格式。

print(_('Hello, {name}!', name='World'))

地区注册表

特别是在使用特定于包的翻译时,需要通知“Manager”当应用程序的语言设置(特别是地区)更改时,以便可以加载并显示正确的信息。为了简化此通知,可以使用“morphi.registry.Registry”(具有默认单例注册表名为“default_registry”)。然后,管理员可以订阅或取消订阅注册表,该注册表将在地区信息更改时通知所有管理员。

from morphi.registry import default_registry as locales_registry

locales_registry.locales = 'es'

通常,应在管理员实例化后立即将其注册到注册表。

Jinja环境

如果使用Jinja模板,应初始化Jinja环境以添加翻译函数。

from morphi.helpers.jinja import configure_jinja_environment

configure_jinja_environment(app.jinja_env, manager)
{{ _('Hello, world!') }}

JavaScript翻译

如上所述,库中添加了一个“compile_json”“distutils”命令,该命令将消息编译成与messages.js兼容的JSON文件。库可以初始化和使用如下

<script src="{{url_for('mylib.static', filename='gettext.min.js')}}"></script>
<script>
    var i18n = window.i18n({});
    window._ = function(msgid, domain) {
        return i18n.dcnpgettext.apply(
            i18n,
            [domain, undefined, msgid, undefined, undefined].concat(
                Array.prototype.slice.call(arguments, 1)
            )
        );
    };
    {% set json_filename = find_mo_filename(package_name='mylib',
                                            extension='json',
                                            localedir='static/i18n') %}
    {% if json_filename %}
        {# strip off the leading 'static/' portion of the filename #}
        {% set json_filename = json_filename[7:] %}
    $.getJSON(
        '{{ url_for("mylib.static", filename=json_filename) }}'
    ).then(function (result) {
        i18n.loadJSON(result, 'mylib');
    });
    {% endif %}
</script>

. . .

<p>_('Hello, world!', 'mylib')</p>

请注意存在 find_mo_filename 函数;此函数通过调用如上所述的 configure_jinja_environment 管理方法来提供。

安装

morphi 可以通过 pip 进行安装

pip install morphi

要安装开发版本,只需添加 develop 标签

pip install morphi[develop]

开发

测试

测试目前使用 pytest

pytest morphi

变更日志

0.2.2 版本发布于 2023-03-02

  • 包含 pytz,因为 babel 默认不再包含 (4beab17)

0.2.1 版本发布于 2022-10-26

  • 更新包设置和 CI,解决 pkg_resources 警告 (cd0f750)

0.2.0 版本发布于 2020-05-12

  • 使用 pyp 进行发布 (c4cf37f)

  • 支持 Babel 2.7+ 并提供 CI 辅助方法 (bc0ef3f)

0.1.2 版本发布于 2019-02-11

  • 修复使用资源加载器时,使用无效用户提供的资源路径的错误

0.1.1 版本发布于 2018-09-20

  • 修复在 pyinstaller 下对 pkg_resources 的支持

0.1.0 版本发布于 2018-08-22

  • 添加初始翻译实现

项目详情


下载文件

下载您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源代码发行版

morphi-0.2.2.tar.gz (17.1 kB 查看散列)

上传时间 源代码

构建发行版

morphi-0.2.2-py2.py3-none-any.whl (16.8 kB 查看散列)

上传时间 Python 2 Python 3

由以下赞助

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页