图书馆和应用程序的 i18n 服务
项目描述
应用程序和库的可翻译文本。
什么是吗啡?
morphi的诞生是出于创建具有内部本地化文本的可分发库的需要。尽管有几个处理可翻译文本的现有包,但它们似乎都专注于独立应用程序;似乎很少有可用于处理与打包库一起分发的消息。
基础
morphi建立在从以下收集到的想法之上:
内置的 gettext 模块
通天塔
翻译
morphi模块提供了用于从本地文件系统或直接从包中加载与gettext兼容的翻译器的实用程序。默认查找器将首先尝试在本地文件系统中查找消息文件(允许在特定系统上覆盖消息),但是,如果给出了包名称,则会自动在包中搜索消息文件。这允许库将默认翻译消息存储在库包本身中,并且仍然可以在运行时成功加载这些消息。
morphi模块主要围绕 Babel包构建, speaker用于惰性查找。
消息管理
由于morphi模块是在Babel上构建的,因此Babel提供的标准distutils命令是可用的,并且可供下游使用。因此,标准的extract_messages、init_catalog、update_catalog和compile_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
0.1.2 发布 2019-02-11
在资源加载器中使用无效的用户提供的资源路径时修复错误
0.1.1 发布 2018-09-20
修复 pyinstaller 下的 pkg_resources 支持
0.1.0 发布 2018-08-22
添加初始翻译实现
项目详情
下载文件
下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。