国际化和本地化#

要国际化您的扩展,需要执行以下任务

注意

请仔细阅读 规则,因为它们是国际化正常工作的严格约束。

  1. ITranslator 令牌从 @jupyterlab/translation 包添加到您的插件依赖项中。

const extension: JupyterFrontEndPlugin<void> = {
  id: 'jupyterlab-extension',
  autoStart: true,
  requires: [ITranslator],
  activate: (app: JupyterFrontEnd, translator: ITranslator) => {}
};
  1. 从您扩展翻译所在的域获取翻译包。

const trans = translator.load('my_domain');

注意

一个好的做法是使用您的扩展名,只使用字母、数字和 _ 字符。

域通过将 - 替换为 _ 字符来规范化。

  1. 使用 gettext 函数 之一包装所有可翻译的字符串。

示例

this._trans.__('String to be translated');
this._trans.__('%1 is argument of a translated string', adjective);
this._trans._n('Singular string for %1', 'Plural string for %1', n);

您也可以查看 拼写检查器扩展 上的以下拉取请求。

  1. 创建并发布您的扩展的翻译。

有两种选择:您可以将您的扩展添加到 JupyterLab 语言包 中,或者您可以创建一个 python 包来分发您的扩展翻译(见下文)。

创建翻译 python 包#

JupyterLab 遵循 Gettext 的翻译方法。Gettext 从源代码中提取字符串,并使用提供的翻译进行编译(在 Python 文档 中了解更多信息)。

通过使用 jupyterlab-translate,您可以提取、更新和编译您的翻译。

之后,您必须将编译后的翻译(.json、.mo)包含到您的 python 包中。这可以通过编辑这两个文件来完成。

setup.py

from setuptools import setup

setup(
    # ...
    entry_points={"jupyterlab.locale": ["jupyterlab_some_package = jupyterlab_some_package"]},
)

MANIFEST.in

recursive-include jupyterlab_some_package *.json
recursive-include jupyterlab_some_package *.mo

注意

服务器测试 中提供了一个示例

设置翻译#

设置模式也可以翻译。可翻译的字符串使用 JSON 路径上的正则表达式选择器提取。默认情况下,使用以下选择器

  • title:设置标题

  • description:设置描述

  • properties/.*/title:属性标题

  • properties/.*/description:属性描述

  • definitions/.*/properties/.*/title:定义中的属性标题

  • definitions/.*/properties/.*/description:定义中的属性描述

  • jupyter\.lab\.setting-icon-label: JupyterLab 中的设置图标标签

  • jupyter\.lab\.menus/.*/label: JupyterLab 中的菜单标签

  • jupyter\.lab\.toolbars/.*/label: JupyterLab 中的工具栏项目标签

这些选择器可以使用 schema 中的 jupyter.lab.internationalization 键进行配置。以下示例将选择 myprop 属性的默认值

"jupyter.lab.internationalization": {
    "selectors": [
        "properties/myprop/default",
    ],
    "domain": "my_jlab_extension"
}

在上面的示例中,还指定了定义翻译的特定域(此处为 my_jlab_extension)。如果没有指定域,则默认为 jupyterlab

规则#

为了从代码中提取字符串,必须遵循以下规则。

  • 域名称通过将 - 替换为 _ 来规范化

  • 翻译包变量必须是以下之一

    • trans

    • this.trans

    • this._trans

    • this.props.trans

    • props.trans

有效的示例

trans.__('This translatable string will be found');
this.trans.__('This translatable string will be found');
this._trans.__('This translatable string will be found');
this.props.trans.__('This translatable string will be found');
props.trans.__('This translatable string will be found');

无效的示例

translator.__('This translatable string WONT be found');
__('This translatable string WONT be found');
this.__('This translatable string WONT be found');

要解决此问题,请将您的变量更改为使用可接受的名称

const trans = translator;
trans.__('This translatable string will be found');
  • 字符串必须直接传递给函数;不要使用变量或常量

无效的示例

const errorMessage = 'This translatable string WONT be found'
trans.__(errorMessage);

要解决此问题,请直接传递字符串

trans.__('This translatable string will be found');