我可以获得特定字典的完整i18n标签吗?

时间:2017-07-26 14:41:24

标签: internationalization cq5 aem

我正面临着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 dictionary - 118 KB

     

fr dictionary - 1.4 MB

     

Timewarnercable.com

     

en dictionary - 1.1 KB

     

fr dictionary - 1.2 MB

     

赛默飞

     

en dictionary - 3 KB

     

fr dictionary - 695 KB

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

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

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

4 个答案:

答案 0 :(得分:2)

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

  1. 创建了一个自定义servlet,它返回类似于
    的JSON响应 ResourceBundleExportServlet。
  2. 使用basename和locale参数加载bundle - ResourceBundle resourceBundle = req.getResourceBundle(basename,
    pageLocale);
  3. 添加了吊索:basename =" basename_constant"'在特定于语言的i18n xml文件中,该文件位于/ apps / project-name / i18n文件夹中。在我的 case,我正在设置locale本身的值ex:" zh_cn"。
  4. 4.在clientlibs javascript文件中设置Granite.I18n.setUrlPrefix(" / bin / custom / i18n / dict。");从中获取     自定义servlet URL。这并不需要修改OOTB I18n.js

答案 1 :(得分:1)

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

所以对于法语,如果你使用Granite.I18n.get('Hello world!'),它将返回法语翻译,否则它将只返回'Hello World',如果语言上下文是英语则不需要翻译。

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

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

可能的解决方法

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

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

答案 2 :(得分:1)

我最终编写了一个自定义实现,因为我在这个问题上没有得到Adobe门票的帮助。

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

这解决了我的问题。虽然我不相信是正确的解决方案。需要一种使这种清洁呈现的方式。

答案 3 :(得分:0)

当您尝试获取特定词典时,这是一个可以帮助您的答案:https://stackoverflow.com/a/55656153/14465431

查看提及 sling:basename

的部分

这也适用于一个站点

示例:

[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解决方案:)