Internationalization 我可以获得特定词典的完整i18n标签吗

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

我面临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标签呢


这个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值 这就是我所做的

  • 创建了一个自定义servlet,该servlet返回类似于
    ResourceBundleExportServlet
  • 使用basename和区域设置参数-ResourceBundle ResourceBundle=req.getResourceBundle(basename,
    页面区域设置)
  • 在驻留在/apps/project name/i18n文件夹中的特定于语言的i18n xml文件中添加了sling:basename=“basename_constant”。在我的 在这种情况下,我正在设置locale本身的值,例如:“zh_cn”
  • 4.在clientlibs javascript文件中设置Granite.I18n.setUrlPrefix(“/bin/custom/I18n/dict.”);从

    自定义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,我该怎么做?