Internationalization 我可以获得特定词典的完整i18n标签吗
我面临i18n标签的问题 我的应用程序使用Granite.i18n.get(“”)函数在js前端读取一些i18n标签。按照“/etc/clientlibs/foundation/shared/source/init.js”中的说明,整个字典将作为“/libs/cq/i18n/dict.{+locale}.json”下载 现在,en字典只返回自定义标签,并且很小。 但是像fr这样的其他语言,字典文件是all/libs字典的集合,非常庞大。我在其他一些网站上也注意到了这一点 坦南公司 -118KB -1.4 MB 时代华纳有线电视网 -1.1KB -1.2MB Thermofisher -3KB -695 KB 我们的痛点是,在CDN上缓存这个重文件的成本会增加,并试图找到一种降低CDN成本的方法 我知道en标签本身就是关键。但是ExportServlet只能过滤出en的呈现自定义字典。我们的词典类似于/libs下的otb词典。那么,ExportServlet如何在en export下处理otb标签呢Internationalization 我可以获得特定词典的完整i18n标签吗,internationalization,aem,Internationalization,Aem,我面临i18n标签的问题 我的应用程序使用Granite.i18n.get(“”)函数在js前端读取一些i18n标签。按照“/etc/clientlibs/foundation/shared/source/init.js”中的说明,整个字典将作为“/libs/cq/i18n/dict.{+locale}.json”下载 现在,en字典只返回自定义标签,并且很小。 但是像fr这样的其他语言,字典文件是all/libs字典的集合,非常庞大。我在其他一些网站上也注意到了这一点 坦南公司 -118KB
这个bug是所有CMS产品中常见的还是Adobe特有的?还需要一个解决方案或变通办法,以获得仅适用于其他语言的自定义词典 英语词典很小,因为英语词条是关键,而不是翻译。法语(和其他语言)之所以大,是因为它们包含英语和进一步翻译的关键。此外,许多键仅在翻译语言中可用,因为该键用作默认翻译 因此,对于法语,如果使用
Granite.I18n.get('Hello world!')
,它将返回法语翻译,否则它将只返回'Hello world',如果语言上下文是英语,则不需要翻译
由于在客户端评估JS的性质,该产品被设计为下载完整的字典,包括产品本身的OOTB翻译,因为i18n实现没有上下文意识,无法过滤掉不需要的翻译
虽然方便,但不幸的是,这是使用Granite.I18n.get(“”)
的一个限制和副作用
可能的解决办法
- 通过使用服务器端I18n libs,在服务器上只呈现所需的翻译,并作为部分HTML,可以避免使用Granite.I18n.*。这可能不适用于SPA
- 如果您使用的是像Angular(x)这样的SPA框架,那么它们支持i18n工厂初始化,可以将i18n工厂初始化连接到下载经过过滤的i18n的自定义servlet响应中。这可能需要大量的工作,如果翻译了太多的术语,并且词典变得很大,那么词典的大小仍然是一个问题
- 压缩、最小化和缓存字典。您可以使用Apache模块或输出过滤器来完成。这将减少大小和流量负载,但同样不能保证随着翻译的增长,整个词典的大小会变小
通常,页面只能呈现所需内容。使用JS进行后期翻译将强制字典下载,Granite.i18n无法提供优化的下载体验 我最终编写了一个自定义实现,因为在这个问题上,我也没有从Adobe tickets获得太多帮助
- OTB字典json由ResourceBundleExportServlet呈现
- 我创建了一个定制的sling servlet,它将准备并返回类似于ResourceBundleExportServlet的json
- 修改了/etc/clientlibs/granite/utils/source/I18n.js以调用自定义servlet而不是otb servlet李>
- 自定义servlet编码为只返回特定的数据字典,而不是返回所有字典李>
这解决了我的问题。虽然我不认为这是正确的解决办法。需要有一种otb方式来呈现这个干净 我们面临着类似的要求,即使用Granite.I18n库在客户端获取I18n值 这就是我所做的
ResourceBundleExportServlet李>
页面区域设置)李>
自定义servlet URL。这不需要修改OOTB I18n.js这里有一个答案,可以在您尝试获取特定词典时帮助您: 查看提到吊索的部分:basename 这也适用于一个站点 例如:
[sling:Language] > mix:language
mixin
- sling:basename (string)
- sling:basename (string) multiple
http://localhost:4502/libs/cq/i18n/dict.es.[sling:basename值].json
OTB解决方案:)谢谢您的解释。我编辑了这个问题。我需要一个解决方案或解决办法来解决这个问题。我知道这是产品缺陷,但如何解决呢?我想现在的路径是
/libs/cq/i18n
我想在单独的路径上注册ResourceBundleExportServlet,我该怎么做?