Skip to main content

图书馆和应用程序的 i18n 服务

项目描述

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

什么是吗啡?

morphi的诞生是出于创建具有内部本地化文本的可分发库的需要。尽管有几个处理可翻译文本的现有包,但它们似乎都专注于独立应用程序;似乎很少有可用于处理与打包库一起分发的消息。

基础

morphi建立在从以下收集到的想法之上:

  • 内置的 gettext 模块

  • 通天塔

翻译

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

morphi模块主要围绕 Babel包构建, speaker用于惰性查找。

消息管理

由于morphi模块是在Babel上构建的,因此Babel提供的标准distutils命令是可用的,并且可供下游使用。因此,标准的extract_messagesinit_catalogupdate_catalogcompile_catalog 命令都存在并且按照Babel 文档中的描述工作。

除了标准的Babel distutils命令之外,还添加了一个额外的compile_json 命令。compile_json命令会将消息编译成与gettext.js javascript 库兼容的 JSON 文件 。

在库中使用翻译

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

例如,假设您正在创建一个名为“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'))

语言环境注册表

特别是在与包特定的翻译一起使用时, 需要能够在应用程序的语言设置(特别是区域设置)更改时通知管理器,以便可以加载和显示正确的消息。为了简化此通知, 可以使用morphi.registry.Registry(带有一个名为default_registry的默认单例注册表)。经理可以订阅或取消订阅注册表,然后当区域设置信息发生更改时,注册表将通知所有经理。

from morphi.registry import default_registry as locales_registry

locales_registry.locales = 'es'

通常,管理器应在实例化后立即向注册表注册。

金贾环境

如果使用 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=<s>"{{url_for('mylib.static', filename='gettext.min.js')}}"</s>></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

要安装用于开发,只需添加开发标签:

pip install morphi[develop]

发展

测试

测试当前使用pytest

pytest morphi

变更日志

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.0.tar.gz (14.6 kB 查看哈希)

已上传 source

内置分布

morphi-0.2.0-py2.py3-none-any.whl (16.6 kB 查看哈希

已上传 py2 py3