i18n图书馆和应用服务

morphi的Python项目详细描述


形态

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

什么是莫菲?

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

基础

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

< Buff行情>
  • 内置的gettext模块
  • 巴贝尔

翻译

morphi 模块提供加载与gettext兼容的实用程序 来自本地文件系统或直接来自包的转换器。默认值 finder将首先尝试在本地文件系统中定位消息文件(允许 要在特定系统上重写的消息),但是,如果给定包名称, 然后将自动搜索包中的邮件文件。这允许一个库 将默认翻译消息存储在库包本身中,并且仍然具有 这些消息将在运行时成功加载。

morphi 模块主要围绕 babel 包,带有 speaklater 用于延迟查找。

消息管理

由于 morphi 模块是基于 babel 构建的,因此标准的 distutils 命令 由巴别塔提供,可供下游使用。这样, 标准 提取信息 初始目录 更新目录 ,以及 编译目录 所有命令都存在,并按照 babel文档中的说明工作

除了标准的 babel distutils 命令之外,还有一个 编译json 命令已添加。compile-json命令将把消息编译成 与 gettext.js javascript库。

在库中使用翻译

使用翻译的最简单方法是使用 管理器类 封装查找和gettext方法,并提供一种加载方法 实例化后的新消息文件(允许在 初始化)。

例如,假设您正在创建一个名为"mylib"的支持翻译的库。 以下内容可用于初始化和加载要使用的翻译。细节 关于"locales注册表",可在下面找到。

# import the translation libraryfrommorphi.messagesimportManagerfrommorphi.registryimportdefault_registry# instantiate the translations managertranslation_manager=Manager(package_name='mylib')# register the manager with the default locales registrydefault_registry.subscribe(translation_manager)# initialize shorter names for the gettext functionsgettext=translation_manager.gettextlazy_gettext=translation_manager.lazy_gettextlazy_ngettext=translation_manager.lazy_ngettextngettext=translation_manager.ngettext

注意,一般来说,对于给定的 包裹。建议将此代码添加到 extensions.py 或类似的 文件,从中可以将getText函数作为单例加载。

frommylib.extensionsimportgettextas_print(_('My translatable text'))

格式变量

getText函数都允许在 正在格式化转换的字符串。库当前支持新样式 。格式 键入格式。

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

区域设置注册表

尤其是在与特定于包的翻译一起使用时, 当应用程序的语言 设置(特别是区域设置)被更改,以便正确的消息 可以加载和显示。为了简化此通知, 变形注册表默认的单例注册表 可以使用名为 的默认注册表。然后可以订阅或 取消订阅注册表,注册表将在 区域设置信息已更改。

frommorphi.registryimportdefault_registryaslocales_registrylocales_registry.locales='es'

通常,管理者应该在 它已被实例化。

金贾环境

如果使用jinja模板,则应该初始化jinja环境以添加 翻译功能。

frommorphi.helpers.jinjaimportconfigure_jinja_environmentconfigure_jinja_environment(app.jinja_env,manager)
{{_('Hello, world!')}}

javascript翻译

如上所述,库中添加了一个 compile-json distutils 命令, 它将把消息编译成与 messages.js 兼容的json文件。图书馆 可以按如下方式初始化和使用

<scriptsrc="{{url_for('mylib.static', filename='gettext.min.js')}}"></script><script>vari18n=window.i18n({});window._=function(msgid,domain){returni18n.dcnpgettext.apply(i18n,[domain,undefined,msgid,undefined,undefined].concat(Array.prototype.slice.call(arguments,1)));};{%setjson_filename=find_mo_filename(package_name='mylib',extension='json',localedir='static/i18n')%}{%ifjson_filename%}{#stripofftheleading'static/'portionofthefilename#}{%setjson_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 函数;此函数可用 通过调用如上所述的配置jinja环境管理器方法。

安装

morphi 可以通过 pip安装:

pip install morphi

要安装以进行开发,只需添加 development 标记:

pip install morphi[develop]

开发

测试

测试当前使用的是pytest

# import the translation libraryfrommorphi.messagesimportManagerfrommorphi.registryimportdefault_registry# instantiate the translations managertranslation_manager=Manager(package_name='mylib')# register the manager with the default locales registrydefault_registry.subscribe(translation_manager)# initialize shorter names for the gettext functionsgettext=translation_manager.gettextlazy_gettext=translation_manager.lazy_gettextlazy_ngettext=translation_manager.lazy_ngettextngettext=translation_manager.ngettext
0

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java对ServiceListener和ServiceTracker调用提供了哪些排序保证?   java找不到方法格式的符号(DateTimeFormatter)?   mysql有没有一种方法可以将TCPDump输出到一个文件中,并用Java对其进行过滤,每5秒钟用新数据覆盖一次该文件?   java如何最好地配置用户上传支持文件的上传位置   java我在Android上使用OData4j,我无法获取实体   JPA实体关系简单示例中的java获取错误   JAVANoClassDefFoundError:安卓。应用程序。用法安卓中的UsageStatsManager   Eclipse中javaoo代码分析   java MethodVisitor抛出类格式错误   java为什么在从ViewModel调用时,改型排队不起作用?   调试小程序Java控制台:删除跟踪消息大小限制   java复杂安卓活动动画   java如何在使用JDOM2解析XML时忽略注释内容   java通过循环创建文本字段   即使在bufferedwriter关闭后也未发现java文件异常   单链表恢复中的java错误