需要语言文件

时间:2014-05-17 08:50:28

标签: javascript internationalization requirejs js-amd

我正在编写AMD国际化模块。它导出一个函数,它接收一个字符串进行翻译并以类似于gettext的方式返回翻译。

我需要从所述模块中加载相应的翻译文件,但必须同步完成,并且与设置模块中的定义相关。

如何同步需要模块然后同步需要另一个模块?

1 个答案:

答案 0 :(得分:0)

每当您看到使用RequireJS并且出现的代码同步运行时,那只是外观。例如,您可能会看到:

define(function (require, exports, module) {
    var foo = require("foo");
    // ...
});

并认为require("foo")只是一个同步调用。从某种意义上说, 是同步的,因为它会立即返回一个值。但是,您没有看到的是模块定义的处理方式如下:

define(["require", "exports", "module", "foo"], function (require, exports, module) {
    var foo = require("foo");
    // ...
});

在RequireJS运行传递给foo的回调之前,模块define是异步加载的,因此require("foo")并非真正异步。它看起来就是这样。

这些伪同步调用如何工作的一个结果是,您通常无法调用require(x),其中x是在运行时计算的字符串。 (请注意,您可以调用require(x),其中x是在运行时计算的数组,并且可以跟随可选的回调。这是“常规”异步require。这里没问题。)我说“一般”,因为有些情况下它可以工作。例如,如果x有一组已知且可能较小的值,那么可以定义您的模块:

define(["a", "b", "c"], function () {
    var x = something(); // Where something() can be only return "a", "b", or "c".
    var module_x = require(x); 
    // ...
});

这样可行,因为我列出了我可能想要在define调用的依赖项中使用的所有可能模块,并且因为something()只能返回已经加载的模块的名称。如果预先知道集合或者要求所有可能的模块都会破坏模块化的目的,那么你就无法做到这一点。我希望在国际化模块的情况下,你不想加载所有语言,所以你不能这样做。

RequireJS本身不会在这里工作。

你可以做的是让你的国际化模块返回promises而不是字符串。或者可能有一个插件可以帮助但我不知道它。