我可以得到特定词典的整个 i18n 标签吗
Can I get entire i18n labels of specific dictionary
我遇到了国际化标签的问题。
我的应用程序使用 Granite.I18n.get('') 函数在 js 前端读取几个 i18n 标签。整个词典下载为“/libs/cq/i18n/dict.{+locale}.json”,如“/etc/clientlibs/foundation/shared/source/init.js”中所述。
现在的 en 字典 returns 只有自定义标签并且尺寸很小。
但其他语言如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
Thermofisher
en dictionary - 3 KB
fr dictionary - 695 KB
我们的痛点是,在 CDN 上缓存这个大文件的成本增加,并试图找到降低 CDN 成本的方法。
我了解 en 标签本身就是密钥。但是 ExportServlet 只能为 en 过滤掉渲染自定义字典。我们的词典类似于 /libs 下的 otb 词典。那么 ExportServlet 是如何处理 en export 下的 otb 标签的呢?
此错误在所有 CMS 产品中都很常见还是特定于 Adobe?还需要一个解决方案或解决方法来获取仅适用于其他语言的自定义词典。
英语词典很小,因为英语词条是关键字而不是翻译。法语(和其他语言)很大,因为它们包含英语和进一步翻译的关键。另外,很多键只在翻译语言中可用,只是因为键被用作默认翻译。
所以对于法语,如果您使用 Granite.I18n.get('Hello world!')
,它会 return 如果它找到法语翻译,否则它会简单地 return 'Hello World',这不会'如果语言环境是英语,则不需要翻译。
由于在客户端评估 JS 的性质,该产品旨在下载完整的词典,包括产品本身的 OOTB 翻译,因为 i18n 实现不是上下文感知的,也无法过滤掉不需要的翻译。
虽然方便,但不幸的是,这是使用 Granite.I18n.get('')
的限制和副作用。
可能的解决方法
- Granite.I18n.* 可以通过使用服务器端 i18n 库并仅在服务器上呈现所需的翻译并作为部分 HTML 来避免。此 可能不适用于 SPA。
- 如果您使用像 Angular(x) 这样的 SPA 框架,那么它们支持 i18n 工厂初始化,可以挂接到自定义 servlet 响应,下载过滤的 i18n。这可能需要大量工作,而且如果翻译的术语太多并且字典变大,那么大小仍然是个问题。
- 压缩、最小化和缓存字典。您可以使用 Apache 模块或输出过滤器来完成。这将减少大小和流量负载,但同样不能保证随着翻译的增长整个词典的大小会变小。
一般来说,页面必须只呈现需要的内容。使用 JS 做后期翻译会强制下载字典,Granite.i18n 不适合优化下载体验。
我最终编写了一个自定义实现,因为我在这个问题上也没有从 Adobe 票证中得到太多帮助。
- OTB 字典json 由 ResourceBundleExportServlet
呈现
- 我创建了一个自定义的 sling servlet,它将准备 return json 类似于 ResourceBundleExportServlet
- 已修改 /etc/clientlibs/granite/utils/source/I18n.js 以调用自定义 servlet 而不是 otb servlet。
- 自定义 servlet 仅编码到 return 特定数据字典,而不是所有字典。
这解决了我的问题。虽然我不相信这是正确的解决方案。需要一种 otb 方法来呈现这种清洁。
我们遇到了类似的要求,需要在客户端使用 Granite.i18n 库获取 I18n 值
这就是我所做的。
- 创建了一个自定义 servlet,其returnsJSON响应类似于
ResourceBundleExportServlet。
- 使用基本名称和语言环境参数加载包 - ResourceBundle resourceBundle = req.getResourceBundle(basename,
pageLocale);
- 在 /apps/project-name/i18n 文件夹中的特定语言 i18n xml 文件中添加了 sling:basename="basename_constant"'。在我的
例如,我正在设置语言环境本身的值,例如:"zh_cn".
4.In clientlibs javascript 文件设置 Granite.I18n.setUrlPrefix("/bin/custom/i18n/dict.");从
获取
自定义 servlet URL。这不需要修改 OOTB I18n.js
这里有一个答案,可以在您尝试获取特定词典时为您提供帮助:
看看提到 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解决方案:)
我遇到了国际化标签的问题。
我的应用程序使用 Granite.I18n.get('') 函数在 js 前端读取几个 i18n 标签。整个词典下载为“/libs/cq/i18n/dict.{+locale}.json”,如“/etc/clientlibs/foundation/shared/source/init.js”中所述。
现在的 en 字典 returns 只有自定义标签并且尺寸很小。 但其他语言如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
Thermofisher
en dictionary - 3 KB
fr dictionary - 695 KB
我们的痛点是,在 CDN 上缓存这个大文件的成本增加,并试图找到降低 CDN 成本的方法。
我了解 en 标签本身就是密钥。但是 ExportServlet 只能为 en 过滤掉渲染自定义字典。我们的词典类似于 /libs 下的 otb 词典。那么 ExportServlet 是如何处理 en export 下的 otb 标签的呢?
此错误在所有 CMS 产品中都很常见还是特定于 Adobe?还需要一个解决方案或解决方法来获取仅适用于其他语言的自定义词典。
英语词典很小,因为英语词条是关键字而不是翻译。法语(和其他语言)很大,因为它们包含英语和进一步翻译的关键。另外,很多键只在翻译语言中可用,只是因为键被用作默认翻译。
所以对于法语,如果您使用 Granite.I18n.get('Hello world!')
,它会 return 如果它找到法语翻译,否则它会简单地 return 'Hello World',这不会'如果语言环境是英语,则不需要翻译。
由于在客户端评估 JS 的性质,该产品旨在下载完整的词典,包括产品本身的 OOTB 翻译,因为 i18n 实现不是上下文感知的,也无法过滤掉不需要的翻译。
虽然方便,但不幸的是,这是使用 Granite.I18n.get('')
的限制和副作用。
可能的解决方法
- Granite.I18n.* 可以通过使用服务器端 i18n 库并仅在服务器上呈现所需的翻译并作为部分 HTML 来避免。此 可能不适用于 SPA。
- 如果您使用像 Angular(x) 这样的 SPA 框架,那么它们支持 i18n 工厂初始化,可以挂接到自定义 servlet 响应,下载过滤的 i18n。这可能需要大量工作,而且如果翻译的术语太多并且字典变大,那么大小仍然是个问题。
- 压缩、最小化和缓存字典。您可以使用 Apache 模块或输出过滤器来完成。这将减少大小和流量负载,但同样不能保证随着翻译的增长整个词典的大小会变小。
一般来说,页面必须只呈现需要的内容。使用 JS 做后期翻译会强制下载字典,Granite.i18n 不适合优化下载体验。
我最终编写了一个自定义实现,因为我在这个问题上也没有从 Adobe 票证中得到太多帮助。
- OTB 字典json 由 ResourceBundleExportServlet 呈现
- 我创建了一个自定义的 sling servlet,它将准备 return json 类似于 ResourceBundleExportServlet
- 已修改 /etc/clientlibs/granite/utils/source/I18n.js 以调用自定义 servlet 而不是 otb servlet。
- 自定义 servlet 仅编码到 return 特定数据字典,而不是所有字典。
这解决了我的问题。虽然我不相信这是正确的解决方案。需要一种 otb 方法来呈现这种清洁。
我们遇到了类似的要求,需要在客户端使用 Granite.i18n 库获取 I18n 值 这就是我所做的。
- 创建了一个自定义 servlet,其returnsJSON响应类似于
ResourceBundleExportServlet。 - 使用基本名称和语言环境参数加载包 - ResourceBundle resourceBundle = req.getResourceBundle(basename,
pageLocale); - 在 /apps/project-name/i18n 文件夹中的特定语言 i18n xml 文件中添加了 sling:basename="basename_constant"'。在我的 例如,我正在设置语言环境本身的值,例如:"zh_cn".
4.In clientlibs javascript 文件设置 Granite.I18n.setUrlPrefix("/bin/custom/i18n/dict.");从
获取
自定义 servlet URL。这不需要修改 OOTB I18n.js
这里有一个答案,可以在您尝试获取特定词典时为您提供帮助:
看看提到 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解决方案:)