我可以获取特定字典的整个 i18n 标签吗?



我遇到了 i18n 标签的问题。

我的应用程序使用 Granite.I18n.get('') 函数在 js 前端读取几个 i18n 标签。整个字典被下载为"/libs/cq/i18n/dict.{+locale}.json",如"/etc/clientlibs/foundation/shared/source/init.js"中规定的那样。

现在,en 字典仅返回自定义标签,并且体积很小。 但是其他语言,如fr,字典文件是所有/libs字典的聚合,非常庞大。我在其他几个网站也注意到了这一点。

tennantco.com

en 字典 - 118 KB

FR 词典 - 1.4 MB

Timewarnercable.com

en 字典 - 1.1 KB

FR 词典 - 1.2 MB

热飞鱼

en 字典 - 3 KB

FR 词典 - 695 KB

我们的痛点是,在 CDN 上缓存这个繁重文件的成本增加,并试图找到降低 CDN 成本的方法。

我知道 en 标签本身就是关键。但是 ExportServlet 只能过滤掉 en 的渲染自定义字典。我们的词典类似于/libs 下的 otb 词典。那么为什么 ExportServlet 在 en export 下处理 otb 标签?

此错误是在所有CMS产品中常见还是特定于Adobe?还需要解决方案或解决方法来仅获取其他语言的自定义词典。

英语词典很小,因为英语条目是键而不是翻译。法语(和其他语言)很大,因为它们包含英语密钥和进一步的翻译。此外,许多密钥仅在翻译语言中可用,只是因为密钥用作默认翻译。

因此,对于法语,如果您使用Granite.I18n.get('Hello world!'),如果找到法语翻译,它将返回法语翻译,否则它将仅返回"Hello World",如果语言上下文为英语,则不需要翻译。

由于在客户端评估JS的性质,该产品旨在下载完整的字典,包括产品本身的OOTB翻译,因为i18n实现不是上下文感知的,无法过滤掉不需要的翻译。

虽然方便,但不幸的是,这是使用Granite.I18n.get('')的限制和副作用。

可能的解决方法

  • 通过使用服务器端 i18n 库并在服务器上仅呈现所需的翻译并用作部分 HTML,可以避免 Granite.I18n.*。这可能不适用于SPA。
  • 如果您使用的是像 Angular(x) 这样的 SPA 框架,那么它们支持 i18n 工厂初始化,可以挂接到下载过滤后的 i18n 的自定义 servlet 响应中。这可能是很多工作,如果翻译的术语太多并且字典变大,大小仍然是一个问题。
  • 压缩、最小化和缓存字典。您可以使用 Apache 模块或输出过滤器来做到这一点。这将减少流量的大小和负载,但同样不能保证随着翻译的增长,整个字典的大小会变小。

通常,页面只能呈现所需的内容。使用JS进行后期翻译将强制下载字典,而Granite.i18n无法满足优化的下载体验。

我最终编写了一个自定义实现,因为我在这个问题上也没有从 Adobe 票证中获得太多帮助。

  • OTB 字典 json 由 ResourceBundleExportServlet 渲染
  • 我创建了一个自定义的 sling servlet,它将准备并返回类似于 ResourceBundleExportServlet 的 json
  • 修改了/etc/clientlibs/granite/utils/source/I18n.js 调用自定义 servlet 而不是 otb servlet。
  • 自定义 servlet 被编码为仅返回特定的数据字典,而不是所有字典。

这解决了我的问题。虽然我不相信这是正确的解决方案。需要一种 otb 方法来使其干净。

我们面临着使用 Granite.i18n 库在客户端获取 I18n 值的类似要求 这就是我所做的。

  1. 创建了一个自定义 servlet,该 servlet 返回类似于 ResourceBundleExportServlet 的
    JSON 响应。
  2. 使用 basename
  3. 和 locale 参数加载捆绑包 - ResourceBundle resourceBundle = req.getResourceBundle(basename,pageLocale
    );
  4. 在语言特定的 i18n xml 文件中添加了 sling:basename="basename_constant"',该文件位于/apps/project-name/i18n 文件夹中。在我的 在这种情况下,我正在设置区域设置本身的值,例如:"zh_cn"。

4.In clientlibs javascript 文件设置 Granite.I18n.setUrlPrefix("/bin/custom/i18n/dict."); 从
自定义 servlet URL 获取。这不需要修改 OOTB I18n.js

这里有一个答案,可以在您尝试获取特定字典时为您提供帮助:https://stackoverflow.com/a/55656153/14465431

看看提到吊索的部分:基本名称

这也适用于一个站点

例:

[sling:Language] > mix:language
mixin
- sling:basename (string)
- sling:basename (string) multiple

http://localhost:4502/libs/cq/i18n/dict.es。[sling:basename-value].json

OTB 解决方案:)

最新更新