@ndla/ui 42.0.2 → 42.0.4

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.
Files changed (66) hide show
  1. package/es/AudioPlayer/AudioPlayer.js +15 -15
  2. package/es/Gloss/Gloss.js +137 -0
  3. package/es/Gloss/index.js +9 -0
  4. package/es/List/OrderedList.js +1 -1
  5. package/es/Navigation/NavigationBox.js +20 -20
  6. package/es/Programme/ProgrammeSubjects.js +7 -6
  7. package/es/all.css +1 -1
  8. package/es/locale/messages-en.js +15 -4
  9. package/es/locale/messages-nb.js +14 -4
  10. package/es/locale/messages-nn.js +14 -4
  11. package/es/locale/messages-se.js +14 -4
  12. package/es/locale/messages-sma.js +14 -4
  13. package/es/model/Transcriptions.js +1 -0
  14. package/es/model/WordClass.js +45 -0
  15. package/es/model/index.js +5 -1
  16. package/lib/AudioPlayer/AudioPlayer.js +15 -15
  17. package/lib/Gloss/Gloss.d.ts +32 -0
  18. package/lib/Gloss/Gloss.js +141 -0
  19. package/lib/Gloss/index.d.ts +8 -0
  20. package/lib/Gloss/index.js +13 -0
  21. package/lib/List/OrderedList.js +1 -1
  22. package/lib/Navigation/NavigationBox.d.ts +1 -1
  23. package/lib/Navigation/NavigationBox.js +20 -20
  24. package/lib/Programme/ProgrammeSubjects.d.ts +3 -3
  25. package/lib/Programme/ProgrammeSubjects.js +7 -6
  26. package/lib/all.css +1 -1
  27. package/lib/locale/messages-en.d.ts +12 -1
  28. package/lib/locale/messages-en.js +17 -4
  29. package/lib/locale/messages-nb.d.ts +12 -1
  30. package/lib/locale/messages-nb.js +15 -4
  31. package/lib/locale/messages-nn.d.ts +12 -1
  32. package/lib/locale/messages-nn.js +15 -4
  33. package/lib/locale/messages-se.d.ts +12 -1
  34. package/lib/locale/messages-se.js +15 -4
  35. package/lib/locale/messages-sma.d.ts +12 -1
  36. package/lib/locale/messages-sma.js +15 -4
  37. package/lib/model/Transcriptions.d.ts +11 -0
  38. package/lib/model/Transcriptions.js +5 -0
  39. package/lib/model/WordClass.d.ts +44 -0
  40. package/lib/model/WordClass.js +52 -0
  41. package/lib/model/index.d.ts +4 -0
  42. package/lib/model/index.js +5 -1
  43. package/package.json +14 -14
  44. package/src/AudioPlayer/AudioPlayer.tsx +1 -0
  45. package/src/ContactBlock/Contactblock.stories.tsx +2 -2
  46. package/src/Gloss/Gloss.stories.tsx +108 -0
  47. package/src/Gloss/Gloss.tsx +163 -0
  48. package/src/Gloss/index.tsx +9 -0
  49. package/src/Grid/Grid.stories.tsx +1 -1
  50. package/src/KeyFigure/KeyFigure.stories.tsx +2 -2
  51. package/src/LearningPaths/LearningPathMenu.stories.tsx +2 -2
  52. package/src/List/OrderedList.tsx +36 -27
  53. package/src/MyNdla/Resource/Folder.stories.tsx +1 -1
  54. package/src/Navigation/NavigationBox.tsx +2 -2
  55. package/src/Programme/ProgrammeSubjects.tsx +7 -7
  56. package/src/Resource/BlockResource.stories.tsx +1 -1
  57. package/src/Resource/Resource.stories.tsx +1 -1
  58. package/src/global/components/component.bodybox.scss +0 -16
  59. package/src/locale/messages-en.ts +46 -1
  60. package/src/locale/messages-nb.ts +46 -1
  61. package/src/locale/messages-nn.ts +46 -1
  62. package/src/locale/messages-se.ts +46 -1
  63. package/src/locale/messages-sma.ts +46 -1
  64. package/src/model/Transcriptions.ts +12 -0
  65. package/src/model/WordClass.ts +45 -0
  66. package/src/model/index.ts +4 -0
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Copyright (c) 2023-present, NDLA.
3
+ *
4
+ * This source code is licensed under the GPLv3 license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ *
7
+ */
8
+
9
+ import React from 'react';
10
+ import { Meta, StoryObj, StoryFn } from '@storybook/react';
11
+ import Gloss from './Gloss';
12
+ import { defaultParameters } from '../../../../stories/defaults';
13
+ import { WordClass } from '../model/WordClass';
14
+
15
+ const meta: Meta<typeof Gloss> = {
16
+ title: 'Components/Gloss',
17
+ component: Gloss,
18
+ tags: ['autodocs'],
19
+ parameters: {
20
+ ...defaultParameters,
21
+ },
22
+ args: {
23
+ title: {
24
+ title: 'Å angripe',
25
+ language: 'nb',
26
+ },
27
+ glossData: {
28
+ gloss: 'angreifen',
29
+ wordClass: WordClass.Verb,
30
+ originalLanguage: 'de',
31
+ transcriptions: {},
32
+ examples: [
33
+ [
34
+ {
35
+ example: 'Hitler greift die Sowjetunion an',
36
+ language: 'de',
37
+ transcriptions: {},
38
+ },
39
+ {
40
+ example: 'Hitler angriper Sovjetunionen',
41
+ language: 'nb',
42
+ transcriptions: {},
43
+ },
44
+ ],
45
+ [
46
+ {
47
+ example: 'Ich greife an',
48
+ language: 'de',
49
+ transcriptions: {},
50
+ },
51
+ {
52
+ example: 'Jeg griper an',
53
+ language: 'nb',
54
+ transcriptions: {},
55
+ },
56
+ ],
57
+ ],
58
+ },
59
+ audio: {
60
+ title: '',
61
+ src: '',
62
+ },
63
+ },
64
+ };
65
+
66
+ export default meta;
67
+
68
+ export const GlossStory: StoryFn<typeof Gloss> = ({ ...args }) => {
69
+ return <Gloss {...args} />;
70
+ };
71
+
72
+ export const GlossChineseStory: StoryObj<typeof Gloss> = {
73
+ args: {
74
+ title: {
75
+ title: 'Ma Hong',
76
+ language: 'nb',
77
+ },
78
+ glossData: {
79
+ gloss: '马红',
80
+ wordClass: WordClass.ProperNoun,
81
+ originalLanguage: 'zh',
82
+ transcriptions: {
83
+ traditional: '(馬紅)',
84
+ pinyin: 'Mǎ Hóng',
85
+ },
86
+ examples: [
87
+ [
88
+ {
89
+ example: '我叫马红',
90
+ language: 'zh',
91
+ transcriptions: {
92
+ pinyin: 'wo jiao ma hong',
93
+ },
94
+ },
95
+ {
96
+ example: 'Jeg heter ma hong',
97
+ language: 'nb',
98
+ transcriptions: {},
99
+ },
100
+ ],
101
+ ],
102
+ },
103
+ audio: {
104
+ title: 'Spill av lyd',
105
+ src: 'https://api.staging.ndla.no/audio/files/shu3jia4.mp3',
106
+ },
107
+ },
108
+ };
@@ -0,0 +1,163 @@
1
+ /**
2
+ * Copyright (c) 2023-present, NDLA.
3
+ *
4
+ * This source code is licensed under the GPLv3 license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ *
7
+ */
8
+
9
+ import styled from '@emotion/styled';
10
+ import { useTranslation } from 'react-i18next';
11
+ import { colors, spacing, misc, fonts } from '@ndla/core';
12
+ import { AccordionRoot, AccordionItem, AccordionHeader, AccordionContent } from '@ndla/accordion';
13
+ import { Transcription } from '../model/Transcriptions';
14
+ import SpeechControl from '../AudioPlayer/SpeechControl';
15
+
16
+ interface Example {
17
+ example: string;
18
+ language: string;
19
+ transcriptions: Transcription;
20
+ }
21
+
22
+ export interface Props {
23
+ title: {
24
+ title: string;
25
+ language: string;
26
+ };
27
+ glossData: {
28
+ gloss: string;
29
+ wordClass?: string;
30
+ originalLanguage: string;
31
+ transcriptions: Transcription;
32
+ examples?: Example[][];
33
+ };
34
+ audio: {
35
+ title: string;
36
+ src?: string;
37
+ };
38
+ }
39
+
40
+ const Container = styled.div`
41
+ display: flex;
42
+ flex-direction: column;
43
+ background-color: ${colors.background.lightBlue};
44
+ padding: ${spacing.nsmall} ${spacing.normal};
45
+ border: 1px solid ${colors.brand.lighter};
46
+ border-radius: ${misc.borderRadius};
47
+ margin-bottom: ${spacing.xsmall};
48
+ gap: ${spacing.nsmall};
49
+ `;
50
+
51
+ const Wrapper = styled.div`
52
+ display: flex;
53
+ flex-wrap: wrap;
54
+ justify-content: space-between;
55
+ `;
56
+
57
+ const GlossContainer = styled.div`
58
+ display: flex;
59
+ flex-wrap: wrap;
60
+ gap: ${spacing.nsmall};
61
+ `;
62
+
63
+ const GlossSpan = styled.span`
64
+ font-weight: ${fonts.weight.bold};
65
+ `;
66
+
67
+ const TypeSpan = styled.span`
68
+ font-style: italic;
69
+ `;
70
+
71
+ const StyledAccordionHeader = styled(AccordionHeader)`
72
+ font-family: ${fonts.sans};
73
+ ${fonts.sizes('16px', '24px')};
74
+ font-weight: ${fonts.weight.semibold};
75
+ background-color: ${colors.background.lightBlue};
76
+ `;
77
+
78
+ const StyledAccordionContent = styled(AccordionContent)`
79
+ padding: 0;
80
+ `;
81
+
82
+ const TranslatedText = styled.span`
83
+ display: flex;
84
+ flex-direction: column;
85
+ border-bottom: 1px solid ${colors.brand.lighter};
86
+ padding: ${spacing.small} ${spacing.normal};
87
+ font-family: ${fonts.sans};
88
+ ${fonts.sizes('18px', '24px')};
89
+ :first-child {
90
+ color: ${colors.brand.dark};
91
+ font-weight: ${fonts.weight.bold};
92
+ background-color: ${colors.background.lightBlue};
93
+ }
94
+ `;
95
+
96
+ const Gloss = ({ title, glossData, audio }: Props) => {
97
+ const { t } = useTranslation();
98
+
99
+ return (
100
+ <>
101
+ <Container>
102
+ <Wrapper>
103
+ <GlossContainer>
104
+ <GlossSpan lang={glossData.originalLanguage}>{glossData.gloss}</GlossSpan>
105
+ {glossData.transcriptions.traditional && (
106
+ <span
107
+ key={t('gloss.transcriptions.traditional')}
108
+ aria-label={t('gloss.transcriptions.traditional')}
109
+ lang={glossData.originalLanguage}
110
+ >
111
+ {glossData.transcriptions.traditional}
112
+ </span>
113
+ )}
114
+ {glossData.transcriptions.pinyin && (
115
+ <span
116
+ key={t('gloss.transcriptions.pinyin')}
117
+ aria-label={t('gloss.transcriptions.pinyin')}
118
+ lang={glossData.originalLanguage}
119
+ >
120
+ {glossData.transcriptions.pinyin}
121
+ </span>
122
+ )}
123
+ {glossData.wordClass && (
124
+ <TypeSpan aria-label={t('gloss.wordClass')}>{t(`wordClass.${glossData.wordClass}`)}</TypeSpan>
125
+ )}
126
+ </GlossContainer>
127
+ {audio.src && <SpeechControl src={audio.src} title={audio.title}></SpeechControl>}
128
+ </Wrapper>
129
+ <span>{title.title}</span>
130
+ </Container>
131
+ {glossData.examples && (
132
+ <AccordionRoot type="single" collapsible>
133
+ <AccordionItem value="1">
134
+ <StyledAccordionHeader>{t('gloss.examples')}</StyledAccordionHeader>
135
+ <StyledAccordionContent>
136
+ {glossData.examples.map((example, index) => (
137
+ <div key={index}>
138
+ {example.map((translation) => (
139
+ <>
140
+ <TranslatedText>{translation.example}</TranslatedText>
141
+ {translation.transcriptions.pinyin && (
142
+ <TranslatedText key={t('gloss.transcriptions.pinyin')} lang={glossData.originalLanguage}>
143
+ {translation.transcriptions?.pinyin}
144
+ </TranslatedText>
145
+ )}
146
+ {translation.transcriptions.traditional && (
147
+ <TranslatedText key={t('gloss.transcriptions.traditional')} lang={glossData.originalLanguage}>
148
+ {translation.transcriptions?.traditional}
149
+ </TranslatedText>
150
+ )}
151
+ </>
152
+ ))}
153
+ </div>
154
+ ))}
155
+ </StyledAccordionContent>
156
+ </AccordionItem>
157
+ </AccordionRoot>
158
+ )}
159
+ </>
160
+ );
161
+ };
162
+
163
+ export default Gloss;
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Copyright (c) 2023-present, NDLA.
3
+ *
4
+ * This source code is licensed under the GPLv3 license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ *
7
+ */
8
+
9
+ export { default as Gloss } from './Gloss';
@@ -18,7 +18,7 @@ import { KeyFigureStory } from '../KeyFigure/KeyFigure.stories';
18
18
 
19
19
  const GridWrapper = styled.div`
20
20
  .docs-story {
21
- background-color: ${colors.background.frontpageArticle};
21
+ background-color: ${colors.background.lightBlue};
22
22
  }
23
23
  `;
24
24
 
@@ -20,7 +20,7 @@ const args = {
20
20
  };
21
21
 
22
22
  export default {
23
- title: 'Components/Nøkkeltall',
23
+ title: 'Components/Key figures',
24
24
  component: KeyFigure,
25
25
  tags: ['autodocs'],
26
26
  parameters: {
@@ -35,4 +35,4 @@ export const KeyFigureStory: StoryFn<typeof KeyFigure> = ({ ...args }) => {
35
35
  };
36
36
 
37
37
  KeyFigureStory.args = args;
38
- KeyFigureStory.storyName = 'Nøkkeltall';
38
+ KeyFigureStory.storyName = 'Key figures';
@@ -50,7 +50,7 @@ const args = {
50
50
  };
51
51
 
52
52
  export default {
53
- title: 'Patterns/Læringssti-meny',
53
+ title: 'Patterns/Learning path menu',
54
54
  component: LearningPathMenu,
55
55
  tags: ['autodocs'],
56
56
  parameters: {
@@ -65,4 +65,4 @@ export const LearningPathMenuStory: StoryFn<typeof LearningPathMenu> = ({ ...arg
65
65
  };
66
66
 
67
67
  LearningPathMenuStory.args = args;
68
- LearningPathMenuStory.storyName = 'Læringssti-meny';
68
+ LearningPathMenuStory.storyName = 'Learning path menu';
@@ -41,51 +41,60 @@ const StyledOl = styled.ol`
41
41
  margin-bottom: ${spacing.nsmall} !important;
42
42
  }
43
43
  }
44
+ counter-reset: level1;
44
45
 
45
46
  &[data-type='letters'] {
46
- counter-reset: item 0;
47
47
  > li {
48
- counter-increment: item;
49
48
  &:before {
50
- position: absolute;
51
- transform: translateX(-100%);
52
- content: counter(item, upper-alpha) '.';
53
- padding-right: ${spacing.nsmall};
49
+ content: counter(level1, upper-alpha) '.';
54
50
  }
55
51
 
56
52
  > ol[data-type='letters'] {
57
53
  > li:before {
58
- content: counter(item, lower-alpha) '.';
54
+ content: counter(level1, lower-alpha) '.';
59
55
  }
60
56
  ol[data-type='letters'] {
61
57
  > li:before {
62
- content: counter(item, lower-roman) '.';
58
+ content: counter(level1, lower-roman) '.';
63
59
  }
64
60
  }
65
61
  }
66
62
  }
67
63
  }
68
64
 
69
- &:not([data-type='letters']) {
70
- counter-reset: item 0;
71
- > li {
72
- counter-increment: item;
73
- &:before {
74
- position: absolute;
75
- transform: translateX(-100%);
76
- content: counters(item, '.') '.';
77
- padding-right: ${spacing.nsmall};
78
- }
65
+ > li {
66
+ counter-increment: level1;
67
+ &:before {
68
+ position: absolute;
69
+ transform: translateX(-100%);
70
+ content: counter(level1, decimal) '.';
71
+ padding-right: ${spacing.nsmall};
72
+ }
79
73
 
80
- > ol:not([data-type='letters']) {
81
- > li {
82
- padding-left: ${spacing.nsmall};
83
- > ol:not([data-type='letters']) {
84
- > li {
85
- padding-left: ${spacing.medium};
86
- > ol:not([data-type='letters']) {
87
- > li {
88
- padding-left: ${spacing.large};
74
+ > ol:not([data-type='letters']) {
75
+ counter-reset: level2;
76
+ > li {
77
+ padding-left: ${spacing.nsmall};
78
+ counter-increment: level2;
79
+ &:before {
80
+ content: counter(level1, decimal) '.' counter(level2, decimal) '.';
81
+ }
82
+ > ol:not([data-type='letters']) {
83
+ counter-reset: level3;
84
+ > li {
85
+ padding-left: ${spacing.medium};
86
+ counter-increment: level3;
87
+ &:before {
88
+ content: counter(level1, decimal) '.' counter(level2, decimal) '.' counter(level3, decimal) '.';
89
+ }
90
+ > ol:not([data-type='letters']) {
91
+ counter-reset: level4;
92
+ > li {
93
+ padding-left: ${spacing.large};
94
+ counter-increment: level4;
95
+ &:before {
96
+ content: counter(level1, decimal) '.' counter(level2, decimal) '.' counter(level3, decimal) '.'
97
+ counter(level4, decimal) '.';
89
98
  }
90
99
  }
91
100
  }
@@ -7,7 +7,7 @@ import { defaultParameters } from '../../../../../stories/defaults';
7
7
  import Folder from './Folder';
8
8
 
9
9
  export default {
10
- title: 'Components/Mappe',
10
+ title: 'Components/Folder',
11
11
  component: Folder,
12
12
  tags: ['autodocs'],
13
13
  parameters: {
@@ -182,7 +182,7 @@ type Props = {
182
182
  heading?: string;
183
183
  colorMode?: 'primary' | 'darker' | 'light' | 'greyLightest' | 'greyLighter';
184
184
  isButtonElements?: boolean;
185
- items: ItemProps[];
185
+ items?: ItemProps[];
186
186
  onClick?: (event: MouseEvent<HTMLElement>, id?: string) => void;
187
187
  hasAdditionalResources?: boolean;
188
188
  showAdditionalResources?: boolean;
@@ -224,7 +224,7 @@ export const NavigationBox = ({
224
224
  )}
225
225
  </StyledHeadingWrapper>
226
226
  <StyledList data-testid="nav-box-list" direction={listDirection}>
227
- {items.map((item: ItemProps) => (
227
+ {items?.map((item: ItemProps) => (
228
228
  <StyledListItem key={item.label} listDirection={listDirection} data-testid="nav-box-item">
229
229
  <StyledListElementWrapper
230
230
  isAdditionalResource={item.isAdditionalResource}
@@ -24,12 +24,12 @@ const GradesMenu = styled.ul`
24
24
 
25
25
  export type GradesProps = {
26
26
  selectedGrade?: string;
27
- grades: {
27
+ grades?: {
28
28
  missingProgrammeSubjects?: boolean;
29
29
  name: string;
30
- categories: {
30
+ categories?: {
31
31
  name: string;
32
- subjects: {
32
+ subjects?: {
33
33
  label: string;
34
34
  url: string;
35
35
  }[];
@@ -45,14 +45,14 @@ const ProgrammeSubjects = ({ grades, onNavigate, selectedGrade = 'vg1' }: Props)
45
45
  const { t } = useTranslation();
46
46
 
47
47
  const grade = useMemo(
48
- () => grades.find((grade) => grade.name.toLowerCase() === selectedGrade) ?? grades[0],
48
+ () => grades?.find((grade) => grade.name.toLowerCase() === selectedGrade) ?? grades?.[0],
49
49
  [grades, selectedGrade],
50
50
  );
51
51
 
52
52
  return (
53
53
  <>
54
54
  <GradesMenu aria-label={t('programme.grades')}>
55
- {grades.map((item) => {
55
+ {grades?.map((item) => {
56
56
  const current = item.name.toLowerCase() === selectedGrade;
57
57
  return (
58
58
  <li key={item.name}>
@@ -69,8 +69,8 @@ const ProgrammeSubjects = ({ grades, onNavigate, selectedGrade = 'vg1' }: Props)
69
69
  );
70
70
  })}
71
71
  </GradesMenu>
72
- {grade.missingProgrammeSubjects && <MessageBox>{t('messageBoxInfo.noContent')}</MessageBox>}
73
- {grade.categories.map((category) => (
72
+ {grade?.missingProgrammeSubjects && <MessageBox>{t('messageBoxInfo.noContent')}</MessageBox>}
73
+ {grade?.categories?.map((category) => (
74
74
  <NavigationBox key={category.name} heading={category.name} items={category.subjects} onClick={onNavigate} />
75
75
  ))}
76
76
  </>
@@ -12,7 +12,7 @@ import { defaultParameters } from '../../../../stories/defaults';
12
12
  import BlockResource from './BlockResource';
13
13
 
14
14
  export default {
15
- title: 'Components/Ressurser/BlockResource',
15
+ title: 'Components/Resources/BlockResource',
16
16
  component: BlockResource,
17
17
  tags: ['autodocs'],
18
18
  parameters: {
@@ -12,7 +12,7 @@ import { defaultParameters } from '../../../../stories/defaults';
12
12
  import ListResource from './ListResource';
13
13
 
14
14
  export default {
15
- title: 'Components/Ressurser/ListResource',
15
+ title: 'Components/Resources/ListResource',
16
16
  component: ListResource,
17
17
  tags: ['autodocs'],
18
18
  parameters: {
@@ -31,22 +31,6 @@
31
31
  }
32
32
  }
33
33
 
34
- /* Hacks for complex content fetched inside bodybox */
35
- .c-bodybox > ul:not([class]),
36
- .c-bodybox :not(li) > ul:not([class]) {
37
- @include mq(desktop) {
38
- margin-left: $spacing;
39
- }
40
- }
41
-
42
- .c-bodybox > ol:not([class]),
43
- .c-bodybox :not(li) > ol:not([class]),
44
- .c-bodybox .ol-list--roman {
45
- @include mq(desktop) {
46
- margin-left: $spacing--large;
47
- }
48
- }
49
-
50
34
  .c-bodybox {
51
35
  .c-figure {
52
36
  width: 100% !important;
@@ -9,7 +9,7 @@
9
9
  import { contributorTypes } from '@ndla/licenses';
10
10
  import constants from '../model';
11
11
 
12
- export const { contentTypes, subjectCategories, subjectTypes } = constants;
12
+ export const { contentTypes, subjectCategories, subjectTypes, WordClass, Transcriptions } = constants;
13
13
 
14
14
  const titleTemplate = ' - NDLA';
15
15
 
@@ -1327,6 +1327,51 @@ const messages = {
1327
1327
  external: 'External resource',
1328
1328
  },
1329
1329
  },
1330
+ gloss: {
1331
+ examples: 'Examples',
1332
+ wordClass: 'Word class',
1333
+ transcriptions: {
1334
+ traditional: 'Traditional spelling',
1335
+ pinyin: 'Pinyin',
1336
+ },
1337
+ },
1338
+ wordClass: {
1339
+ [WordClass.WordClass.Adjective]: 'Adjective',
1340
+ [WordClass.WordClass.Adverb]: 'Adverb',
1341
+ [WordClass.WordClass.ProperNoun]: 'Proper Noun',
1342
+ [WordClass.WordClass.Auxiliary]: 'Auxiliary',
1343
+ [WordClass.WordClass.Complement]: 'Complement',
1344
+ [WordClass.WordClass.Conjunction]: 'Conjunction',
1345
+ [WordClass.WordClass.Coverb]: 'Coverb',
1346
+ [WordClass.WordClass.Determiner]: 'Determiner',
1347
+ [WordClass.WordClass.Interjection]: 'Interjection',
1348
+ [WordClass.WordClass.Quantifier]: 'Quantifier',
1349
+ [WordClass.WordClass.Marker]: 'Marker',
1350
+ [WordClass.WordClass.ModalVerb]: 'Modal Verb',
1351
+ [WordClass.WordClass.MeasureWord]: 'Measure Word',
1352
+ [WordClass.WordClass.Noun]: 'Noun',
1353
+ [WordClass.WordClass['Noun-zh']]: 'Noun',
1354
+ [WordClass.WordClass.NounPhrase]: 'Noun Phrase',
1355
+ [WordClass.WordClass.Onomatopoeia]: 'Onomatopoeia',
1356
+ [WordClass.WordClass.Particle]: 'Particle',
1357
+ [WordClass.WordClass.Demonstrative]: 'Demonstrative',
1358
+ [WordClass.WordClass.PersonalPronoun]: 'Personal Pronoun',
1359
+ [WordClass.WordClass.Preposition]: 'Preposition',
1360
+ [WordClass.WordClass.Pronoun]: 'Pronoun',
1361
+ [WordClass.WordClass.QuestionWord]: 'Question Word',
1362
+ [WordClass.WordClass.LocationWord]: 'Location Word',
1363
+ [WordClass.WordClass.Suffix]: 'Suffix',
1364
+ [WordClass.WordClass.Numeral]: 'Numeral',
1365
+ [WordClass.WordClass.TimeWord]: 'Time word',
1366
+ [WordClass.WordClass.TimeExpression]: 'Time Expression',
1367
+ [WordClass.WordClass.StativeVerb]: 'Stative Verb',
1368
+ [WordClass.WordClass.SubordinatingConjunction]: 'Subordinating Conjunction',
1369
+ [WordClass.WordClass.ExclamationWord]: 'Exclamation Word',
1370
+ [WordClass.WordClass.Expression]: 'Expression',
1371
+ [WordClass.WordClass.Verb]: 'Verb',
1372
+ [WordClass.WordClass.VerbComplement]: 'Verb-Complement',
1373
+ [WordClass.WordClass.VerbObject]: 'Verb-Object',
1374
+ },
1330
1375
  };
1331
1376
 
1332
1377
  export default messages;
@@ -9,7 +9,7 @@
9
9
  import { contributorTypes } from '@ndla/licenses';
10
10
  import constants from '../model';
11
11
 
12
- export const { contentTypes, subjectCategories, subjectTypes } = constants;
12
+ export const { contentTypes, subjectCategories, subjectTypes, WordClass } = constants;
13
13
 
14
14
  const titleTemplate = ' - NDLA';
15
15
 
@@ -1323,6 +1323,51 @@ const messages = {
1323
1323
  external: 'Ekstern ressurs',
1324
1324
  },
1325
1325
  },
1326
+ gloss: {
1327
+ examples: 'Eksempler',
1328
+ wordClass: 'Ordklasse',
1329
+ transcriptions: {
1330
+ traditional: 'Tradisjonell skrivemåte',
1331
+ pinyin: 'Pinyin',
1332
+ },
1333
+ },
1334
+ wordClass: {
1335
+ [WordClass.WordClass.Adjective]: 'Adjektiv',
1336
+ [WordClass.WordClass.Adverb]: 'Adverb',
1337
+ [WordClass.WordClass.ProperNoun]: 'Egennavn',
1338
+ [WordClass.WordClass.Auxiliary]: 'Hjelpeord',
1339
+ [WordClass.WordClass.Complement]: 'Komplement',
1340
+ [WordClass.WordClass.Conjunction]: 'Konjunksjon',
1341
+ [WordClass.WordClass.Coverb]: 'Koverb',
1342
+ [WordClass.WordClass.Determiner]: 'Bestemmerord',
1343
+ [WordClass.WordClass.Interjection]: 'Interjeksjon',
1344
+ [WordClass.WordClass.Quantifier]: 'Kvantor',
1345
+ [WordClass.WordClass.Marker]: 'Markør',
1346
+ [WordClass.WordClass.ModalVerb]: 'Modalverb',
1347
+ [WordClass.WordClass.MeasureWord]: 'Målord',
1348
+ [WordClass.WordClass.Noun]: 'Substantiv',
1349
+ [WordClass.WordClass['Noun-zh']]: 'Nomen',
1350
+ [WordClass.WordClass.NounPhrase]: 'Nominalfrase',
1351
+ [WordClass.WordClass.Onomatopoeia]: 'Onomatopoetikon',
1352
+ [WordClass.WordClass.Particle]: 'Partikkel',
1353
+ [WordClass.WordClass.Demonstrative]: 'Pekeord',
1354
+ [WordClass.WordClass.PersonalPronoun]: 'Personlig Pronomen',
1355
+ [WordClass.WordClass.Preposition]: 'Preposisjon',
1356
+ [WordClass.WordClass.Pronoun]: 'Pronomen',
1357
+ [WordClass.WordClass.QuestionWord]: 'Spørreord',
1358
+ [WordClass.WordClass.LocationWord]: 'Stedsord',
1359
+ [WordClass.WordClass.Suffix]: 'Suffiks',
1360
+ [WordClass.WordClass.Numeral]: 'Tallord',
1361
+ [WordClass.WordClass.TimeWord]: 'Tidsord',
1362
+ [WordClass.WordClass.TimeExpression]: 'Tidsuttrykk',
1363
+ [WordClass.WordClass.StativeVerb]: 'Tilstandsverb',
1364
+ [WordClass.WordClass.SubordinatingConjunction]: 'Subjunksjon',
1365
+ [WordClass.WordClass.ExclamationWord]: 'Utropsord',
1366
+ [WordClass.WordClass.Expression]: 'Uttrykk',
1367
+ [WordClass.WordClass.Verb]: 'Verb',
1368
+ [WordClass.WordClass.VerbComplement]: 'Verb-Komplement',
1369
+ [WordClass.WordClass.VerbObject]: 'Verb-Objekt',
1370
+ },
1326
1371
  };
1327
1372
 
1328
1373
  export default messages;