使用 NLS/本地化的 Dojo 自定义构建

Posted

技术标签:

【中文标题】使用 NLS/本地化的 Dojo 自定义构建【英文标题】:Dojo custom build with NLS / localisation 【发布时间】:2009-10-29 14:24:20 【问题描述】:

我在 Dojo 中实现跨域自定义构建时遇到问题。 情况如下:我有一个相当大的应用程序,有很多本地化包,所以目录结构基本上是这样的 核心\(我的模块) nls\ 来自\ zh\ .... 在构建我的模块时,结果是一个很大的 core.js/core.xd.js 文件,其中 bien sur 不包含本地化。在本地化 nls 目录 (en/fr/etc) 中,我在构建后找到构建/缩小的每个包,以及每种语言的更大文件 core_fr.js/core_en.fs,其中仅包含与 Dojo/Dijit 相关的字符串。

所以我的构建脚本是

            layers: [
            
    resourceName: "core",
            name: "../core/trusted.js",
            dependencies: [
                      "dojo.i18n",
                      //data
                      "dojox.data.JsonRestStore",
                      "dojox.data.XmlStore",
                      "dojox.rpc.Service",
                      "dojox.form.FileInput",
                       ...
                      "core.controller.Fusebox"                        
],
                  prefixes: [
                ["dijit","../dijit"],
            ["dojox","../dojox"],
                    ["core", "../core"]
                  ]

在 core.controller.Fusebox 类中我尝试加载 1 个 nls

dojo["requireLocalization"]("core", "FuseboxContent");

在这里它会死,但是随着

availableFlatLocales is undefined
[Break on this error] var locales = availableFlatLocales.split(",");\r\n

我在 html 文件中的配置是:

// version build
  var djConfig = 
    baseUrl: 'https://..../',
    modulePaths:  'core': 'core',
    useXDomain: true,
    xdWaitSeconds: 10,
    parseOnLoad: true,
    afterOnLoad: true,
//  debugAtAllCosts: true,
    isDebug: true,
    locale: "fr"
  ;

然后

<script type="text/javascript" src="http://xd.woopic.com/dojoroot/1.3.2-xd/dojo/dojo.xd.js.uncompressed.js"></script> 
<script type="text/javascript" src="https://..../core/trusted.js.uncompressed.js"></script>  

当然,我使用未压缩的进行调试。 问题是,在运行时,Dojo 尝试加载我的包但找不到它们,我想将它们嵌入到我的层文件中,因此不需要额外的加载。 这可以实现吗?当我们这样做时,是否有任何具有跨域本地化的工作站点/示例? 更新:我继续我的分析,问题似乎在于我正在动态加载 nls,因此构建解析器找不到 requireLocalization() 调用。因此项目 nls 文件仅包含与 dojo/dijit 相关的内容。但是,我在一个虚拟文件中添加了一些捆绑加载,构建器仍然忽略了 core/nls 的内容。

感谢您提供任何信息,我的搜索已经快要结束了,网上关于这个主题的内容并不多。

【问题讨论】:

我不是 xd 问题的专家,但我很想看到 modulePaths 中的 nls 条目。它们不应该是必需的。你在使用它们吗?如果你消除它们会有什么不同吗? 我删除了它们,没有变化,本地化仍然没有加载。我认为他们在那里是因为一些遗留原因......但你是对的,没用。我相应地更新了帖子。 【参考方案1】:

几天前我遇到了类似的问题。首先,您可以通过将可用的语言环境设置为 requireLocalization 调用的第四个参数来绕过该错误。

例如

dojo.requireLocalization("core", "FuseboxContent", null, "en,fr");

虽然你不应该这样做。

您是否尝试按如下方式包含本地化?

dojo.requireLocalization("core", "FuseboxContent"); // and not dojo["require..."]

【讨论】:

好吧,我这样做是因为我动态加载了 nls 文件,所以这样我就不会进入 builder 的方式。我确定了这个问题,因为构建器没有合并 [modulename]_fr.xd.js 文件中的包,他在其中合并了 dojo/dijit 本地化。因此,在 xd 阶段,当他在层末尾执行 preloadLocalisation 时,我的本地化没有加载。我创建了一个虚拟文件,它需要所有本地化来查看它是否会以这种方式“看到”它们并构建它们,但无济于事。

以上是关于使用 NLS/本地化的 Dojo 自定义构建的主要内容,如果未能解决你的问题,请参考以下文章

如何在 file:/// 协议 (Cordova/Phonegap) 下使用来自 dojo 的自定义构建

使用 conda 构建和安装本地或自定义 R 包

dojo教程:未定义dojo

如何从移动本地存储引导 Dojo

worklight 无法在真实设备上要求 DOJO Combobox - 无法加载... /dijit/form/nls/it/ComboBox.js

maven自定义jar到本地仓库