我正在尝试使用pt-BR区域设置的Intl,我无法让它与Node 0.12一起工作。
代码:
global.Intl = require('intl/Intl');
require('intl/locale-data/jsonp/pt-BR.js');
var options = { year: 'numeric', month: 'long' };
var dateTimeFormat = new Intl.DateTimeFormat('pt-BR', options);
console.log(dateTimeFormat.format(new Date()));
这段代码输出:
May, 2015
我希望是:"Maio, 2015"。
然后,如果我决定创建一个新变量,一切正常:
工作代码:
global.NewIntl = require('intl/Intl');
require('intl/locale-data/jsonp/pt-BR.js');
var options = { year: 'numeric', month: 'long' };
var dateTimeFormat = new NewIntl.DateTimeFormat('pt-BR', options);
console.log(dateTimeFormat.format(new Date()));
打印出期望值。问题:为什么Intl全局变量没有被替换?
因为全局对象的Intl
属性是不可写的(在Node 0.12.2上测试):
console.log(Object.getOwnPropertyDescriptor(global, 'Intl'));
/*
{ value: {},
writable: false,
enumerable: false,
configurable: false }
*/
将代码置于严格模式,当尝试分配给不可写属性时,它会抛出更具描述性的错误,而不是无声地失败。
它也是不可配置的,所以没有办法完全替换(重新分配)global.Intl
。这是一件好事:其他模块和依赖项可能依赖于内置的Intl
实现。
篡改全局作用域通常会导致比它值得的更多的麻烦,最好保持你的包是独立的。你可以在你需要的文件中使用polyfill:
var Intl = require('intl/Intl');
// Note: you only need to require the locale once
require('intl/locale-data/jsonp/pt-BR.js');
var options = { year: 'numeric', month: 'long' };
var dateTimeFormat = new Intl.DateTimeFormat('pt-BR', options);
console.log(dateTimeFormat.format(new Date()));
你可以在需要Intl
的地方添加var Intl = require('intl/Intl');
。
事实证明,只替换DateTimeFormat和NumberFormat解决了这个问题:
require('intl/Intl');
require('intl/locale-data/jsonp/pt-BR.js');
Intl.NumberFormat = IntlPolyfill.NumberFormat;
Intl.DateTimeFormat = IntlPolyfill.DateTimeFormat;
var options = { year: 'numeric', month: 'long' };
var dateTimeFormat = new Intl.DateTimeFormat('pt-BR', options);
console.log(dateTimeFormat.format(new Date()));
请确保在加载react-intl
之前加载此脚本,以防您也在使用它。
我是从这里得到这个信息的