库和应用程序的国际化服务
项目描述
应用程序和库的翻译文本。
什么是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
0.1.2 版本发布于 2019-02-11
修复使用资源加载器时,使用无效用户提供的资源路径的错误
0.1.1 版本发布于 2018-09-20
修复在 pyinstaller 下对 pkg_resources 的支持
0.1.0 版本发布于 2018-08-22
添加初始翻译实现
项目详情
下载文件
下载您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。