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.ts 3.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. import moment from 'moment';
  2. import i18next from './i18next';
  3. // allows for moment durations to be formatted
  4. import 'moment-duration-format';
  5. // MomentJS uses static language bundle loading, so in order to support dynamic
  6. // language selection in the app we need to load all bundles that we support in
  7. // the app.
  8. require('moment/locale/af');
  9. require('moment/locale/ar');
  10. require('moment/locale/be');
  11. require('moment/locale/bg');
  12. require('moment/locale/ca');
  13. require('moment/locale/cs');
  14. require('moment/locale/da');
  15. require('moment/locale/de');
  16. require('moment/locale/el');
  17. require('moment/locale/en-gb');
  18. require('moment/locale/eo');
  19. require('moment/locale/es-us');
  20. require('moment/locale/es');
  21. require('moment/locale/et');
  22. require('moment/locale/eu');
  23. require('moment/locale/fa');
  24. require('moment/locale/fi');
  25. require('moment/locale/fr-ca');
  26. require('moment/locale/fr');
  27. require('moment/locale/gl');
  28. require('moment/locale/he');
  29. require('moment/locale/hr');
  30. require('moment/locale/hu');
  31. require('moment/locale/hy-am');
  32. require('moment/locale/id');
  33. require('moment/locale/is');
  34. require('moment/locale/it');
  35. require('moment/locale/ja');
  36. require('moment/locale/ko');
  37. require('moment/locale/lt');
  38. require('moment/locale/lv');
  39. require('moment/locale/ml');
  40. require('moment/locale/mn');
  41. require('moment/locale/mr');
  42. require('moment/locale/nb');
  43. require('moment/locale/nl');
  44. require('moment/locale/oc-lnc');
  45. require('moment/locale/pl');
  46. require('moment/locale/pt');
  47. require('moment/locale/pt-br');
  48. require('moment/locale/ro');
  49. require('moment/locale/ru');
  50. require('moment/locale/sk');
  51. require('moment/locale/sl');
  52. require('moment/locale/sr');
  53. require('moment/locale/sv');
  54. require('moment/locale/tr');
  55. require('moment/locale/uk');
  56. require('moment/locale/vi');
  57. require('moment/locale/zh-cn');
  58. require('moment/locale/zh-tw');
  59. /**
  60. * Returns a localized date formatter initialized with a specific {@code Date}
  61. * or timestamp ({@code number}).
  62. *
  63. * @private
  64. * @param {Date | number} dateOrTimeStamp - The date or unix timestamp (ms)
  65. * to format.
  66. * @returns {Object}
  67. */
  68. export function getLocalizedDateFormatter(dateOrTimeStamp: Date | number) {
  69. return moment(dateOrTimeStamp).locale(_getSupportedLocale());
  70. }
  71. /**
  72. * Returns a localized duration formatter initialized with a
  73. * specific duration ({@code number}).
  74. *
  75. * @private
  76. * @param {number} duration - The duration (ms)
  77. * to format.
  78. * @returns {Object}
  79. */
  80. export function getLocalizedDurationFormatter(duration: number) {
  81. // FIXME The flow-type definition of moment is v2.3 while our package.json
  82. // states v2.19 so maybe locale on moment's duration was introduced in
  83. // between?
  84. //
  85. // If the conference is under an hour long we want to display it without
  86. // showing the hour and we want to include the hour if the conference is
  87. // more than an hour long
  88. // @ts-ignore
  89. if (moment.duration(duration).format('h') !== '0') {
  90. // @ts-ignore
  91. return moment.duration(duration).format('h:mm:ss');
  92. }
  93. // @ts-ignore
  94. return moment.duration(duration).format('mm:ss', { trim: false });
  95. }
  96. /**
  97. * A lenient locale matcher to match language and dialect if possible.
  98. *
  99. * @private
  100. * @returns {string}
  101. */
  102. function _getSupportedLocale() {
  103. const i18nLocale = i18next.language;
  104. let supportedLocale;
  105. if (i18nLocale) {
  106. const localeRegexp = new RegExp('^([a-z]{2,2})(-)*([a-z]{2,2})*$');
  107. const localeResult = localeRegexp.exec(i18nLocale.toLowerCase());
  108. if (localeResult) {
  109. const currentLocaleRegexp
  110. = new RegExp(
  111. `^${localeResult[1]}(-)*${`(${localeResult[3]})*` || ''}`);
  112. supportedLocale
  113. // FIXME The flow-type definition of moment is v2.3 while our
  114. // package.json states v2.19 so maybe locales on moment was
  115. // introduced in between?
  116. = moment.locales().find(lang => currentLocaleRegexp.exec(lang));
  117. }
  118. }
  119. return supportedLocale || 'en';
  120. }