angular-l10n
Version:
An Angular library to translate messages, dates and numbers
270 lines • 8.61 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { IntlAPI } from '../services/intl-api';
import { NumberFormatStyle, ISO8601_DATE_REGEX, FORMAT_ALIASES, NUMBER_FORMAT_REGEXP } from './types';
import { Logger } from './logger';
var IntlFormatter = /** @class */ (function () {
function IntlFormatter() {
}
/**
* @param {?} value
* @param {?} defaultLocale
* @param {?} style
* @param {?=} digits
* @param {?=} currency
* @param {?=} currencyDisplay
* @return {?}
*/
IntlFormatter.formatNumber = /**
* @param {?} value
* @param {?} defaultLocale
* @param {?} style
* @param {?=} digits
* @param {?=} currency
* @param {?=} currencyDisplay
* @return {?}
*/
function (value, defaultLocale, style, digits, currency, currencyDisplay) {
if (!IntlAPI.hasNumberFormat())
return currency ? value + " " + currency : value;
value = typeof value === "string" && !isNaN(+value - parseFloat(value)) ? +value : value;
return IntlFormatter.numberFormatter(value, defaultLocale, style, digits, currency, currencyDisplay);
};
/**
* @param {?} value
* @param {?} defaultLocale
* @param {?} format
* @param {?=} timezone
* @return {?}
*/
IntlFormatter.formatDate = /**
* @param {?} value
* @param {?} defaultLocale
* @param {?} format
* @param {?=} timezone
* @return {?}
*/
function (value, defaultLocale, format, timezone) {
if (!IntlAPI.hasDateTimeFormat())
return value;
/** @type {?} */
var date;
if (typeof value === "string") {
value = value.trim();
}
if (IntlFormatter.isDate(value)) {
date = value;
}
else if (!isNaN(value - parseFloat(value))) {
date = new Date(parseFloat(value));
}
else if (typeof value === "string" && /^(\d{4}-\d{1,2}-\d{1,2})$/.test(value)) {
var _a = value.split('-').map(function (val) { return parseInt(val, 10); }), y = _a[0], m = _a[1], d = _a[2];
date = new Date(y, m - 1, d);
}
else {
date = new Date(value);
}
if (!IntlFormatter.isDate(date)) {
/** @type {?} */
var match = void 0;
if ((typeof value === "string") && (match = value.match(ISO8601_DATE_REGEX))) {
date = IntlFormatter.isoStringToDate(match);
}
}
return IntlFormatter.dateTimeFormatter(date, defaultLocale, format, timezone);
};
/**
* @param {?} value
* @param {?} unit
* @param {?} defaultLocale
* @param {?=} format
* @return {?}
*/
IntlFormatter.formatRelativeTime = /**
* @param {?} value
* @param {?} unit
* @param {?} defaultLocale
* @param {?=} format
* @return {?}
*/
function (value, unit, defaultLocale, format) {
if (!IntlAPI.hasRelativeTimeFormat())
return value + " " + unit;
value = typeof value === "string" && !isNaN(+value - parseFloat(value)) ? +value : value;
return IntlFormatter.relativeTimeFormatter(value, unit, defaultLocale, format);
};
/**
* @param {?} num
* @param {?} defaultLocale
* @param {?} style
* @param {?=} digits
* @param {?=} currency
* @param {?=} currencyDisplay
* @return {?}
*/
IntlFormatter.numberFormatter = /**
* @param {?} num
* @param {?} defaultLocale
* @param {?} style
* @param {?=} digits
* @param {?=} currency
* @param {?=} currencyDisplay
* @return {?}
*/
function (num, defaultLocale, style, digits, currency, currencyDisplay) {
/** @type {?} */
var options = {};
if (digits) {
if (typeof digits === "string") {
/** @type {?} */
var digitsOptions = formatDigitsAliases(digits);
if (digitsOptions != null) {
options = digitsOptions;
}
else {
Logger.log('IntlFormatter', 'invalidNumberFormatAlias');
}
}
else {
options = digits;
}
}
options.style = NumberFormatStyle[style].toLowerCase();
if (style == NumberFormatStyle.Currency) {
options.currency = currency;
options.currencyDisplay = currencyDisplay;
}
return new Intl.NumberFormat(defaultLocale, options).format(num);
};
/**
* @param {?} date
* @param {?} defaultLocale
* @param {?} format
* @param {?=} timezone
* @return {?}
*/
IntlFormatter.dateTimeFormatter = /**
* @param {?} date
* @param {?} defaultLocale
* @param {?} format
* @param {?=} timezone
* @return {?}
*/
function (date, defaultLocale, format, timezone) {
/** @type {?} */
var options = {};
if (format) {
if (typeof format === "string") {
/** @type {?} */
var dateTimeOptions = FORMAT_ALIASES[format];
if (dateTimeOptions) {
options = dateTimeOptions;
}
else {
Logger.log('IntlFormatter', 'invalidDateFormatAlias');
}
}
else {
options = format;
}
}
options.timeZone = IntlAPI.hasTimezone() ? timezone : 'UTC';
return new Intl.DateTimeFormat(defaultLocale, options).format(date).replace(/[\u200e\u200f]/g, "");
};
/**
* @param {?} value
* @param {?} unit
* @param {?} defaultLocale
* @param {?=} format
* @return {?}
*/
IntlFormatter.relativeTimeFormatter = /**
* @param {?} value
* @param {?} unit
* @param {?} defaultLocale
* @param {?=} format
* @return {?}
*/
function (value, unit, defaultLocale, format) {
/** @type {?} */
var options = {};
if (format) {
options = format;
}
return new Intl.RelativeTimeFormat(defaultLocale, options).format(value, unit);
};
/**
* @param {?} value
* @return {?}
*/
IntlFormatter.isDate = /**
* @param {?} value
* @return {?}
*/
function (value) {
return value instanceof Date && !isNaN(value.valueOf());
};
/**
* @param {?} match
* @return {?}
*/
IntlFormatter.isoStringToDate = /**
* @param {?} match
* @return {?}
*/
function (match) {
/** @type {?} */
var date = new Date(0);
/** @type {?} */
var tzHour = 0;
/** @type {?} */
var tzMin = 0;
/** @type {?} */
var dateSetter = match[8] ? date.setUTCFullYear : date.setFullYear;
/** @type {?} */
var timeSetter = match[8] ? date.setUTCHours : date.setHours;
if (match[9]) {
tzHour = +(match[9] + match[10]);
tzMin = +(match[9] + match[11]);
}
dateSetter.call(date, +(match[1]), +(match[2]) - 1, +(match[3]));
/** @type {?} */
var h = +(match[4] || '0') - tzHour;
/** @type {?} */
var m = +(match[5] || '0') - tzMin;
/** @type {?} */
var s = +(match[6] || '0');
/** @type {?} */
var ms = Math.round(parseFloat('0.' + (match[7] || 0)) * 1000);
timeSetter.call(date, h, m, s, ms);
return date;
};
return IntlFormatter;
}());
export { IntlFormatter };
/**
* @param {?} digits
* @return {?}
*/
export function formatDigitsAliases(digits) {
/** @type {?} */
var parts = digits.match(NUMBER_FORMAT_REGEXP);
if (parts == null)
return null;
/** @type {?} */
var digitsOptions = {};
if (parts[1] != null) {
digitsOptions.minimumIntegerDigits = parseInt(parts[1]);
}
if (parts[3] != null) {
digitsOptions.minimumFractionDigits = parseInt(parts[3]);
}
if (parts[5] != null) {
digitsOptions.maximumFractionDigits = parseInt(parts[5]);
}
return digitsOptions;
}
//# sourceMappingURL=intl-formatter.js.map