You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

dateUtil.js 2.2KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. // @flow
  2. import moment from 'moment';
  3. import i18next from './i18next';
  4. // MomentJS uses static language bundle loading, so in order to support dynamic
  5. // language selection in the app we need to load all bundles that we support in
  6. // the app.
  7. require('moment/locale/bg');
  8. require('moment/locale/de');
  9. require('moment/locale/eo');
  10. require('moment/locale/es');
  11. require('moment/locale/fr');
  12. require('moment/locale/hy-am');
  13. require('moment/locale/it');
  14. require('moment/locale/nb');
  15. // OC is not available. Please submit OC translation to the MomentJS project.
  16. require('moment/locale/pl');
  17. require('moment/locale/pt');
  18. require('moment/locale/pt-br');
  19. require('moment/locale/ru');
  20. require('moment/locale/sk');
  21. require('moment/locale/sl');
  22. require('moment/locale/sv');
  23. require('moment/locale/tr');
  24. require('moment/locale/zh-cn');
  25. /**
  26. * Returns a localized date formatter initialized with a specific {@code Date}
  27. * or timestamp ({@code number}).
  28. *
  29. * @private
  30. * @param {Date | number} dateOrTimeStamp - The date or unix timestamp (ms)
  31. * to format.
  32. * @returns {Object}
  33. */
  34. export function getLocalizedDateFormatter(dateOrTimeStamp: Date | number) {
  35. return moment(dateOrTimeStamp).locale(_getSupportedLocale());
  36. }
  37. /**
  38. * Returns a localized duration formatter initialized with a
  39. * specific duration ({@code number}).
  40. *
  41. * @private
  42. * @param {number} duration - The duration (ms)
  43. * to format.
  44. * @returns {Object}
  45. */
  46. export function getLocalizedDurationFormatter(duration: number) {
  47. return moment.duration(duration).locale(_getSupportedLocale());
  48. }
  49. /**
  50. * A lenient locale matcher to match language and dialect if possible.
  51. *
  52. * @private
  53. * @returns {string}
  54. */
  55. function _getSupportedLocale() {
  56. const i18nLocale = i18next.language;
  57. let supportedLocale;
  58. if (i18nLocale) {
  59. const localeRegexp = new RegExp('^([a-z]{2,2})(-)*([a-z]{2,2})*$');
  60. const localeResult = localeRegexp.exec(i18nLocale.toLowerCase());
  61. if (localeResult) {
  62. const currentLocaleRegexp
  63. = new RegExp(
  64. `^${localeResult[1]}(-)*${`(${localeResult[3]})*` || ''}`);
  65. supportedLocale
  66. = moment.locales().find(lang => currentLocaleRegexp.exec(lang));
  67. }
  68. }
  69. return supportedLocale || 'en';
  70. }