我可以收到特定字典的全部国际标签吗?
我正面临国际标签问题。我可以收到特定字典的全部国际标签吗?
我的应用程序使用Granite.I18n.get('')函数在js前端读取少量i18n标签。根据'/etc/clientlibs/foundation/shared/source/init.js'中的规定,整个字典会被下载为'/libs/cq/i18n/dict.{+locale}.json'。
现在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如何在输出时处理otb标签?
此错误在所有CMS产品中都是常见的还是特定于Adobe?还需要解决方案或解决方法才能为其他语言获取自定义字典。
我最终编写了一个自定义实现,因为我没有从Adobe门票中获得很多帮助。
- OTB字典JSON是由ResourceBundleExportServlet呈现
- 我创建了一个自定义的吊带servlet,它会做准备,并返回JSON类似ResourceBundleExportServlet
- 修改/etc/clientlibs/granite/utils/source/I18n.js到调用自定义servlet而不是otb servlet。
- 自定义servlet被编码为只返回特定的数据字典而不是所有的字典。
这解决了我的问题。虽然我不相信是适当的解决方案。需要采取一种完全呈现这种干净的方式。
英语词典很小,因为英语条目是键而不是翻译。法语(和其他语言)很大,因为它们包含英语和进一步翻译的关键。另外,许多密钥仅在翻译语言中才可用,因为密钥被用作默认翻译。
因此,对于法语,如果您使用Granite.I18n.get('Hello world!')
,它将返回法语翻译,如果它发现它,否则它将简单地返回'Hello World',如果语言环境是英语,则不需要翻译。
由于JS在客户端进行评估的性质,该产品旨在下载完整字典,包括产品本身的OOTB翻译,因为i18n实现不是上下文感知的,并且不能过滤掉不需要的翻译。
虽然方便,但这是使用Granite.I18n.get('')
不幸的一个限制和副作用。
可能的解决方法
- Granite.I18n *可以通过使用服务器侧I18N库和渲染仅在服务器所要求的翻译和作为局部HTML来避免。此可能不适用于SPA的。
- 如果您正在使用Angular(x)等SPA框架,那么它们支持i18n工厂初始化,可以挂接到定制的servlet响应下载过滤后的i18n。这可能会有很多工作,并且如果翻译过多的词汇并且字典变大,这个大小仍然会成为问题。
- 压缩,最小化和缓存字典。你可以用Apache模块或输出过滤器来完成。这将减少流量的大小和负载,但又不能保证随着翻译的增长,整个字典的大小会变小。
一般来说,页面只能呈现需要的内容。使用JS进行迟到翻译将强制下载字典,而Granite.i18n不适合优化下载体验。
感谢您的解释。我编辑了这个问题。我需要一个解决方案或解决方法来解决这个问题。我明白这是产品错误,但如何解决这个问题? –
我认为现在的路径是'/ libs/cq/i18n' – Akash