如何构建在非全局语言环境中工作的 'moment' 函数?
How can I build a 'moment' function that works in a non-global locale?
使用 MomentJS,如有必要,我可以使用 .locale
(或旧版本中的 .lang
)在特定时刻实例(而不是全局)设置语言环境。我如何创建一个等同于 moment
的函数(它的所有 42 个签名)始终在不同于全局的特定语言环境中工作?
我在 Web 项目中有一个子模块必须使用自定义语言环境。我们不希望在这个特定子模块之外使用此语言环境,但我们希望它在该子模块 内始终如一地使用。所以我基本上想要一个 moduleMoment
(或其他),我可以像 moment
一样调用它,但它在自定义语言环境中有效。有没有内置的方法可以做到这一点?
注意:我不是谈论更改现有实例的语言环境,我说的是使用 other 区域设置而不是其全局区域设置来调用 moment
函数(在其所有各种不同的签名中)。所以这行不通:
var m = moment(args).locale(localeId);
...因为 args 将在全局语言环境中处理,然后在事后更改实例上的语言环境,为时已晚。
我能找到的唯一方法是使用一个临时设置语言环境的函数,调用 moment
,然后将语言环境设置回之前的语言环境,如下所示:
function moduleMoment() {
var prevLocaleId, m;
prevLocaleId = moment.locale();
try {
moment.locale(customLocaleId);
m = moment.apply(this, arguments);
return m;
} finally {
moment.locale(prevLocaleId);
}
}
或者可以将其添加到 moment
,如下所示:
moment.localized = function(locale) {
var prevLocaleId, m, args;
prevLocaleId = moment.locale();
try {
moment.locale(locale);
m = moment.apply(this, Array.prototype.slice.call(arguments, 1));
return m;
} finally {
moment.locale(prevLocaleId);
}
};
很遗憾,Moment 似乎不支持此功能。 GitHub 问题跟踪器中有一个新功能请求:https://github.com/moment/moment/issues/2291
您可以编写一个函数,将其参数转发给 moment
构造函数,然后应用您想要的语言。
这是一个例子:
function localizedMoment() {
return moment.apply(null, arguments).locale("fr");
}
如果需要允许参数,只需使用Array.prototype.slice
:
function localizedMoment(locale) {
var args = Array.prototype.slice.call(locale, 1);
return moment.apply(null, args).locale(locale);
}
使用 MomentJS,如有必要,我可以使用 .locale
(或旧版本中的 .lang
)在特定时刻实例(而不是全局)设置语言环境。我如何创建一个等同于 moment
的函数(它的所有 42 个签名)始终在不同于全局的特定语言环境中工作?
我在 Web 项目中有一个子模块必须使用自定义语言环境。我们不希望在这个特定子模块之外使用此语言环境,但我们希望它在该子模块 内始终如一地使用。所以我基本上想要一个 moduleMoment
(或其他),我可以像 moment
一样调用它,但它在自定义语言环境中有效。有没有内置的方法可以做到这一点?
注意:我不是谈论更改现有实例的语言环境,我说的是使用 other 区域设置而不是其全局区域设置来调用 moment
函数(在其所有各种不同的签名中)。所以这行不通:
var m = moment(args).locale(localeId);
...因为 args 将在全局语言环境中处理,然后在事后更改实例上的语言环境,为时已晚。
我能找到的唯一方法是使用一个临时设置语言环境的函数,调用 moment
,然后将语言环境设置回之前的语言环境,如下所示:
function moduleMoment() {
var prevLocaleId, m;
prevLocaleId = moment.locale();
try {
moment.locale(customLocaleId);
m = moment.apply(this, arguments);
return m;
} finally {
moment.locale(prevLocaleId);
}
}
或者可以将其添加到 moment
,如下所示:
moment.localized = function(locale) {
var prevLocaleId, m, args;
prevLocaleId = moment.locale();
try {
moment.locale(locale);
m = moment.apply(this, Array.prototype.slice.call(arguments, 1));
return m;
} finally {
moment.locale(prevLocaleId);
}
};
很遗憾,Moment 似乎不支持此功能。 GitHub 问题跟踪器中有一个新功能请求:https://github.com/moment/moment/issues/2291
您可以编写一个函数,将其参数转发给 moment
构造函数,然后应用您想要的语言。
这是一个例子:
function localizedMoment() {
return moment.apply(null, arguments).locale("fr");
}
如果需要允许参数,只需使用Array.prototype.slice
:
function localizedMoment(locale) {
var args = Array.prototype.slice.call(locale, 1);
return moment.apply(null, args).locale(locale);
}