Узел: невозможно заменить Intl для использования IntlPolyfill

Я пытаюсь использовать Intl с языковым стандартом pt-BR и не могу заставить его работать с 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 не заменяется?

2 ответа

Решение

Оказывается, замена только 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 в случае, если вы также используете его.

Я получил эту информацию отсюда.

Поскольку Intl свойство глобального объекта недоступно для записи (тестирование на узле 0.12.2):

console.log(Object.getOwnPropertyDescriptor(global, 'Intl'));
/*
{ value: {},
  writable: false,
  enumerable: false,
  configurable: false }
*/

Переведите ваш код в строгий режим, и он будет выдавать более описательную ошибку при попытке назначить не доступным для записи свойствам вместо тихого сбоя.

Он также не настраивается, поэтому нет возможности полностью заменить (переназначить) global.Intl, И это хорошо: другие модули и зависимости могут зависеть от встроенного Intl реализация.

Вмешательство в глобальную сферу чаще всего приводит к большей головной боли, чем стоит, лучше держать ваши пакеты автономными. Вы можете просто потребовать полифилла в файлах, где вам это нужно:

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()));

Вы можете просто добавить var Intl = require('intl/Intl'); в файлах, где вам нужно Intl,

Другие вопросы по тегам