@brightspace-ui/intl 3.13.2 → 3.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/common.js CHANGED
@@ -1,5 +1,6 @@
1
1
  export const defaultLocale = 'en';
2
- export const supportedBaseLocales = ['ar', 'cy', 'da', 'de', 'en', 'es', 'fr', 'hi', 'ja', 'ko', 'nl', 'pt', 'sv', 'tr', 'zh'];
2
+ export const supportedBaseLocales = ['ar', 'cy', 'da', 'de', 'en', 'es', 'fr', 'hi', 'ja', 'ko', 'mi', 'nl', 'pt', 'sv', 'tr', 'zh'];
3
+ export const supportedLangpacks = ['ar', 'cy', 'da', 'de', 'en', 'en-gb', 'es', 'es-es', 'fr', 'fr-fr', 'fr-on', 'hi', 'ja', 'ko', 'mi', 'nl', 'pt', 'sv', 'tr', 'zh-cn', 'zh-tw'];
3
4
  export const supportedLocalesDetails = [
4
5
  { code: 'ar-sa', name: 'العربية' },
5
6
  { code: 'cy-gb', name: 'Cymraeg (Y Deyrnas Unedig)' },
@@ -16,6 +17,7 @@ export const supportedLocalesDetails = [
16
17
  { code: 'hi-in', name: 'हिन्दी Hindi (India)' },
17
18
  { code: 'ja-jp', name: '日本語 (日本)' },
18
19
  { code: 'ko-kr', name: '한국어 (대한민국)' },
20
+ { code: 'mi-nz', name: 'Māori (Aotearoa)' },
19
21
  { code: 'nl-nl', name: 'Nederlands (Nederland)' },
20
22
  { code: 'pt-br', name: 'Português (Brasil)' },
21
23
  { code: 'sv-se', name: 'Svenska (Sverige)' },
@@ -88,6 +90,7 @@ export function validateFormatValue(value) {
88
90
  class DocumentLocaleSettings {
89
91
 
90
92
  constructor() {
93
+ this._cache = new Map();
91
94
  this._htmlElem = window.document.getElementsByTagName('html')[0];
92
95
  this._listeners = [];
93
96
  this._overrides = {};
@@ -101,6 +104,7 @@ class DocumentLocaleSettings {
101
104
  set fallbackLanguage(val) {
102
105
  const normalized = this._normalize(val);
103
106
  if (normalized === this._fallbackLanguage) return;
107
+ this._cache.clear();
104
108
  this._fallbackLanguage = normalized;
105
109
  this._listeners.forEach((cb) => cb());
106
110
  }
@@ -109,6 +113,7 @@ class DocumentLocaleSettings {
109
113
  set language(val) {
110
114
  const normalized = this._normalize(val);
111
115
  if (normalized === this._language) return;
116
+ this._cache.clear();
112
117
  this._language = normalized;
113
118
  this._listeners.forEach((cb) => cb());
114
119
  }
@@ -123,6 +128,7 @@ class DocumentLocaleSettings {
123
128
  delete val.date.formats.timeFormats;
124
129
  }
125
130
  }
131
+ this._cache.clear();
126
132
  this._overrides = val;
127
133
  this._listeners.forEach((cb) => cb());
128
134
  }
@@ -131,6 +137,13 @@ class DocumentLocaleSettings {
131
137
  this._listeners.push(cb);
132
138
  }
133
139
 
140
+ getCacheItem(key, provider) {
141
+ if (!this._cache.has(key)) {
142
+ this._cache.set(key, provider());
143
+ }
144
+ return this._cache.get(key);
145
+ }
146
+
134
147
  removeChangeListener(cb) {
135
148
  const index = this._listeners.indexOf(cb);
136
149
  if (index < 0) return;
@@ -138,6 +151,7 @@ class DocumentLocaleSettings {
138
151
  }
139
152
 
140
153
  reset() {
154
+ this._cache.clear();
141
155
  this._language = this._languageInitial;
142
156
  this._fallbackLanguage = null;
143
157
  this.overrides = {};
package/lib/dateTime.js CHANGED
@@ -1,7 +1,8 @@
1
1
  import { getDocumentLocaleSettings, getLanguage, merge } from './common.js';
2
2
 
3
+ // to-do: These should be based on region, not language
3
4
  const hour24locales = ['cy', 'da', 'de', 'es', 'fr', 'nl', 'pt', 'sv', 'tr', 'zh'];
4
- const mondayFirstDayLocales = ['cy', 'da', 'de', 'fr', 'hi', 'nl', 'sv', 'tr'];
5
+ const mondayFirstDayLocales = ['cy', 'da', 'de', 'fr', 'hi', 'mi', 'nl', 'sv', 'tr'];
5
6
 
6
7
  // timezone abbreviations and offsets from https://www.timeanddate.com/time/zones/
7
8
  const timezoneOffsetMap = {
@@ -691,266 +692,279 @@ export function convertUTCToLocalDateTime(date) {
691
692
  }
692
693
 
693
694
  export function getDateTimeDescriptor() {
694
-
695
- const language = getLanguage();
696
695
  const settings = getDocumentLocaleSettings();
696
+ return settings.getCacheItem('dateTimeDescriptor', () => {
697
697
 
698
- const subtags = language.split('-');
699
- const baseLanguage = subtags[0];
698
+ const language = getLanguage();
699
+ const subtags = language.split('-');
700
+ const baseLanguage = subtags[0];
700
701
 
701
- let hour24 = (hour24locales.indexOf(baseLanguage) > -1);
702
- if (language === 'zh-tw') {
703
- hour24 = false;
704
- }
705
- if (settings.overrides.date && settings.overrides.date.hour24 !== undefined) {
706
- hour24 = settings.overrides.date.hour24;
707
- }
702
+ let hour24 = (hour24locales.indexOf(baseLanguage) > -1);
703
+ if (language === 'zh-tw') {
704
+ hour24 = false;
705
+ }
706
+ if (settings.overrides.date && settings.overrides.date.hour24 !== undefined) {
707
+ hour24 = settings.overrides.date.hour24;
708
+ }
708
709
 
709
- const timeFormat = getTimeFormat(hour24, language, baseLanguage);
710
-
711
- let dateFormats = ['dddd, MMMM d, yyyy', 'MMM d, yyyy', 'M/d/yyyy', 'MMMM yyyy', 'MMMM d', 'MMM d'];
712
- const fullTimeFormat = (baseLanguage === 'zh' && language !== 'zh-tw') ? `ZZZ ${timeFormat}` : `${timeFormat} ZZZ`;
713
- let dayPeriods = ['AM', 'PM'];
714
- let months = [
715
- ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
716
- ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
717
- ];
718
- let days = [
719
- ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
720
- ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
721
- ['S', 'M', 'T', 'W', 'T', 'F', 'S']
722
- ];
723
- let firstDayOfWeek = (mondayFirstDayLocales.indexOf(baseLanguage) > -1) ? 1 : 0;
724
- let weekendStartDay = 6;
725
- let weekendEndDay = 0;
726
-
727
- switch (baseLanguage) {
728
- case 'ar':
729
- dateFormats = ['dddd, d MMMM, yyyy', 'dd MMMM, yyyy', 'dd/MM/yyyy', 'MMMM, yyyy', 'd MMMM', 'd MMM'];
730
- dayPeriods = ['ص', 'م'];
731
- months[0] = months[1] = ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'];
732
- days = [
733
- ['الأحد', 'الإثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
734
- ['أحد', 'إثنين', 'ثلاثاء', 'أربعاء', 'خميس', 'جمعة', 'سبت'],
735
- ['أ', 'إ', 'ث', 'أر', 'خ', 'ج', 'س']
736
- ];
737
- firstDayOfWeek = 6;
738
- weekendStartDay = 4;
739
- weekendEndDay = 5;
740
- break;
741
- case 'cy':
742
- dateFormats = ['dddd, d MMMM yyyy', 'dd MMMM yyyy', 'dd/MM/yyyy', 'MMMM yyyy', 'd MMMM', 'd MMM'];
743
- months = [
744
- ['Ionawr', 'Chwefror', 'Mawrth', 'Ebrill', 'Mai', 'Mehefin', 'Gorffennaf', 'Awst', 'Medi', 'Hydref', 'Tachwedd', 'Rhagfyr'],
745
- ['Ion', 'Chwe', 'Maw', 'Ebr', 'Mai', 'Meh', 'Gor', 'Awst', 'Medi', 'Hyd', 'Tach', 'Rhag']
746
- ];
747
- days = [
748
- ['Dydd Sul', 'Dydd Llun', 'Dydd Mawrth', 'Dydd Mercher', 'Dydd Iau', 'Dydd Gwener', 'Dydd Sadwrn'],
749
- ['Sul', 'Llun', 'Maw', 'Mer', 'Iau', 'Gwe', 'Sad'],
750
- ['Su', 'Ll', 'Ma', 'Me', 'Ia', 'Gw', 'Sa']
751
- ];
752
- break;
753
- case 'da':
754
- dateFormats = ['dddd \'den\' d. MMMM yyyy', 'd. MMM. yyyy', 'dd.MM.yyyy', 'MMMM yyyy', 'd. MMMM', 'd. MMM'];
755
- months = [
756
- ['januar', 'februar', 'marts', 'april', 'maj', 'juni', 'juli', 'august', 'september', 'oktober', 'november', 'december'],
757
- ['jan.', 'feb.', 'mar.', 'apr.', 'maj', 'jun.', 'jul.', 'aug.', 'sep.', 'okt.', 'nov.', 'dec.']
758
- ];
759
- days = [
760
- ['søndag', 'mandag', 'tirsdag', 'onsdag', 'torsdag', 'fredag', 'lørdag'],
761
- ['søn.', 'man.', 'tir.', 'ons.', 'tor.', 'fre.', 'lør.'],
762
- ['S', 'M', 'T', 'O', 'T', 'F', 'L']
763
- ];
764
- break;
765
- case 'de':
766
- dateFormats = ['dddd d. MMMM yyyy', 'd. MMMM yyyy', 'dd.MM.yyyy', 'MMMM yyyy', 'd. MMMM', 'd. MMM'];
767
- months = [
768
- ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'],
769
- ['Jan.', 'Feb.', 'März', 'Apr.', 'Mai', 'Juni', 'Juli', 'Aug.', 'Sept.', 'Okt.', 'Nov.', 'Dez.']
770
- ];
771
- days = [
772
- ['Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag'],
773
- ['So.', 'Mo.', 'Di.', 'Mi.', 'Do.', 'Fr.', 'Sa.'],
774
- ['S', 'M', 'D', 'M', 'D', 'F', 'S']
775
- ];
776
- break;
777
- case 'es':
778
- dateFormats = ['dddd d\' de \'MMMM\' de \'yyyy', 'd\' de \'MMMM\' de \'yyyy', 'dd/MM/yyyy', 'MMMM yyyy', 'd\' de \'MMMM', 'd\' de \'MMM'];
779
- dayPeriods = ['a. m.', 'p. m.'];
780
- months = [
781
- ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'],
782
- ['ene.', 'feb.', 'mar.', 'abr.', 'may.', 'jun.', 'jul.', 'ago.', 'sep.', 'oct.', 'nov.', 'dic.']
783
- ];
784
- days = [
785
- ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],
786
- ['dom.', 'lun.', 'mar.', 'mié.', 'jue.', 'vie.', 'sáb.'],
787
- ['D', 'L', 'M', 'M', 'J', 'V', 'S']
788
- ];
789
- break;
790
- case 'fr':
791
- dateFormats = ['dddd d MMMM yyyy', 'd MMM yyyy', 'dd/MM/yyyy', 'MMMM yyyy', 'd MMMM', 'd MMM'];
792
- months = [
793
- ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],
794
- ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.']
795
- ];
796
- days = [
797
- ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],
798
- ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],
799
- ['D', 'L', 'M', 'M', 'J', 'V', 'S']
800
- ];
801
- break;
802
- case 'hi':
803
- dateFormats = ['dddd, d MMMM yyyy', 'd MMMM yyyy', 'dd-MM-yyyy', 'MMMM yyyy', 'd MMMM', 'd MMM'];
804
- dayPeriods = ['पूर्वाह्न', 'अपराह्न'];
805
- months = [
806
- ['जनवरी', 'फरवरी', 'मार्च', 'अप्रैल', 'मई', 'जून', 'जुलाई', 'अगस्त', 'सितंबर', 'अक्टूबर', 'नवंबर', 'दिसंबर'],
807
- ['जन', 'फर', 'मार्च', 'अप्रैल', 'मई', 'जून', 'जुलाई', 'अग', 'सितं', 'अक्टू', 'नवं', 'दिसं']
808
- ];
809
- days = [
810
- ['रविवार', 'सोमवार', 'मंगलवार', 'बुधवार', 'गुरूवार', 'शुक्रवार', 'शनिवार'],
811
- ['रवि', 'सोम', 'मंगल', 'बुध', 'गुरु', 'शुक्र', 'शनि'],
812
- ['र', 'सो', 'मं', 'बु', 'गु', 'शु', 'श']
813
- ];
814
- break;
815
- case 'ja':
816
- dateFormats = ['yyyy年M月d日', 'yyyy年M月d日', 'yyyy/MM/dd', 'yyyy年M月', 'M月d日', 'M月d日'];
817
- dayPeriods = ['午前', '午後'];
818
- months[0] = months[1] = ['1 月', '2 月', '3 月', '4 月', '5 月', '6 月', '7 月', '8 月', '9 月', '10 月', '11 月', '12 月'];
819
- days[0] = days[1] = days[2] = ['日', '月', '火', '水', '木', '金', '土'];
820
- break;
821
- case 'ko':
822
- dateFormats = ['yyyy년 M월 d일 dddd', 'yyyy년 M월 d일', 'yyyy-MM-dd', 'yyyy년 M월', 'M월 d일', 'MMM d일'];
823
- dayPeriods = ['오전', '오후'];
824
- months[0] = months[1] = ['1월', '2월', '3월', '4월', '5월', '6월', '7월', '8월', '9월', '10월', '11월', '12월'];
825
- days[0] = ['일요일', '월요일', '화요일', '수요일', '목요일', '금요일', '토요일'];
826
- days[1] = days[2] = ['일', '월', '화', '수', '목', '금', '토'];
827
- break;
828
- case 'nl':
829
- dateFormats = ['dddd d MMMM yyyy', 'd MMMM yyyy', 'dd-MM-yyyy', 'MMMM yyyy', 'd MMMM', 'd MMM'];
830
- dayPeriods = ['a.m.', 'p.m.'];
831
- months = [
832
- ['januari', 'februari', 'maart', 'april', 'mei', 'juni', 'juli', 'augustus', 'september', 'oktober', 'november', 'december'],
833
- ['jan.', 'feb.', 'mrt.', 'apr.', 'mei', 'jun.', 'jul.', 'aug.', 'sep.', 'okt.', 'nov.', 'dec.']
834
- ];
835
- days = [
836
- ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'],
837
- ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'],
838
- ['Z', 'M', 'D', 'W', 'D', 'V', 'Z']
839
- ];
840
- break;
841
- case 'pt':
842
- dateFormats = ['dddd, d\' de \'MMMM\' de \'yyyy', 'd\' de \'MMMM\' de \'yyyy', 'dd/MM/yyyy', 'MMMM\' de \'yyyy', 'dd\' de \'MMMM', 'dd\' de \'MMM'];
843
- months = [
844
- ['janeiro', 'fevereiro', 'março', 'abril', 'maio', 'junho', 'julho', 'agosto', 'setembro', 'outubro', 'novembro', 'dezembro'],
845
- ['jan', 'fev', 'mar', 'abr', 'mai', 'jun', 'jul', 'ago', 'set', 'out', 'nov', 'dez']
846
- ];
847
- days = [
848
- ['domingo', 'segunda-feira', 'terça-feira', 'quarta-feira', 'quinta-feira', 'sexta-feira', 'sábado'],
849
- ['dom', 'seg', 'ter', 'qua', 'qui', 'sex', 'sáb'],
850
- ['D', 'S', 'T', 'Q', 'Q', 'S', 'S']
851
- ];
852
- break;
853
- case 'sv':
854
- dateFormats = ['dddd \'den\' d MMMM yyyy', 'd MMMM yyyy', 'yyyy-MM-dd', 'MMMM yyyy', 'dd MMMM', 'dd MMM'];
855
- dayPeriods = ['fm', 'em'];
856
- months = [
857
- ['januari', 'februari', 'mars', 'april', 'maj', 'juni', 'juli', 'augusti', 'september', 'oktober', 'november', 'december'],
858
- ['jan.', 'feb.', 'mars', 'apr.', 'maj', 'juni', 'juli', 'aug.', 'sep.', 'okt.', 'nov.', 'dec.']
859
- ];
860
- days = [
861
- ['Söndag', 'Måndag', 'Tisdag', 'Onsdag', 'Torsdag', 'Fredag', 'Lördag'],
862
- ['Sön', 'Mån', 'Tis', 'Ons', 'Tor', 'Fre', 'Lör'],
863
- ['S', 'M', 'T', 'O', 'T', 'F', 'L']
864
- ];
865
- break;
866
- case 'tr':
867
- dateFormats = ['dd MMMM yyyy dddd', 'dd MMMM yyyy', 'dd.MM.yyyy', 'MMMM yyyy', 'dd MMMM', 'dd MMM'];
868
- dayPeriods = ['ÖÖ', 'ÖS'];
869
- months = [
870
- ['Ocak', 'Şubat', 'Mart', 'Nisan', 'Mayıs', 'Haziran', 'Temmuz', 'Ağustos', 'Eylül', 'Ekim', 'Kasım', 'Aralık'],
871
- ['Oca', 'Şub', 'Mar', 'Nis', 'May', 'Haz', 'Tem', 'Ağu', 'Eyl', 'Ek', 'Kas', 'Ara']
872
- ];
873
- days = [
874
- ['Pazar', 'Pazartesi', 'Salı', 'Çarşamba', 'Perşembe', 'Cuma', 'Cumartesi'],
875
- ['Paz', 'Pzt', 'Sal', 'Çar', 'Per', 'Cum', 'Cmt'],
876
- ['P', 'P', 'S', 'Ç', 'P', 'C', 'C']
877
- ];
878
- break;
879
- case 'zh':
880
- dateFormats = ['yyyy年M月d日', 'yyyy年M月d日', 'yyyy/M/d', 'yyyy年M月', 'M月d日', 'M月d日'];
881
- dayPeriods = ['上午', '下午'];
882
- months[0] = months[1] = ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'];
883
- days[0] = days[1] = ['週日', '週一', '週二', '週三', '週四', '週五', '週六'];
884
- days[2] = ['日', '一', '二', '三', '四', '五', '六'];
885
- break;
886
- }
710
+ const timeFormat = getTimeFormat(hour24, language, baseLanguage);
711
+
712
+ let dateFormats = ['dddd, MMMM d, yyyy', 'MMM d, yyyy', 'M/d/yyyy', 'MMMM yyyy', 'MMMM d', 'MMM d'];
713
+ const fullTimeFormat = (baseLanguage === 'zh' && language !== 'zh-tw') ? `ZZZ ${timeFormat}` : `${timeFormat} ZZZ`;
714
+ let dayPeriods = ['AM', 'PM'];
715
+ let months = [
716
+ ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
717
+ ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
718
+ ];
719
+ let days = [
720
+ ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
721
+ ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
722
+ ['S', 'M', 'T', 'W', 'T', 'F', 'S']
723
+ ];
724
+ let firstDayOfWeek = (mondayFirstDayLocales.indexOf(baseLanguage) > -1) ? 1 : 0;
725
+ let weekendStartDay = 6;
726
+ let weekendEndDay = 0;
727
+
728
+ switch (baseLanguage) {
729
+ case 'ar':
730
+ dateFormats = ['dddd, d MMMM, yyyy', 'dd MMMM, yyyy', 'dd/MM/yyyy', 'MMMM, yyyy', 'd MMMM', 'd MMM'];
731
+ dayPeriods = ['ص', 'م'];
732
+ months[0] = months[1] = ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'];
733
+ days = [
734
+ ['الأحد', 'الإثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],
735
+ ['أحد', 'إثنين', 'ثلاثاء', 'أربعاء', 'خميس', 'جمعة', 'سبت'],
736
+ ['أ', 'إ', 'ث', 'أر', 'خ', 'ج', 'س']
737
+ ];
738
+ firstDayOfWeek = 6;
739
+ weekendStartDay = 4;
740
+ weekendEndDay = 5;
741
+ break;
742
+ case 'cy':
743
+ dateFormats = ['dddd, d MMMM yyyy', 'dd MMMM yyyy', 'dd/MM/yyyy', 'MMMM yyyy', 'd MMMM', 'd MMM'];
744
+ months = [
745
+ ['Ionawr', 'Chwefror', 'Mawrth', 'Ebrill', 'Mai', 'Mehefin', 'Gorffennaf', 'Awst', 'Medi', 'Hydref', 'Tachwedd', 'Rhagfyr'],
746
+ ['Ion', 'Chwe', 'Maw', 'Ebr', 'Mai', 'Meh', 'Gor', 'Awst', 'Medi', 'Hyd', 'Tach', 'Rhag']
747
+ ];
748
+ days = [
749
+ ['Dydd Sul', 'Dydd Llun', 'Dydd Mawrth', 'Dydd Mercher', 'Dydd Iau', 'Dydd Gwener', 'Dydd Sadwrn'],
750
+ ['Sul', 'Llun', 'Maw', 'Mer', 'Iau', 'Gwe', 'Sad'],
751
+ ['Su', 'Ll', 'Ma', 'Me', 'Ia', 'Gw', 'Sa']
752
+ ];
753
+ break;
754
+ case 'da':
755
+ dateFormats = ['dddd \'den\' d. MMMM yyyy', 'd. MMM. yyyy', 'dd.MM.yyyy', 'MMMM yyyy', 'd. MMMM', 'd. MMM'];
756
+ months = [
757
+ ['januar', 'februar', 'marts', 'april', 'maj', 'juni', 'juli', 'august', 'september', 'oktober', 'november', 'december'],
758
+ ['jan.', 'feb.', 'mar.', 'apr.', 'maj', 'jun.', 'jul.', 'aug.', 'sep.', 'okt.', 'nov.', 'dec.']
759
+ ];
760
+ days = [
761
+ ['søndag', 'mandag', 'tirsdag', 'onsdag', 'torsdag', 'fredag', 'lørdag'],
762
+ ['søn.', 'man.', 'tir.', 'ons.', 'tor.', 'fre.', 'lør.'],
763
+ ['S', 'M', 'T', 'O', 'T', 'F', 'L']
764
+ ];
765
+ break;
766
+ case 'de':
767
+ dateFormats = ['dddd d. MMMM yyyy', 'd. MMMM yyyy', 'dd.MM.yyyy', 'MMMM yyyy', 'd. MMMM', 'd. MMM'];
768
+ months = [
769
+ ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'],
770
+ ['Jan.', 'Feb.', 'März', 'Apr.', 'Mai', 'Juni', 'Juli', 'Aug.', 'Sept.', 'Okt.', 'Nov.', 'Dez.']
771
+ ];
772
+ days = [
773
+ ['Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag'],
774
+ ['So.', 'Mo.', 'Di.', 'Mi.', 'Do.', 'Fr.', 'Sa.'],
775
+ ['S', 'M', 'D', 'M', 'D', 'F', 'S']
776
+ ];
777
+ break;
778
+ case 'es':
779
+ dateFormats = ['dddd d\' de \'MMMM\' de \'yyyy', 'd\' de \'MMMM\' de \'yyyy', 'dd/MM/yyyy', 'MMMM yyyy', 'd\' de \'MMMM', 'd\' de \'MMM'];
780
+ dayPeriods = ['a. m.', 'p. m.'];
781
+ months = [
782
+ ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'],
783
+ ['ene.', 'feb.', 'mar.', 'abr.', 'may.', 'jun.', 'jul.', 'ago.', 'sep.', 'oct.', 'nov.', 'dic.']
784
+ ];
785
+ days = [
786
+ ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],
787
+ ['dom.', 'lun.', 'mar.', 'mié.', 'jue.', 'vie.', 'sáb.'],
788
+ ['D', 'L', 'M', 'M', 'J', 'V', 'S']
789
+ ];
790
+ break;
791
+ case 'fr':
792
+ dateFormats = ['dddd d MMMM yyyy', 'd MMM yyyy', 'dd/MM/yyyy', 'MMMM yyyy', 'd MMMM', 'd MMM'];
793
+ months = [
794
+ ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],
795
+ ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.']
796
+ ];
797
+ days = [
798
+ ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],
799
+ ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],
800
+ ['D', 'L', 'M', 'M', 'J', 'V', 'S']
801
+ ];
802
+ break;
803
+ case 'hi':
804
+ dateFormats = ['dddd, d MMMM yyyy', 'd MMMM yyyy', 'dd-MM-yyyy', 'MMMM yyyy', 'd MMMM', 'd MMM'];
805
+ dayPeriods = ['पूर्वाह्न', 'अपराह्न'];
806
+ months = [
807
+ ['जनवरी', 'फरवरी', 'मार्च', 'अप्रैल', 'मई', 'जून', 'जुलाई', 'अगस्त', 'सितंबर', 'अक्टूबर', 'नवंबर', 'दिसंबर'],
808
+ ['जन', 'फर', 'मार्च', 'अप्रैल', 'मई', 'जून', 'जुलाई', 'अग', 'सितं', 'अक्टू', 'नवं', 'दिसं']
809
+ ];
810
+ days = [
811
+ ['रविवार', 'सोमवार', 'मंगलवार', 'बुधवार', 'गुरूवार', 'शुक्रवार', 'शनिवार'],
812
+ ['रवि', 'सोम', 'मंगल', 'बुध', 'गुरु', 'शुक्र', 'शनि'],
813
+ ['र', 'सो', 'मं', 'बु', 'गु', 'शु', 'श']
814
+ ];
815
+ break;
816
+ case 'ja':
817
+ dateFormats = ['yyyy年M月d日', 'yyyy年M月d日', 'yyyy/MM/dd', 'yyyy年M月', 'M月d日', 'M月d日'];
818
+ dayPeriods = ['午前', '午後'];
819
+ months[0] = months[1] = ['1 月', '2 月', '3 月', '4 月', '5 月', '6 月', '7 月', '8 月', '9 月', '10 月', '11 月', '12 月'];
820
+ days[0] = days[1] = days[2] = ['日', '月', '火', '水', '木', '金', '土'];
821
+ break;
822
+ case 'ko':
823
+ dateFormats = ['yyyy년 M월 d일 dddd', 'yyyy년 M월 d일', 'yyyy-MM-dd', 'yyyy년 M월', 'M월 d일', 'MMM d일'];
824
+ dayPeriods = ['오전', '오후'];
825
+ months[0] = months[1] = ['1월', '2월', '3월', '4월', '5월', '6월', '7월', '8월', '9월', '10월', '11월', '12월'];
826
+ days[0] = ['일요일', '월요일', '화요일', '수요일', '목요일', '금요일', '토요일'];
827
+ days[1] = days[2] = ['일', '월', '화', '수', '목', '금', '토'];
828
+ break;
829
+ case 'mi':
830
+ dateFormats = ['dddd, d MMMM y', 'd MMMM y', 'dd-MM-y', 'MMMM yyyy', 'd MMMM', 'd MMM'];
831
+ months = [
832
+ ['Kohitātea', 'Huitanguru', 'Poutūterangi', 'Paengawhāwhā', 'Haratua', 'Pipiri', 'Hōngongoi', 'Hereturikōkā', 'Mahuru', 'Whiringa-ā-nuku', 'Whiringa-ā-rangi', 'Hakihea'],
833
+ ['Kohi', 'Hui', 'Pou', 'Pae', 'Hara', 'Pipi', 'Hōngo', 'Here', 'Mahu', 'Nuku', 'Rangi', 'Haki']
834
+ ];
835
+ days = [
836
+ ['Rātapu', 'Rāhina', 'Rātū', 'Rāapa', 'Rāpare', 'Rāmere', 'Rāhoroi'],
837
+ ['Tap', 'Hin', '', 'Apa', 'Par', 'Mer', 'Hor'],
838
+ ['T', 'H', 'T', 'A', 'P', 'M', 'H']
839
+ ];
840
+ break;
841
+ case 'nl':
842
+ dateFormats = ['dddd d MMMM yyyy', 'd MMMM yyyy', 'dd-MM-yyyy', 'MMMM yyyy', 'd MMMM', 'd MMM'];
843
+ dayPeriods = ['a.m.', 'p.m.'];
844
+ months = [
845
+ ['januari', 'februari', 'maart', 'april', 'mei', 'juni', 'juli', 'augustus', 'september', 'oktober', 'november', 'december'],
846
+ ['jan.', 'feb.', 'mrt.', 'apr.', 'mei', 'jun.', 'jul.', 'aug.', 'sep.', 'okt.', 'nov.', 'dec.']
847
+ ];
848
+ days = [
849
+ ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'],
850
+ ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'],
851
+ ['Z', 'M', 'D', 'W', 'D', 'V', 'Z']
852
+ ];
853
+ break;
854
+ case 'pt':
855
+ dateFormats = ['dddd, d\' de \'MMMM\' de \'yyyy', 'd\' de \'MMMM\' de \'yyyy', 'dd/MM/yyyy', 'MMMM\' de \'yyyy', 'dd\' de \'MMMM', 'dd\' de \'MMM'];
856
+ months = [
857
+ ['janeiro', 'fevereiro', 'março', 'abril', 'maio', 'junho', 'julho', 'agosto', 'setembro', 'outubro', 'novembro', 'dezembro'],
858
+ ['jan', 'fev', 'mar', 'abr', 'mai', 'jun', 'jul', 'ago', 'set', 'out', 'nov', 'dez']
859
+ ];
860
+ days = [
861
+ ['domingo', 'segunda-feira', 'terça-feira', 'quarta-feira', 'quinta-feira', 'sexta-feira', 'sábado'],
862
+ ['dom', 'seg', 'ter', 'qua', 'qui', 'sex', 'sáb'],
863
+ ['D', 'S', 'T', 'Q', 'Q', 'S', 'S']
864
+ ];
865
+ break;
866
+ case 'sv':
867
+ dateFormats = ['dddd \'den\' d MMMM yyyy', 'd MMMM yyyy', 'yyyy-MM-dd', 'MMMM yyyy', 'dd MMMM', 'dd MMM'];
868
+ dayPeriods = ['fm', 'em'];
869
+ months = [
870
+ ['januari', 'februari', 'mars', 'april', 'maj', 'juni', 'juli', 'augusti', 'september', 'oktober', 'november', 'december'],
871
+ ['jan.', 'feb.', 'mars', 'apr.', 'maj', 'juni', 'juli', 'aug.', 'sep.', 'okt.', 'nov.', 'dec.']
872
+ ];
873
+ days = [
874
+ ['Söndag', 'Måndag', 'Tisdag', 'Onsdag', 'Torsdag', 'Fredag', 'Lördag'],
875
+ ['Sön', 'Mån', 'Tis', 'Ons', 'Tor', 'Fre', 'Lör'],
876
+ ['S', 'M', 'T', 'O', 'T', 'F', 'L']
877
+ ];
878
+ break;
879
+ case 'tr':
880
+ dateFormats = ['dd MMMM yyyy dddd', 'dd MMMM yyyy', 'dd.MM.yyyy', 'MMMM yyyy', 'dd MMMM', 'dd MMM'];
881
+ dayPeriods = ['ÖÖ', 'ÖS'];
882
+ months = [
883
+ ['Ocak', 'Şubat', 'Mart', 'Nisan', 'Mayıs', 'Haziran', 'Temmuz', 'Ağustos', 'Eylül', 'Ekim', 'Kasım', 'Aralık'],
884
+ ['Oca', 'Şub', 'Mar', 'Nis', 'May', 'Haz', 'Tem', 'Ağu', 'Eyl', 'Ek', 'Kas', 'Ara']
885
+ ];
886
+ days = [
887
+ ['Pazar', 'Pazartesi', 'Salı', 'Çarşamba', 'Perşembe', 'Cuma', 'Cumartesi'],
888
+ ['Paz', 'Pzt', 'Sal', 'Çar', 'Per', 'Cum', 'Cmt'],
889
+ ['P', 'P', 'S', 'Ç', 'P', 'C', 'C']
890
+ ];
891
+ break;
892
+ case 'zh':
893
+ dateFormats = ['yyyy年M月d日', 'yyyy年M月d日', 'yyyy/M/d', 'yyyy年M月', 'M月d日', 'M月d日'];
894
+ dayPeriods = ['上午', '下午'];
895
+ months[0] = months[1] = ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'];
896
+ days[0] = days[1] = ['週日', '週一', '週二', '週三', '週四', '週五', '週六'];
897
+ days[2] = ['日', '一', '二', '三', '四', '五', '六'];
898
+ break;
899
+ }
887
900
 
888
- switch (language) {
889
- case 'en-gb':
890
- dateFormats = ['dddd, d MMMM yyyy', 'dd MMMM yyyy', 'dd/MM/yyyy', 'MMMM yyyy', 'd MMMM', 'd MMM'];
891
- break;
892
- case 'fr-ca':
893
- dateFormats[1] = 'MMM d yyyy';
894
- dateFormats[2] = 'yyyy-MM-dd';
895
- dateFormats[4] = 'MMMM d';
896
- dateFormats[5] = 'MMM d';
897
- firstDayOfWeek = 0;
898
- break;
899
- case 'fr-on':
900
- dateFormats[0] = 'dddd\' le \'d MMMM yyyy';
901
- dateFormats[1] = 'MMM d yyyy';
902
- dateFormats[2] = 'yyyy-MM-dd';
903
- firstDayOfWeek = 0;
904
- break;
905
- case 'zh-tw':
906
- days[0] = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'];
907
- break;
908
- }
901
+ switch (language) {
902
+ case 'en-gb':
903
+ dateFormats = ['dddd, d MMMM yyyy', 'dd MMMM yyyy', 'dd/MM/yyyy', 'MMMM yyyy', 'd MMMM', 'd MMM'];
904
+ break;
905
+ case 'fr-ca':
906
+ dateFormats[1] = 'MMM d yyyy';
907
+ dateFormats[2] = 'yyyy-MM-dd';
908
+ dateFormats[4] = 'MMMM d';
909
+ dateFormats[5] = 'MMM d';
910
+ firstDayOfWeek = 0;
911
+ break;
912
+ case 'fr-on':
913
+ dateFormats[0] = 'dddd\' le \'d MMMM yyyy';
914
+ dateFormats[1] = 'MMM d yyyy';
915
+ dateFormats[2] = 'yyyy-MM-dd';
916
+ firstDayOfWeek = 0;
917
+ break;
918
+ case 'zh-tw':
919
+ days[0] = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'];
920
+ break;
921
+ }
909
922
 
910
- const descriptor = {
911
- hour24: hour24,
912
- formats: {
913
- dateFormats: {
914
- 'full': dateFormats[0],
915
- 'medium': dateFormats[1],
916
- 'short': dateFormats[2],
917
- 'monthYear': dateFormats[3],
918
- 'monthDay': dateFormats[4],
919
- 'shortMonthDay': dateFormats[5],
920
- 'longDayOfWeek': 'dddd',
921
- 'shortDayOfWeek': 'ddd',
922
- 'longMonth': 'MMMM',
923
- 'shortMonth': 'MMM'
923
+ const descriptor = {
924
+ hour24: hour24,
925
+ formats: {
926
+ dateFormats: {
927
+ 'full': dateFormats[0],
928
+ 'medium': dateFormats[1],
929
+ 'short': dateFormats[2],
930
+ 'monthYear': dateFormats[3],
931
+ 'monthDay': dateFormats[4],
932
+ 'shortMonthDay': dateFormats[5],
933
+ 'longDayOfWeek': 'dddd',
934
+ 'shortDayOfWeek': 'ddd',
935
+ 'longMonth': 'MMMM',
936
+ 'shortMonth': 'MMM'
937
+ },
938
+ timeFormats: {
939
+ 'full': fullTimeFormat,
940
+ 'medium': timeFormat,
941
+ 'short': timeFormat
942
+ }
924
943
  },
925
- timeFormats: {
926
- 'full': fullTimeFormat,
927
- 'medium': timeFormat,
928
- 'short': timeFormat
944
+ calendar: {
945
+ firstDayOfWeek: firstDayOfWeek,
946
+ weekendStartDay: weekendStartDay,
947
+ weekendEndDay: weekendEndDay,
948
+ months: {
949
+ short: months[1],
950
+ long: months[0]
951
+ },
952
+ days: {
953
+ narrow: days[2],
954
+ short: days[1],
955
+ long: days[0]
956
+ },
957
+ dayPeriods: { am: dayPeriods[0], pm: dayPeriods[1] }
929
958
  }
930
- },
931
- calendar: {
932
- firstDayOfWeek: firstDayOfWeek,
933
- weekendStartDay: weekendStartDay,
934
- weekendEndDay: weekendEndDay,
935
- months: {
936
- short: months[1],
937
- long: months[0]
938
- },
939
- days: {
940
- narrow: days[2],
941
- short: days[1],
942
- long: days[0]
943
- },
944
- dayPeriods: { am: dayPeriods[0], pm: dayPeriods[1] }
945
- }
946
- };
959
+ };
947
960
 
948
- if (settings.overrides.date) {
949
- merge(descriptor, settings.overrides.date);
950
- }
961
+ if (settings.overrides.date) {
962
+ merge(descriptor, settings.overrides.date);
963
+ }
951
964
 
952
- return descriptor;
965
+ return descriptor;
953
966
 
967
+ });
954
968
  }
955
969
 
956
970
  export function formatTime(date, options) {
package/lib/number.js CHANGED
@@ -112,6 +112,7 @@ export function getNumberDescriptor() {
112
112
  case 'es':
113
113
  case 'hi':
114
114
  case 'ja':
115
+ case 'mi':
115
116
  case 'pt':
116
117
  case 'zh':
117
118
  percentPattern = '{number}%';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@brightspace-ui/intl",
3
- "version": "3.13.2",
3
+ "version": "3.15.0",
4
4
  "description": "Internationalization APIs for number, date, time and file size formatting and parsing in D2L Brightspace.",
5
5
  "main": "lib/number.js",
6
6
  "scripts": {
@@ -38,11 +38,11 @@
38
38
  "devDependencies": {
39
39
  "@babel/core": "^7",
40
40
  "@babel/eslint-parser": "^7",
41
- "@web/dev-server": "^0.2",
41
+ "@web/dev-server": "^0.3",
42
42
  "chai": "^4",
43
43
  "concurrently": "^8",
44
44
  "eslint": "^8",
45
- "eslint-config-brightspace": "^0.21",
45
+ "eslint-config-brightspace": "^0.25",
46
46
  "http-server": "^14.0",
47
47
  "mocha": "^10",
48
48
  "mocha-headless-chrome": "^4"