UNPKG

glize

Version:

Glize is a clean and robust pure JavaScript library.

161 lines (142 loc) 4.31 kB
/** * @fileoverview Localization utils. * * @see https://google.github.io/styleguide/javascriptguide.xml * @see https://developers.google.com/closure/compiler/docs/js-for-compiler * @module glize/locale */ /** * Gets the current value of the default locale. * @return {string} Returns the current value of the default locale. * @method */ export const getLocale = function() { const env = ('object' === typeof navigator && navigator) || ('object' === typeof process && process.env); const lang = env['userLanguage'] || env['language'] || env['LANG'] || env['LANGUAGE'] || 'en'; return lang.substr(0, 2).toLowerCase(); }; /** * Gets locale week names. * @return {!Array<string>} Returns week names. * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat * @method */ export const getWeekNames = () => { const locale = getLocale(); let names = days_[locale]; if (!names) { try { const formatter = new Intl.DateTimeFormat(locale, {weekday: "short"}); const date = new Date(2021, 0, 3); // Sun Jan 03 2021 names = new Array(7); for (let i = 0; i < 7; ++i) { date.setDate(3 + i); names[i] = formatter.format(date); } } catch (ex) { names = getData_('days'); } days_[locale] = names; } return names; }; /** * Gets locale month names. * @return {!Array.<string>} Returns month names. * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat * @method */ export const getMonthNames = () => { const locale = getLocale(); let names = months_[locale]; if (!names) { try { const formatter = new Intl.DateTimeFormat(locale, {month: "long"}); const year = new Date().getFullYear(); names = new Array(12); for (let i = 0; i < 12; ++i) { names[i] = formatter.format(new Date(year, i)); } } catch (ex) { names = getData_('months'); } months_[locale] = names; } return names; }; /** * Gets locale month name. * @param {?Date=} date Optional date object, defaults is current date. * @return {string} Returns month name. * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleString * @method */ export const getMonthName = (date = new Date()) => { try { return date.toLocaleString(getLocale(), {month: "long"}); } catch(ex) { return getMonthNames()[date.getMonth()]; } }; /** * Gets month number by month name. * @param {string} name The month name. * @return {number} Returns month number. * @method */ export const getMonthByName = (name) => { const monthes = getMonthNames(); for (let i = 0; i < monthes.length; ++i) { if (name.substr(0, 3).toLowerCase() === monthes[i].substr(0, 3).toLowerCase()) { return i; } } return -1; }; /** * Gets locale data by key. Used for backward compatibility. * @param {string} key Data key. * @return {!Array<string>} Returns locale data. * @method * @private */ const getData_ = (key) => (data_[getLocale()] || data_['en'])[key]; /** * Storage for cached month names for locale. * @type {!Object<string, !Array<string>>} * @private */ let months_ = {}; /** * Storage for cached weekday names for locale. * @type {!Object<string, !Array<string>>} * @private */ let days_ = {}; /** * @type {!Object<string, !Object>} * @private */ const data_ = { 'en': { 'days': ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], 'months': ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'] }, 'de': { 'days': ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa'], 'months': ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'] }, 'ru': { 'days': ['Вс', 'Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб'], 'months': ['Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'] } };