【问题标题】:Requiring a language file需要语言文件
【发布时间】:2014-05-17 08:50:27
【问题描述】:

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

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

我怎样才能同步需要一个模块,然后同步需要另一个模块?

【问题讨论】:

    标签: javascript internationalization requirejs js-amd


    【解决方案1】:

    每当您看到使用 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");
        // ...
    });
    

    模块foo 是在RequireJS 运行传递给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 本身在这里不起作用。

    您可以做的是让您的国际化模块返回承诺而不是字符串。或者可能有一个插件可以提供帮助,但我不知道。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-01
      • 2019-05-15
      • 2012-11-27
      • 2018-03-25
      • 2020-12-04
      • 1970-01-01
      • 1970-01-01
      • 2022-07-25
      相关资源
      最近更新 更多