@eeacms/volto-cca-policy 0.3.25 → 0.3.27
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/CHANGELOG.md +21 -0
- package/package.json +1 -1
- package/src/components/manage/Blocks/MissionSignatoriesProfile/TabSections/GovernanceTab.jsx +8 -64
- package/src/components/manage/Blocks/MissionSignatoriesProfile/TabSections/GovernanceTab.test.jsx +20 -0
- package/src/components/manage/Blocks/MissionSignatoriesProfile/TabSections/PlanningTab.jsx +36 -33
- package/src/components/manage/Blocks/MissionSignatoriesProfile/TabSections/PlanningTab.test.jsx +22 -9
- package/src/components/manage/Blocks/MissionSignatoriesProfile/style.less +17 -5
- package/src/customizations/volto/helpers/LanguageMap/LanguageMap.js +898 -0
- package/src/customizations/volto/helpers/LanguageMap/README.md +1 -0
- package/src/utils.js +34 -11
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,27 @@ All notable changes to this project will be documented in this file. Dates are d
|
|
|
4
4
|
|
|
5
5
|
Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
|
|
6
6
|
|
|
7
|
+
### [0.3.27](https://github.com/eea/volto-cca-policy/compare/0.3.26...0.3.27) - 16 April 2025
|
|
8
|
+
|
|
9
|
+
#### :hammer_and_wrench: Others
|
|
10
|
+
|
|
11
|
+
- Add customization [Tiberiu Ichim - [`81fa0fb`](https://github.com/eea/volto-cca-policy/commit/81fa0fb634c24fd8396cbd1fe0a6fc1a14a2986a)]
|
|
12
|
+
### [0.3.26](https://github.com/eea/volto-cca-policy/compare/0.3.25...0.3.26) - 15 April 2025
|
|
13
|
+
|
|
14
|
+
#### :rocket: New Features
|
|
15
|
+
|
|
16
|
+
- feat: add extractFirstURL to parse first URL from text; update formatTextToHTML - refs #285361 [kreafox - [`a348454`](https://github.com/eea/volto-cca-policy/commit/a348454d52a06c4cbd668a7ffeaebed74d4a6788)]
|
|
17
|
+
|
|
18
|
+
#### :nail_care: Enhancements
|
|
19
|
+
|
|
20
|
+
- change: better link handler, update planning section, update tests - refs #285361 [kreafox - [`547fbb7`](https://github.com/eea/volto-cca-policy/commit/547fbb7ac308c274b94ff961b4abbae629adf93e)]
|
|
21
|
+
- change: update Governance section - refs #285296 [kreafox - [`0a9b924`](https://github.com/eea/volto-cca-policy/commit/0a9b92433239cf8d288885e561d6ecdd1beac6b5)]
|
|
22
|
+
|
|
23
|
+
#### :house: Internal changes
|
|
24
|
+
|
|
25
|
+
- style: Automated code fix [eea-jenkins - [`7396574`](https://github.com/eea/volto-cca-policy/commit/7396574df65205350cedb1e105927cb9d01ce3ae)]
|
|
26
|
+
- style: Automated code fix [eea-jenkins - [`2f6ca50`](https://github.com/eea/volto-cca-policy/commit/2f6ca50ad766066511659ac8dd85a3daceeca1d8)]
|
|
27
|
+
|
|
7
28
|
### [0.3.25](https://github.com/eea/volto-cca-policy/compare/0.3.24...0.3.25) - 14 April 2025
|
|
8
29
|
|
|
9
30
|
#### :bug: Bug Fixes
|
package/package.json
CHANGED
package/src/components/manage/Blocks/MissionSignatoriesProfile/TabSections/GovernanceTab.jsx
CHANGED
|
@@ -4,85 +4,29 @@ import { Callout } from '@eeacms/volto-eea-design-system/ui';
|
|
|
4
4
|
import { HTMLField } from '@eeacms/volto-cca-policy/helpers';
|
|
5
5
|
import { formatTextToHTML } from '@eeacms/volto-cca-policy/utils';
|
|
6
6
|
import AccordionList from './../AccordionList';
|
|
7
|
-
import StatisticsSection from './../StatisticsSection';
|
|
8
7
|
|
|
9
8
|
const GovernanceTab = ({ result }) => {
|
|
10
|
-
const
|
|
11
|
-
{
|
|
12
|
-
value: '460km',
|
|
13
|
-
label: 'Duis non quam et nisi tincidunt',
|
|
14
|
-
},
|
|
15
|
-
{
|
|
16
|
-
value: '51-60%',
|
|
17
|
-
label: 'Vestibulum ante ipsum primis',
|
|
18
|
-
},
|
|
19
|
-
{
|
|
20
|
-
value: '2.431.213',
|
|
21
|
-
label: 'Aliquam erat volutpat',
|
|
22
|
-
},
|
|
23
|
-
{
|
|
24
|
-
value: '2023',
|
|
25
|
-
label: 'Etiam accumsan urna a mauris',
|
|
26
|
-
},
|
|
27
|
-
];
|
|
9
|
+
const { Introduction, Describe_Title, Describe, Provide_Title, Provide } =
|
|
10
|
+
result || {};
|
|
28
11
|
|
|
29
12
|
return (
|
|
30
13
|
<Tab.Pane>
|
|
31
14
|
<h2>Governance</h2>
|
|
32
15
|
<Callout>
|
|
33
|
-
<p>
|
|
34
|
-
Sed at risus vel nulla consequat fermentum. Donec et orci mauris.
|
|
35
|
-
Nullam tempor velit id mi luctus, a scelerisque libero accumsan. In
|
|
36
|
-
hac habitasse platea dictumst. Cras ac nunc nec massa tristique
|
|
37
|
-
fringilla.
|
|
38
|
-
</p>
|
|
16
|
+
<p>{Introduction}</p>
|
|
39
17
|
</Callout>
|
|
40
18
|
|
|
41
|
-
<
|
|
19
|
+
<h3>{Describe_Title}</h3>
|
|
42
20
|
|
|
43
|
-
<
|
|
44
|
-
<AccordionList
|
|
45
|
-
accordions={[
|
|
46
|
-
{
|
|
47
|
-
title: 'Vestibulum ante ipsum primis',
|
|
48
|
-
content: 'No additional details provided.',
|
|
49
|
-
},
|
|
50
|
-
{
|
|
51
|
-
title: 'Etiam accumsan urna a mauris',
|
|
52
|
-
content: 'No additional details provided.',
|
|
53
|
-
},
|
|
54
|
-
]}
|
|
55
|
-
/>
|
|
21
|
+
<HTMLField value={{ data: formatTextToHTML(Describe) }} />
|
|
56
22
|
|
|
57
|
-
<
|
|
58
|
-
|
|
59
|
-
<HTMLField value={{ data: formatTextToHTML(result?.Describe) }} />
|
|
23
|
+
<br />
|
|
60
24
|
|
|
61
25
|
<AccordionList
|
|
62
26
|
accordions={[
|
|
63
27
|
{
|
|
64
|
-
title:
|
|
65
|
-
content: (
|
|
66
|
-
<HTMLField value={{ data: formatTextToHTML(result?.Provide) }} />
|
|
67
|
-
),
|
|
68
|
-
},
|
|
69
|
-
]}
|
|
70
|
-
/>
|
|
71
|
-
|
|
72
|
-
<h3>
|
|
73
|
-
{result?.Signatory} engages with other levels of government regarding
|
|
74
|
-
their:
|
|
75
|
-
</h3>
|
|
76
|
-
|
|
77
|
-
<AccordionList
|
|
78
|
-
accordions={[
|
|
79
|
-
{
|
|
80
|
-
title: 'Vestibulum ante ipsum primis',
|
|
81
|
-
content: 'No additional details provided.',
|
|
82
|
-
},
|
|
83
|
-
{
|
|
84
|
-
title: 'Etiam accumsan urna a mauris',
|
|
85
|
-
content: 'No additional details provided.',
|
|
28
|
+
title: <>{Provide_Title}</>,
|
|
29
|
+
content: <HTMLField value={{ data: formatTextToHTML(Provide) }} />,
|
|
86
30
|
},
|
|
87
31
|
]}
|
|
88
32
|
/>
|
package/src/components/manage/Blocks/MissionSignatoriesProfile/TabSections/GovernanceTab.test.jsx
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { render } from '@testing-library/react';
|
|
3
|
+
import '@testing-library/jest-dom';
|
|
4
|
+
import GovernanceTab from './GovernanceTab';
|
|
5
|
+
|
|
6
|
+
describe('GovernanceTab', () => {
|
|
7
|
+
const mockResult = {
|
|
8
|
+
Describe_Title: 'Opportunities and benefits of climate action',
|
|
9
|
+
Provide_Title: 'Further details and evidence',
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
it('renders the governance tab correctly', () => {
|
|
13
|
+
const { getByText } = render(<GovernanceTab result={mockResult} />);
|
|
14
|
+
|
|
15
|
+
expect(
|
|
16
|
+
getByText('Opportunities and benefits of climate action'),
|
|
17
|
+
).toBeInTheDocument();
|
|
18
|
+
expect(getByText('Further details and evidence')).toBeInTheDocument();
|
|
19
|
+
});
|
|
20
|
+
});
|
|
@@ -11,7 +11,10 @@ import {
|
|
|
11
11
|
} from 'semantic-ui-react';
|
|
12
12
|
import { Callout } from '@eeacms/volto-eea-design-system/ui';
|
|
13
13
|
import { HTMLField } from '@eeacms/volto-cca-policy/helpers';
|
|
14
|
-
import {
|
|
14
|
+
import {
|
|
15
|
+
formatTextToHTML,
|
|
16
|
+
extractPlanNameAndURL,
|
|
17
|
+
} from '@eeacms/volto-cca-policy/utils';
|
|
15
18
|
import AccordionList from './../AccordionList';
|
|
16
19
|
import image from '@eeacms/volto-cca-policy/../theme/assets/images/image-narrow.svg';
|
|
17
20
|
|
|
@@ -51,7 +54,7 @@ const PlanningGoalContent = ({ goal }) => {
|
|
|
51
54
|
<Grid.Column mobile={12} tablet={12} computer={hasHazards ? 6 : 12}>
|
|
52
55
|
{hasComments && (
|
|
53
56
|
<>
|
|
54
|
-
<h5>{goal.Comments_Label}</h5>
|
|
57
|
+
<h5 className="small-label">{goal.Comments_Label}</h5>
|
|
55
58
|
<Segment>
|
|
56
59
|
<HTMLField value={{ data: formatTextToHTML(goal.Comments) }} />
|
|
57
60
|
</Segment>
|
|
@@ -59,7 +62,7 @@ const PlanningGoalContent = ({ goal }) => {
|
|
|
59
62
|
)}
|
|
60
63
|
{hasDescription && (
|
|
61
64
|
<>
|
|
62
|
-
<h5>{goal.Description_Label}</h5>
|
|
65
|
+
<h5 className="small-label">{goal.Description_Label}</h5>
|
|
63
66
|
<Segment>
|
|
64
67
|
<HTMLField
|
|
65
68
|
value={{ data: formatTextToHTML(goal.Description) }}
|
|
@@ -99,21 +102,17 @@ const PlanningTab = ({ result }) => {
|
|
|
99
102
|
)}
|
|
100
103
|
|
|
101
104
|
{sortedGoals.map((goal, index) => {
|
|
102
|
-
const goalNumber = parseInt(
|
|
103
|
-
goal.Adaptation_Goal_Id.replace(/\D/g, ''),
|
|
104
|
-
10,
|
|
105
|
-
);
|
|
106
105
|
return (
|
|
107
106
|
<div key={index} className="section-wrapper">
|
|
108
|
-
<
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
107
|
+
<span className="goal-title-label">{goal?.Title_Label}</span>
|
|
108
|
+
|
|
109
|
+
<HTMLField value={{ data: formatTextToHTML(goal?.Title) }} />
|
|
110
|
+
|
|
112
111
|
<AccordionList
|
|
113
|
-
variation="
|
|
112
|
+
variation="tertiary"
|
|
114
113
|
accordions={[
|
|
115
114
|
{
|
|
116
|
-
title: goal
|
|
115
|
+
title: goal?.More_Details_Label || 'More details',
|
|
117
116
|
content: <PlanningGoalContent goal={goal} />,
|
|
118
117
|
},
|
|
119
118
|
]}
|
|
@@ -123,19 +122,18 @@ const PlanningTab = ({ result }) => {
|
|
|
123
122
|
})}
|
|
124
123
|
|
|
125
124
|
{goalData?.Climate_Action_Title && (
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
</>
|
|
125
|
+
<h2>{goalData.Climate_Action_Title}</h2>
|
|
126
|
+
)}
|
|
127
|
+
|
|
128
|
+
{goalData?.Climate_Action_Abstract && (
|
|
129
|
+
<Callout>
|
|
130
|
+
<p>{goalData.Climate_Action_Abstract}</p>
|
|
131
|
+
</Callout>
|
|
134
132
|
)}
|
|
135
133
|
|
|
136
134
|
{planning_climate_action.map((action, index) => {
|
|
137
135
|
return (
|
|
138
|
-
|
|
136
|
+
<React.Fragment key={index}>
|
|
139
137
|
<br />
|
|
140
138
|
{action?.Sectors_Introduction && (
|
|
141
139
|
<Message>
|
|
@@ -143,7 +141,7 @@ const PlanningTab = ({ result }) => {
|
|
|
143
141
|
</Message>
|
|
144
142
|
)}
|
|
145
143
|
|
|
146
|
-
<ItemsSection items={action
|
|
144
|
+
<ItemsSection items={action?.Sectors} />
|
|
147
145
|
{action?.Description && <p>{action.Description}</p>}
|
|
148
146
|
|
|
149
147
|
{(action?.Approval_Year || action?.End_Year) && (
|
|
@@ -158,21 +156,26 @@ const PlanningTab = ({ result }) => {
|
|
|
158
156
|
{action?.Name_Of_Plan_And_Hyperlink && (
|
|
159
157
|
<p>
|
|
160
158
|
{(() => {
|
|
161
|
-
const
|
|
162
|
-
|
|
163
|
-
planUrl,
|
|
164
|
-
] = action.Name_Of_Plan_And_Hyperlink.split(';').map((part) =>
|
|
165
|
-
part.trim(),
|
|
159
|
+
const { name, url } = extractPlanNameAndURL(
|
|
160
|
+
action.Name_Of_Plan_And_Hyperlink,
|
|
166
161
|
);
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
162
|
+
|
|
163
|
+
return url ? (
|
|
164
|
+
<a href={url} title={name} target="_blank" rel="noreferrer">
|
|
165
|
+
<strong>
|
|
166
|
+
{action.Further_Information_Link_Text}
|
|
167
|
+
{name && ` [${name}]`}
|
|
168
|
+
</strong>
|
|
170
169
|
</a>
|
|
170
|
+
) : (
|
|
171
|
+
<strong>
|
|
172
|
+
{action.Further_Information_Link_Text}
|
|
173
|
+
{name && ` [${name}]`}
|
|
174
|
+
</strong>
|
|
171
175
|
);
|
|
172
176
|
})()}
|
|
173
177
|
</p>
|
|
174
178
|
)}
|
|
175
|
-
|
|
176
179
|
{action?.Attachment && (
|
|
177
180
|
<p>
|
|
178
181
|
<a href={action.Attachment}>
|
|
@@ -180,7 +183,7 @@ const PlanningTab = ({ result }) => {
|
|
|
180
183
|
</a>
|
|
181
184
|
</p>
|
|
182
185
|
)}
|
|
183
|
-
|
|
186
|
+
</React.Fragment>
|
|
184
187
|
);
|
|
185
188
|
})}
|
|
186
189
|
</Tab.Pane>
|
package/src/components/manage/Blocks/MissionSignatoriesProfile/TabSections/PlanningTab.test.jsx
CHANGED
|
@@ -3,15 +3,18 @@ import { render } from '@testing-library/react';
|
|
|
3
3
|
import '@testing-library/jest-dom';
|
|
4
4
|
import PlanningTab from './PlanningTab';
|
|
5
5
|
|
|
6
|
-
// Mock child components
|
|
7
|
-
jest.mock('./../AccordionList', () => () => <div>Mock AccordionList</div>);
|
|
8
6
|
jest.mock('@eeacms/volto-cca-policy/helpers', () => ({
|
|
9
7
|
HTMLField: ({ value }) => (
|
|
10
8
|
<div dangerouslySetInnerHTML={{ __html: value.data }} />
|
|
11
9
|
),
|
|
12
10
|
}));
|
|
11
|
+
|
|
13
12
|
jest.mock('@eeacms/volto-cca-policy/utils', () => ({
|
|
14
13
|
formatTextToHTML: (text) => text,
|
|
14
|
+
extractPlanNameAndURL: (str) => ({
|
|
15
|
+
name: 'Plan Example',
|
|
16
|
+
url: 'https://plan-link.com',
|
|
17
|
+
}),
|
|
15
18
|
}));
|
|
16
19
|
|
|
17
20
|
describe('PlanningTab', () => {
|
|
@@ -23,6 +26,7 @@ describe('PlanningTab', () => {
|
|
|
23
26
|
{
|
|
24
27
|
Adaptation_Goal_Id: 'AG-001',
|
|
25
28
|
Title: 'Goal Title 1',
|
|
29
|
+
Title_Label: 'Goal 1 Label',
|
|
26
30
|
More_Details_Label: 'Details',
|
|
27
31
|
Climate_Hazards: ['Heat', 'Flood'],
|
|
28
32
|
Climate_Hazards_Addressed_Label: 'Hazards',
|
|
@@ -36,6 +40,7 @@ describe('PlanningTab', () => {
|
|
|
36
40
|
{
|
|
37
41
|
Adaptation_Goal_Id: 'AG-002',
|
|
38
42
|
Title: 'Goal Title 2',
|
|
43
|
+
Title_Label: 'Goal 2 Label',
|
|
39
44
|
More_Details_Label: 'Details',
|
|
40
45
|
Climate_Hazards: ['Drought', 'Storm'],
|
|
41
46
|
Climate_Hazards_Addressed_Label: 'Hazards',
|
|
@@ -65,9 +70,7 @@ describe('PlanningTab', () => {
|
|
|
65
70
|
};
|
|
66
71
|
|
|
67
72
|
it('renders planning tab with basic data', () => {
|
|
68
|
-
const { getByText
|
|
69
|
-
<PlanningTab result={mockResult} />,
|
|
70
|
-
);
|
|
73
|
+
const { getByText } = render(<PlanningTab result={mockResult} />);
|
|
71
74
|
|
|
72
75
|
expect(getByText('Planning Title')).toBeInTheDocument();
|
|
73
76
|
expect(getByText('Abstract info')).toBeInTheDocument();
|
|
@@ -75,8 +78,6 @@ describe('PlanningTab', () => {
|
|
|
75
78
|
expect(getByText('Goal Title 1')).toBeInTheDocument();
|
|
76
79
|
expect(getByText('Goal Title 2')).toBeInTheDocument();
|
|
77
80
|
|
|
78
|
-
expect(getAllByText('Mock AccordionList').length).toBe(2);
|
|
79
|
-
|
|
80
81
|
expect(getByText('Action Title')).toBeInTheDocument();
|
|
81
82
|
expect(getByText('Intro to sectors')).toBeInTheDocument();
|
|
82
83
|
expect(getByText('Sector description')).toBeInTheDocument();
|
|
@@ -85,8 +86,6 @@ describe('PlanningTab', () => {
|
|
|
85
86
|
expect(getByText(/2023/)).toBeInTheDocument();
|
|
86
87
|
expect(getByText(/End Year:/)).toBeInTheDocument();
|
|
87
88
|
expect(getByText(/2030/)).toBeInTheDocument();
|
|
88
|
-
|
|
89
|
-
expect(getByText('Explore Plan')).toBeInTheDocument();
|
|
90
89
|
});
|
|
91
90
|
|
|
92
91
|
it('renders ItemsSection if there are sectors', () => {
|
|
@@ -94,4 +93,18 @@ describe('PlanningTab', () => {
|
|
|
94
93
|
|
|
95
94
|
expect(getByText(/Agriculture/)).toBeInTheDocument();
|
|
96
95
|
});
|
|
96
|
+
|
|
97
|
+
it('renders image in ItemsSection', () => {
|
|
98
|
+
const { container } = render(<PlanningTab result={mockResult} />);
|
|
99
|
+
const images = container.querySelectorAll('img');
|
|
100
|
+
expect(images.length).toBeGreaterThan(0);
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
it('renders hyperlink with extracted name and URL', () => {
|
|
104
|
+
const { getByText } = render(<PlanningTab result={mockResult} />);
|
|
105
|
+
|
|
106
|
+
const link = getByText(/More Info \[Plan Example\]/);
|
|
107
|
+
expect(link).toBeInTheDocument();
|
|
108
|
+
expect(link.closest('a')).toHaveAttribute('href', 'https://plan-link.com');
|
|
109
|
+
});
|
|
97
110
|
});
|
|
@@ -24,12 +24,24 @@
|
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
.section-wrapper {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
27
|
+
margin: 1em 0;
|
|
28
|
+
|
|
29
|
+
.goal-title-label {
|
|
30
|
+
display: inline-block;
|
|
31
|
+
padding: 0.3em 0.5em;
|
|
32
|
+
margin: 1em 0;
|
|
33
|
+
background-color: #dbe7f4;
|
|
34
|
+
font-size: 14px;
|
|
35
|
+
font-weight: bold;
|
|
36
|
+
text-transform: uppercase;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.ui.accordion {
|
|
40
|
+
margin-top: 1em;
|
|
41
|
+
}
|
|
30
42
|
|
|
31
|
-
.
|
|
32
|
-
|
|
43
|
+
.small-label {
|
|
44
|
+
font-size: 1em;
|
|
33
45
|
}
|
|
34
46
|
}
|
|
35
47
|
|
|
@@ -0,0 +1,898 @@
|
|
|
1
|
+
const langmap = new Proxy(
|
|
2
|
+
{
|
|
3
|
+
ach: {
|
|
4
|
+
nativeName: 'Lwo',
|
|
5
|
+
englishName: 'Acholi',
|
|
6
|
+
},
|
|
7
|
+
ady: {
|
|
8
|
+
nativeName: 'Адыгэбзэ',
|
|
9
|
+
englishName: 'Adyghe',
|
|
10
|
+
},
|
|
11
|
+
af: {
|
|
12
|
+
nativeName: 'Afrikaans',
|
|
13
|
+
englishName: 'Afrikaans',
|
|
14
|
+
},
|
|
15
|
+
'af-NA': {
|
|
16
|
+
nativeName: 'Afrikaans (Namibia)',
|
|
17
|
+
englishName: 'Afrikaans (Namibia)',
|
|
18
|
+
},
|
|
19
|
+
'af-ZA': {
|
|
20
|
+
nativeName: 'Afrikaans (South Africa)',
|
|
21
|
+
englishName: 'Afrikaans (South Africa)',
|
|
22
|
+
},
|
|
23
|
+
ak: {
|
|
24
|
+
nativeName: 'Tɕɥi',
|
|
25
|
+
englishName: 'Akan',
|
|
26
|
+
},
|
|
27
|
+
ar: {
|
|
28
|
+
nativeName: 'العربية',
|
|
29
|
+
englishName: 'Arabic',
|
|
30
|
+
},
|
|
31
|
+
'ar-AR': {
|
|
32
|
+
nativeName: 'العربية',
|
|
33
|
+
englishName: 'Arabic',
|
|
34
|
+
},
|
|
35
|
+
'ar-MA': {
|
|
36
|
+
nativeName: 'العربية',
|
|
37
|
+
englishName: 'Arabic (Morocco)',
|
|
38
|
+
},
|
|
39
|
+
'ar-SA': {
|
|
40
|
+
nativeName: 'العربية (السعودية)',
|
|
41
|
+
englishName: 'Arabic (Saudi Arabia)',
|
|
42
|
+
},
|
|
43
|
+
'ay-BO': {
|
|
44
|
+
nativeName: 'Aymar aru',
|
|
45
|
+
englishName: 'Aymara',
|
|
46
|
+
},
|
|
47
|
+
az: {
|
|
48
|
+
nativeName: 'Azərbaycan dili',
|
|
49
|
+
englishName: 'Azerbaijani',
|
|
50
|
+
},
|
|
51
|
+
'az-AZ': {
|
|
52
|
+
nativeName: 'Azərbaycan dili',
|
|
53
|
+
englishName: 'Azerbaijani',
|
|
54
|
+
},
|
|
55
|
+
'be-BY': {
|
|
56
|
+
nativeName: 'Беларуская',
|
|
57
|
+
englishName: 'Belarusian',
|
|
58
|
+
},
|
|
59
|
+
bg: {
|
|
60
|
+
nativeName: 'Български',
|
|
61
|
+
englishName: 'Bulgarian',
|
|
62
|
+
},
|
|
63
|
+
'bg-BG': {
|
|
64
|
+
nativeName: 'Български',
|
|
65
|
+
englishName: 'Bulgarian',
|
|
66
|
+
},
|
|
67
|
+
bn: {
|
|
68
|
+
nativeName: 'বাংলা',
|
|
69
|
+
englishName: 'Bengali',
|
|
70
|
+
},
|
|
71
|
+
'bn-IN': {
|
|
72
|
+
nativeName: 'বাংলা (ভারত)',
|
|
73
|
+
englishName: 'Bengali (India)',
|
|
74
|
+
},
|
|
75
|
+
'bn-BD': {
|
|
76
|
+
nativeName: 'বাংলা(বাংলাদেশ)',
|
|
77
|
+
englishName: 'Bengali (Bangladesh)',
|
|
78
|
+
},
|
|
79
|
+
br: {
|
|
80
|
+
nativeName: 'Brezhoneg',
|
|
81
|
+
englishName: 'Breton',
|
|
82
|
+
},
|
|
83
|
+
bs: {
|
|
84
|
+
nativeName: 'Bosanski',
|
|
85
|
+
englishName: 'Bosnian',
|
|
86
|
+
},
|
|
87
|
+
'bs-BA': {
|
|
88
|
+
nativeName: 'Bosanski',
|
|
89
|
+
englishName: 'Bosnian',
|
|
90
|
+
},
|
|
91
|
+
ca: {
|
|
92
|
+
nativeName: 'Català',
|
|
93
|
+
englishName: 'Catalan',
|
|
94
|
+
},
|
|
95
|
+
'ca-ES': {
|
|
96
|
+
nativeName: 'Català',
|
|
97
|
+
englishName: 'Catalan',
|
|
98
|
+
},
|
|
99
|
+
cak: {
|
|
100
|
+
nativeName: 'Maya Kaqchikel',
|
|
101
|
+
englishName: 'Kaqchikel',
|
|
102
|
+
},
|
|
103
|
+
'ck-US': {
|
|
104
|
+
nativeName: 'ᏣᎳᎩ (tsalagi)',
|
|
105
|
+
englishName: 'Cherokee',
|
|
106
|
+
},
|
|
107
|
+
cs: {
|
|
108
|
+
nativeName: 'Čeština',
|
|
109
|
+
englishName: 'Czech',
|
|
110
|
+
},
|
|
111
|
+
'cs-CZ': {
|
|
112
|
+
nativeName: 'Čeština',
|
|
113
|
+
englishName: 'Czech',
|
|
114
|
+
},
|
|
115
|
+
cy: {
|
|
116
|
+
nativeName: 'Cymraeg',
|
|
117
|
+
englishName: 'Welsh',
|
|
118
|
+
},
|
|
119
|
+
'cy-GB': {
|
|
120
|
+
nativeName: 'Cymraeg',
|
|
121
|
+
englishName: 'Welsh',
|
|
122
|
+
},
|
|
123
|
+
da: {
|
|
124
|
+
nativeName: 'Dansk',
|
|
125
|
+
englishName: 'Danish',
|
|
126
|
+
},
|
|
127
|
+
'da-DK': {
|
|
128
|
+
nativeName: 'Dansk',
|
|
129
|
+
englishName: 'Danish',
|
|
130
|
+
},
|
|
131
|
+
de: {
|
|
132
|
+
nativeName: 'Deutsch',
|
|
133
|
+
englishName: 'German',
|
|
134
|
+
},
|
|
135
|
+
'de-AT': {
|
|
136
|
+
nativeName: 'Deutsch (Österreich)',
|
|
137
|
+
englishName: 'German (Austria)',
|
|
138
|
+
},
|
|
139
|
+
'de-DE': {
|
|
140
|
+
nativeName: 'Deutsch (Deutschland)',
|
|
141
|
+
englishName: 'German (Germany)',
|
|
142
|
+
},
|
|
143
|
+
'de-CH': {
|
|
144
|
+
nativeName: 'Deutsch (Schweiz)',
|
|
145
|
+
englishName: 'German (Switzerland)',
|
|
146
|
+
},
|
|
147
|
+
dsb: {
|
|
148
|
+
nativeName: 'Dolnoserbšćina',
|
|
149
|
+
englishName: 'Lower Sorbian',
|
|
150
|
+
},
|
|
151
|
+
el: {
|
|
152
|
+
nativeName: 'Ελληνικά',
|
|
153
|
+
englishName: 'Greek',
|
|
154
|
+
},
|
|
155
|
+
'el-GR': {
|
|
156
|
+
nativeName: 'Ελληνικά',
|
|
157
|
+
englishName: 'Greek (Greece)',
|
|
158
|
+
},
|
|
159
|
+
en: {
|
|
160
|
+
nativeName: 'English',
|
|
161
|
+
englishName: 'English',
|
|
162
|
+
},
|
|
163
|
+
'en-GB': {
|
|
164
|
+
nativeName: 'English (UK)',
|
|
165
|
+
englishName: 'English (UK)',
|
|
166
|
+
},
|
|
167
|
+
'en-AU': {
|
|
168
|
+
nativeName: 'English (Australia)',
|
|
169
|
+
englishName: 'English (Australia)',
|
|
170
|
+
},
|
|
171
|
+
'en-CA': {
|
|
172
|
+
nativeName: 'English (Canada)',
|
|
173
|
+
englishName: 'English (Canada)',
|
|
174
|
+
},
|
|
175
|
+
'en-IE': {
|
|
176
|
+
nativeName: 'English (Ireland)',
|
|
177
|
+
englishName: 'English (Ireland)',
|
|
178
|
+
},
|
|
179
|
+
'en-IN': {
|
|
180
|
+
nativeName: 'English (India)',
|
|
181
|
+
englishName: 'English (India)',
|
|
182
|
+
},
|
|
183
|
+
'en-PI': {
|
|
184
|
+
nativeName: 'English (Pirate)',
|
|
185
|
+
englishName: 'English (Pirate)',
|
|
186
|
+
},
|
|
187
|
+
'en-UD': {
|
|
188
|
+
nativeName: 'English (Upside Down)',
|
|
189
|
+
englishName: 'English (Upside Down)',
|
|
190
|
+
},
|
|
191
|
+
'en-US': {
|
|
192
|
+
nativeName: 'English (US)',
|
|
193
|
+
englishName: 'English (US)',
|
|
194
|
+
},
|
|
195
|
+
'en-ZA': {
|
|
196
|
+
nativeName: 'English (South Africa)',
|
|
197
|
+
englishName: 'English (South Africa)',
|
|
198
|
+
},
|
|
199
|
+
'en@pirate': {
|
|
200
|
+
nativeName: 'English (Pirate)',
|
|
201
|
+
englishName: 'English (Pirate)',
|
|
202
|
+
},
|
|
203
|
+
eo: {
|
|
204
|
+
nativeName: 'Esperanto',
|
|
205
|
+
englishName: 'Esperanto',
|
|
206
|
+
},
|
|
207
|
+
'eo-EO': {
|
|
208
|
+
nativeName: 'Esperanto',
|
|
209
|
+
englishName: 'Esperanto',
|
|
210
|
+
},
|
|
211
|
+
es: {
|
|
212
|
+
nativeName: 'Español',
|
|
213
|
+
englishName: 'Spanish',
|
|
214
|
+
},
|
|
215
|
+
'es-AR': {
|
|
216
|
+
nativeName: 'Español (Argentine)',
|
|
217
|
+
englishName: 'Spanish (Argentina)',
|
|
218
|
+
},
|
|
219
|
+
'es-419': {
|
|
220
|
+
nativeName: 'Español (Latinoamérica)',
|
|
221
|
+
englishName: 'Spanish (Latin America)',
|
|
222
|
+
},
|
|
223
|
+
'es-CL': {
|
|
224
|
+
nativeName: 'Español (Chile)',
|
|
225
|
+
englishName: 'Spanish (Chile)',
|
|
226
|
+
},
|
|
227
|
+
'es-CO': {
|
|
228
|
+
nativeName: 'Español (Colombia)',
|
|
229
|
+
englishName: 'Spanish (Colombia)',
|
|
230
|
+
},
|
|
231
|
+
'es-EC': {
|
|
232
|
+
nativeName: 'Español (Ecuador)',
|
|
233
|
+
englishName: 'Spanish (Ecuador)',
|
|
234
|
+
},
|
|
235
|
+
'es-ES': {
|
|
236
|
+
nativeName: 'Español (España)',
|
|
237
|
+
englishName: 'Spanish (Spain)',
|
|
238
|
+
},
|
|
239
|
+
'es-LA': {
|
|
240
|
+
nativeName: 'Español (Latinoamérica)',
|
|
241
|
+
englishName: 'Spanish (Latin America)',
|
|
242
|
+
},
|
|
243
|
+
'es-NI': {
|
|
244
|
+
nativeName: 'Español (Nicaragua)',
|
|
245
|
+
englishName: 'Spanish (Nicaragua)',
|
|
246
|
+
},
|
|
247
|
+
'es-MX': {
|
|
248
|
+
nativeName: 'Español (México)',
|
|
249
|
+
englishName: 'Spanish (Mexico)',
|
|
250
|
+
},
|
|
251
|
+
'es-US': {
|
|
252
|
+
nativeName: 'Español (Estados Unidos)',
|
|
253
|
+
englishName: 'Spanish (United States)',
|
|
254
|
+
},
|
|
255
|
+
'es-VE': {
|
|
256
|
+
nativeName: 'Español (Venezuela)',
|
|
257
|
+
englishName: 'Spanish (Venezuela)',
|
|
258
|
+
},
|
|
259
|
+
et: {
|
|
260
|
+
nativeName: 'eesti keel',
|
|
261
|
+
englishName: 'Estonian',
|
|
262
|
+
},
|
|
263
|
+
'et-EE': {
|
|
264
|
+
nativeName: 'Eesti (Estonia)',
|
|
265
|
+
englishName: 'Estonian (Estonia)',
|
|
266
|
+
},
|
|
267
|
+
eu: {
|
|
268
|
+
nativeName: 'Euskara',
|
|
269
|
+
englishName: 'Basque',
|
|
270
|
+
},
|
|
271
|
+
'eu-ES': {
|
|
272
|
+
nativeName: 'Euskara',
|
|
273
|
+
englishName: 'Basque',
|
|
274
|
+
},
|
|
275
|
+
fa: {
|
|
276
|
+
nativeName: 'فارسی',
|
|
277
|
+
englishName: 'Persian',
|
|
278
|
+
},
|
|
279
|
+
'fa-IR': {
|
|
280
|
+
nativeName: 'فارسی',
|
|
281
|
+
englishName: 'Persian',
|
|
282
|
+
},
|
|
283
|
+
'fb-LT': {
|
|
284
|
+
nativeName: 'Leet Speak',
|
|
285
|
+
englishName: 'Leet',
|
|
286
|
+
},
|
|
287
|
+
ff: {
|
|
288
|
+
nativeName: 'Fulah',
|
|
289
|
+
englishName: 'Fulah',
|
|
290
|
+
},
|
|
291
|
+
fi: {
|
|
292
|
+
nativeName: 'Suomi',
|
|
293
|
+
englishName: 'Finnish',
|
|
294
|
+
},
|
|
295
|
+
'fi-FI': {
|
|
296
|
+
nativeName: 'Suomi',
|
|
297
|
+
englishName: 'Finnish',
|
|
298
|
+
},
|
|
299
|
+
'fo-FO': {
|
|
300
|
+
nativeName: 'Føroyskt',
|
|
301
|
+
englishName: 'Faroese',
|
|
302
|
+
},
|
|
303
|
+
fr: {
|
|
304
|
+
nativeName: 'Français',
|
|
305
|
+
englishName: 'French',
|
|
306
|
+
},
|
|
307
|
+
'fr-CA': {
|
|
308
|
+
nativeName: 'Français (Canada)',
|
|
309
|
+
englishName: 'French (Canada)',
|
|
310
|
+
},
|
|
311
|
+
'fr-FR': {
|
|
312
|
+
nativeName: 'Français (France)',
|
|
313
|
+
englishName: 'French (France)',
|
|
314
|
+
},
|
|
315
|
+
'fr-BE': {
|
|
316
|
+
nativeName: 'Français (Belgique)',
|
|
317
|
+
englishName: 'French (Belgium)',
|
|
318
|
+
},
|
|
319
|
+
'fr-CH': {
|
|
320
|
+
nativeName: 'Français (Suisse)',
|
|
321
|
+
englishName: 'French (Switzerland)',
|
|
322
|
+
},
|
|
323
|
+
'fy-NL': {
|
|
324
|
+
nativeName: 'Frysk',
|
|
325
|
+
englishName: 'Frisian (West)',
|
|
326
|
+
},
|
|
327
|
+
ga: {
|
|
328
|
+
nativeName: 'Gaeilge',
|
|
329
|
+
englishName: 'Irish',
|
|
330
|
+
},
|
|
331
|
+
'ga-IE': {
|
|
332
|
+
nativeName: 'Gaeilge',
|
|
333
|
+
englishName: 'Irish',
|
|
334
|
+
},
|
|
335
|
+
gd: {
|
|
336
|
+
nativeName: 'Gàidhlig',
|
|
337
|
+
englishName: 'Gaelic',
|
|
338
|
+
},
|
|
339
|
+
gl: {
|
|
340
|
+
nativeName: 'Galego',
|
|
341
|
+
englishName: 'Galician',
|
|
342
|
+
},
|
|
343
|
+
'gl-ES': {
|
|
344
|
+
nativeName: 'Galego',
|
|
345
|
+
englishName: 'Galician',
|
|
346
|
+
},
|
|
347
|
+
'gn-PY': {
|
|
348
|
+
nativeName: "Avañe'ẽ",
|
|
349
|
+
englishName: 'Guarani',
|
|
350
|
+
},
|
|
351
|
+
'gu-IN': {
|
|
352
|
+
nativeName: 'ગુજરાતી',
|
|
353
|
+
englishName: 'Gujarati',
|
|
354
|
+
},
|
|
355
|
+
gv: {
|
|
356
|
+
nativeName: 'Gaelg',
|
|
357
|
+
englishName: 'Manx',
|
|
358
|
+
},
|
|
359
|
+
'gx-GR': {
|
|
360
|
+
nativeName: 'Ἑλληνική ἀρχαία',
|
|
361
|
+
englishName: 'Classical Greek',
|
|
362
|
+
},
|
|
363
|
+
he: {
|
|
364
|
+
nativeName: 'עברית',
|
|
365
|
+
englishName: 'Hebrew',
|
|
366
|
+
},
|
|
367
|
+
'he-IL': {
|
|
368
|
+
nativeName: 'עברית',
|
|
369
|
+
englishName: 'Hebrew',
|
|
370
|
+
},
|
|
371
|
+
hi: {
|
|
372
|
+
nativeName: 'हिन्दी',
|
|
373
|
+
englishName: 'Hindi',
|
|
374
|
+
},
|
|
375
|
+
'hi-IN': {
|
|
376
|
+
nativeName: 'हिन्दी',
|
|
377
|
+
englishName: 'Hindi',
|
|
378
|
+
},
|
|
379
|
+
hr: {
|
|
380
|
+
nativeName: 'Hrvatski',
|
|
381
|
+
englishName: 'Croatian',
|
|
382
|
+
},
|
|
383
|
+
'hr-HR': {
|
|
384
|
+
nativeName: 'Hrvatski',
|
|
385
|
+
englishName: 'Croatian',
|
|
386
|
+
},
|
|
387
|
+
hsb: {
|
|
388
|
+
nativeName: 'Hornjoserbšćina',
|
|
389
|
+
englishName: 'Upper Sorbian',
|
|
390
|
+
},
|
|
391
|
+
ht: {
|
|
392
|
+
nativeName: 'Kreyòl',
|
|
393
|
+
englishName: 'Haitian Creole',
|
|
394
|
+
},
|
|
395
|
+
hu: {
|
|
396
|
+
nativeName: 'Magyar',
|
|
397
|
+
englishName: 'Hungarian',
|
|
398
|
+
},
|
|
399
|
+
'hu-HU': {
|
|
400
|
+
nativeName: 'Magyar',
|
|
401
|
+
englishName: 'Hungarian',
|
|
402
|
+
},
|
|
403
|
+
'hy-AM': {
|
|
404
|
+
nativeName: 'Հայերեն',
|
|
405
|
+
englishName: 'Armenian',
|
|
406
|
+
},
|
|
407
|
+
id: {
|
|
408
|
+
nativeName: 'Bahasa Indonesia',
|
|
409
|
+
englishName: 'Indonesian',
|
|
410
|
+
},
|
|
411
|
+
'id-ID': {
|
|
412
|
+
nativeName: 'Bahasa Indonesia',
|
|
413
|
+
englishName: 'Indonesian',
|
|
414
|
+
},
|
|
415
|
+
is: {
|
|
416
|
+
nativeName: 'Íslenska',
|
|
417
|
+
englishName: 'Icelandic',
|
|
418
|
+
},
|
|
419
|
+
'is-IS': {
|
|
420
|
+
nativeName: 'Íslenska (Iceland)',
|
|
421
|
+
englishName: 'Icelandic (Iceland)',
|
|
422
|
+
},
|
|
423
|
+
it: {
|
|
424
|
+
nativeName: 'Italiano',
|
|
425
|
+
englishName: 'Italian',
|
|
426
|
+
},
|
|
427
|
+
'it-IT': {
|
|
428
|
+
nativeName: 'Italiano',
|
|
429
|
+
englishName: 'Italian',
|
|
430
|
+
},
|
|
431
|
+
ja: {
|
|
432
|
+
nativeName: '日本語',
|
|
433
|
+
englishName: 'Japanese',
|
|
434
|
+
},
|
|
435
|
+
'ja-JP': {
|
|
436
|
+
nativeName: '日本語 (日本)',
|
|
437
|
+
englishName: 'Japanese (Japan)',
|
|
438
|
+
},
|
|
439
|
+
'jv-ID': {
|
|
440
|
+
nativeName: 'Basa Jawa',
|
|
441
|
+
englishName: 'Javanese',
|
|
442
|
+
},
|
|
443
|
+
'ka-GE': {
|
|
444
|
+
nativeName: 'ქართული',
|
|
445
|
+
englishName: 'Georgian',
|
|
446
|
+
},
|
|
447
|
+
'kk-KZ': {
|
|
448
|
+
nativeName: 'Қазақша',
|
|
449
|
+
englishName: 'Kazakh',
|
|
450
|
+
},
|
|
451
|
+
km: {
|
|
452
|
+
nativeName: 'ភាសាខ្មែរ',
|
|
453
|
+
englishName: 'Khmer',
|
|
454
|
+
},
|
|
455
|
+
'km-KH': {
|
|
456
|
+
nativeName: 'ភាសាខ្មែរ',
|
|
457
|
+
englishName: 'Khmer',
|
|
458
|
+
},
|
|
459
|
+
kab: {
|
|
460
|
+
nativeName: 'Taqbaylit',
|
|
461
|
+
englishName: 'Kabyle',
|
|
462
|
+
},
|
|
463
|
+
kn: {
|
|
464
|
+
nativeName: 'ಕನ್ನಡ',
|
|
465
|
+
englishName: 'Kannada',
|
|
466
|
+
},
|
|
467
|
+
'kn-IN': {
|
|
468
|
+
nativeName: 'ಕನ್ನಡ (India)',
|
|
469
|
+
englishName: 'Kannada (India)',
|
|
470
|
+
},
|
|
471
|
+
ko: {
|
|
472
|
+
nativeName: '한국어',
|
|
473
|
+
englishName: 'Korean',
|
|
474
|
+
},
|
|
475
|
+
'ko-KR': {
|
|
476
|
+
nativeName: '한국어 (한국)',
|
|
477
|
+
englishName: 'Korean (Korea)',
|
|
478
|
+
},
|
|
479
|
+
'ku-TR': {
|
|
480
|
+
nativeName: 'Kurdî',
|
|
481
|
+
englishName: 'Kurdish',
|
|
482
|
+
},
|
|
483
|
+
kw: {
|
|
484
|
+
nativeName: 'Kernewek',
|
|
485
|
+
englishName: 'Cornish',
|
|
486
|
+
},
|
|
487
|
+
la: {
|
|
488
|
+
nativeName: 'Latin',
|
|
489
|
+
englishName: 'Latin',
|
|
490
|
+
},
|
|
491
|
+
'la-VA': {
|
|
492
|
+
nativeName: 'Latin',
|
|
493
|
+
englishName: 'Latin',
|
|
494
|
+
},
|
|
495
|
+
lb: {
|
|
496
|
+
nativeName: 'Lëtzebuergesch',
|
|
497
|
+
englishName: 'Luxembourgish',
|
|
498
|
+
},
|
|
499
|
+
'li-NL': {
|
|
500
|
+
nativeName: 'Lèmbörgs',
|
|
501
|
+
englishName: 'Limburgish',
|
|
502
|
+
},
|
|
503
|
+
lt: {
|
|
504
|
+
nativeName: 'Lietuvių',
|
|
505
|
+
englishName: 'Lithuanian',
|
|
506
|
+
},
|
|
507
|
+
'lt-LT': {
|
|
508
|
+
nativeName: 'Lietuvių',
|
|
509
|
+
englishName: 'Lithuanian',
|
|
510
|
+
},
|
|
511
|
+
lv: {
|
|
512
|
+
nativeName: 'Latviešu',
|
|
513
|
+
englishName: 'Latvian',
|
|
514
|
+
},
|
|
515
|
+
'lv-LV': {
|
|
516
|
+
nativeName: 'Latviešu',
|
|
517
|
+
englishName: 'Latvian',
|
|
518
|
+
},
|
|
519
|
+
mai: {
|
|
520
|
+
nativeName: 'मैथिली, মৈথিলী',
|
|
521
|
+
englishName: 'Maithili',
|
|
522
|
+
},
|
|
523
|
+
'mg-MG': {
|
|
524
|
+
nativeName: 'Malagasy',
|
|
525
|
+
englishName: 'Malagasy',
|
|
526
|
+
},
|
|
527
|
+
mk: {
|
|
528
|
+
nativeName: 'Македонски',
|
|
529
|
+
englishName: 'Macedonian',
|
|
530
|
+
},
|
|
531
|
+
'mk-MK': {
|
|
532
|
+
nativeName: 'Македонски (Македонски)',
|
|
533
|
+
englishName: 'Macedonian (Macedonian)',
|
|
534
|
+
},
|
|
535
|
+
ml: {
|
|
536
|
+
nativeName: 'മലയാളം',
|
|
537
|
+
englishName: 'Malayalam',
|
|
538
|
+
},
|
|
539
|
+
'ml-IN': {
|
|
540
|
+
nativeName: 'മലയാളം',
|
|
541
|
+
englishName: 'Malayalam',
|
|
542
|
+
},
|
|
543
|
+
'mn-MN': {
|
|
544
|
+
nativeName: 'Монгол',
|
|
545
|
+
englishName: 'Mongolian',
|
|
546
|
+
},
|
|
547
|
+
mr: {
|
|
548
|
+
nativeName: 'मराठी',
|
|
549
|
+
englishName: 'Marathi',
|
|
550
|
+
},
|
|
551
|
+
'mr-IN': {
|
|
552
|
+
nativeName: 'मराठी',
|
|
553
|
+
englishName: 'Marathi',
|
|
554
|
+
},
|
|
555
|
+
ms: {
|
|
556
|
+
nativeName: 'Bahasa Melayu',
|
|
557
|
+
englishName: 'Malay',
|
|
558
|
+
},
|
|
559
|
+
'ms-MY': {
|
|
560
|
+
nativeName: 'Bahasa Melayu',
|
|
561
|
+
englishName: 'Malay',
|
|
562
|
+
},
|
|
563
|
+
mt: {
|
|
564
|
+
nativeName: 'Malti',
|
|
565
|
+
englishName: 'Maltese',
|
|
566
|
+
},
|
|
567
|
+
'mt-MT': {
|
|
568
|
+
nativeName: 'Malti',
|
|
569
|
+
englishName: 'Maltese',
|
|
570
|
+
},
|
|
571
|
+
my: {
|
|
572
|
+
nativeName: 'ဗမာစကာ',
|
|
573
|
+
englishName: 'Burmese',
|
|
574
|
+
},
|
|
575
|
+
no: {
|
|
576
|
+
nativeName: 'Norsk',
|
|
577
|
+
englishName: 'Norwegian',
|
|
578
|
+
},
|
|
579
|
+
nb: {
|
|
580
|
+
nativeName: 'Norsk (bokmål)',
|
|
581
|
+
englishName: 'Norwegian (bokmal)',
|
|
582
|
+
},
|
|
583
|
+
'nb-NO': {
|
|
584
|
+
nativeName: 'Norsk (bokmål)',
|
|
585
|
+
englishName: 'Norwegian (bokmal)',
|
|
586
|
+
},
|
|
587
|
+
ne: {
|
|
588
|
+
nativeName: 'नेपाली',
|
|
589
|
+
englishName: 'Nepali',
|
|
590
|
+
},
|
|
591
|
+
'ne-NP': {
|
|
592
|
+
nativeName: 'नेपाली',
|
|
593
|
+
englishName: 'Nepali',
|
|
594
|
+
},
|
|
595
|
+
nl: {
|
|
596
|
+
nativeName: 'Nederlands',
|
|
597
|
+
englishName: 'Dutch',
|
|
598
|
+
},
|
|
599
|
+
'nl-BE': {
|
|
600
|
+
nativeName: 'Nederlands (België)',
|
|
601
|
+
englishName: 'Dutch (Belgium)',
|
|
602
|
+
},
|
|
603
|
+
'nl-NL': {
|
|
604
|
+
nativeName: 'Nederlands (Nederland)',
|
|
605
|
+
englishName: 'Dutch (Netherlands)',
|
|
606
|
+
},
|
|
607
|
+
'nn-NO': {
|
|
608
|
+
nativeName: 'Norsk (nynorsk)',
|
|
609
|
+
englishName: 'Norwegian (nynorsk)',
|
|
610
|
+
},
|
|
611
|
+
nn: {
|
|
612
|
+
nativeName: 'Norsk (nynorsk)',
|
|
613
|
+
englishName: 'Norwegian (nynorsk)',
|
|
614
|
+
},
|
|
615
|
+
oc: {
|
|
616
|
+
nativeName: 'Occitan',
|
|
617
|
+
englishName: 'Occitan',
|
|
618
|
+
},
|
|
619
|
+
'or-IN': {
|
|
620
|
+
nativeName: 'ଓଡ଼ିଆ',
|
|
621
|
+
englishName: 'Oriya',
|
|
622
|
+
},
|
|
623
|
+
pa: {
|
|
624
|
+
nativeName: 'ਪੰਜਾਬੀ',
|
|
625
|
+
englishName: 'Punjabi',
|
|
626
|
+
},
|
|
627
|
+
'pa-IN': {
|
|
628
|
+
nativeName: 'ਪੰਜਾਬੀ (ਭਾਰਤ ਨੂੰ)',
|
|
629
|
+
englishName: 'Punjabi (India)',
|
|
630
|
+
},
|
|
631
|
+
pl: {
|
|
632
|
+
nativeName: 'Polski',
|
|
633
|
+
englishName: 'Polish',
|
|
634
|
+
},
|
|
635
|
+
'pl-PL': {
|
|
636
|
+
nativeName: 'Polski',
|
|
637
|
+
englishName: 'Polish',
|
|
638
|
+
},
|
|
639
|
+
'ps-AF': {
|
|
640
|
+
nativeName: 'پښتو',
|
|
641
|
+
englishName: 'Pashto',
|
|
642
|
+
},
|
|
643
|
+
pt: {
|
|
644
|
+
nativeName: 'Português',
|
|
645
|
+
englishName: 'Portuguese',
|
|
646
|
+
},
|
|
647
|
+
'pt-BR': {
|
|
648
|
+
nativeName: 'Português (Brasil)',
|
|
649
|
+
englishName: 'Portuguese (Brazil)',
|
|
650
|
+
},
|
|
651
|
+
'pt-PT': {
|
|
652
|
+
nativeName: 'Português (Portugal)',
|
|
653
|
+
englishName: 'Portuguese (Portugal)',
|
|
654
|
+
},
|
|
655
|
+
'qu-PE': {
|
|
656
|
+
nativeName: 'Qhichwa',
|
|
657
|
+
englishName: 'Quechua',
|
|
658
|
+
},
|
|
659
|
+
'rm-CH': {
|
|
660
|
+
nativeName: 'Rumantsch',
|
|
661
|
+
englishName: 'Romansh',
|
|
662
|
+
},
|
|
663
|
+
ro: {
|
|
664
|
+
nativeName: 'Română',
|
|
665
|
+
englishName: 'Romanian',
|
|
666
|
+
},
|
|
667
|
+
'ro-RO': {
|
|
668
|
+
nativeName: 'Română',
|
|
669
|
+
englishName: 'Romanian',
|
|
670
|
+
},
|
|
671
|
+
ru: {
|
|
672
|
+
nativeName: 'Русский',
|
|
673
|
+
englishName: 'Russian',
|
|
674
|
+
},
|
|
675
|
+
'ru-RU': {
|
|
676
|
+
nativeName: 'Русский',
|
|
677
|
+
englishName: 'Russian',
|
|
678
|
+
},
|
|
679
|
+
'sa-IN': {
|
|
680
|
+
nativeName: 'संस्कृतम्',
|
|
681
|
+
englishName: 'Sanskrit',
|
|
682
|
+
},
|
|
683
|
+
'se-NO': {
|
|
684
|
+
nativeName: 'Davvisámegiella',
|
|
685
|
+
englishName: 'Northern Sámi',
|
|
686
|
+
},
|
|
687
|
+
sh: {
|
|
688
|
+
nativeName: 'српскохрватски',
|
|
689
|
+
englishName: 'Serbo-Croatian',
|
|
690
|
+
},
|
|
691
|
+
'si-LK': {
|
|
692
|
+
nativeName: 'පළාත',
|
|
693
|
+
englishName: 'Sinhala (Sri Lanka)',
|
|
694
|
+
},
|
|
695
|
+
sk: {
|
|
696
|
+
nativeName: 'Slovenčina',
|
|
697
|
+
englishName: 'Slovak',
|
|
698
|
+
},
|
|
699
|
+
'sk-SK': {
|
|
700
|
+
nativeName: 'Slovenčina (Slovakia)',
|
|
701
|
+
englishName: 'Slovak (Slovakia)',
|
|
702
|
+
},
|
|
703
|
+
sl: {
|
|
704
|
+
nativeName: 'Slovenščina',
|
|
705
|
+
englishName: 'Slovenian',
|
|
706
|
+
},
|
|
707
|
+
'sl-SI': {
|
|
708
|
+
nativeName: 'Slovenščina',
|
|
709
|
+
englishName: 'Slovenian',
|
|
710
|
+
},
|
|
711
|
+
'so-SO': {
|
|
712
|
+
nativeName: 'Soomaaliga',
|
|
713
|
+
englishName: 'Somali',
|
|
714
|
+
},
|
|
715
|
+
sq: {
|
|
716
|
+
nativeName: 'Shqip',
|
|
717
|
+
englishName: 'Albanian',
|
|
718
|
+
},
|
|
719
|
+
'sq-AL': {
|
|
720
|
+
nativeName: 'Shqip',
|
|
721
|
+
englishName: 'Albanian',
|
|
722
|
+
},
|
|
723
|
+
sr: {
|
|
724
|
+
nativeName: 'Српски',
|
|
725
|
+
englishName: 'Serbian',
|
|
726
|
+
},
|
|
727
|
+
'sr-RS': {
|
|
728
|
+
nativeName: 'Српски (Serbia)',
|
|
729
|
+
englishName: 'Serbian (Serbia)',
|
|
730
|
+
},
|
|
731
|
+
su: {
|
|
732
|
+
nativeName: 'Basa Sunda',
|
|
733
|
+
englishName: 'Sundanese',
|
|
734
|
+
},
|
|
735
|
+
sv: {
|
|
736
|
+
nativeName: 'Svenska',
|
|
737
|
+
englishName: 'Swedish',
|
|
738
|
+
},
|
|
739
|
+
'sv-SE': {
|
|
740
|
+
nativeName: 'Svenska',
|
|
741
|
+
englishName: 'Swedish',
|
|
742
|
+
},
|
|
743
|
+
sw: {
|
|
744
|
+
nativeName: 'Kiswahili',
|
|
745
|
+
englishName: 'Swahili',
|
|
746
|
+
},
|
|
747
|
+
'sw-KE': {
|
|
748
|
+
nativeName: 'Kiswahili',
|
|
749
|
+
englishName: 'Swahili (Kenya)',
|
|
750
|
+
},
|
|
751
|
+
ta: {
|
|
752
|
+
nativeName: 'தமிழ்',
|
|
753
|
+
englishName: 'Tamil',
|
|
754
|
+
},
|
|
755
|
+
'ta-IN': {
|
|
756
|
+
nativeName: 'தமிழ்',
|
|
757
|
+
englishName: 'Tamil',
|
|
758
|
+
},
|
|
759
|
+
te: {
|
|
760
|
+
nativeName: 'తెలుగు',
|
|
761
|
+
englishName: 'Telugu',
|
|
762
|
+
},
|
|
763
|
+
'te-IN': {
|
|
764
|
+
nativeName: 'తెలుగు',
|
|
765
|
+
englishName: 'Telugu',
|
|
766
|
+
},
|
|
767
|
+
tg: {
|
|
768
|
+
nativeName: 'забо́ни тоҷикӣ́',
|
|
769
|
+
englishName: 'Tajik',
|
|
770
|
+
},
|
|
771
|
+
'tg-TJ': {
|
|
772
|
+
nativeName: 'тоҷикӣ',
|
|
773
|
+
englishName: 'Tajik',
|
|
774
|
+
},
|
|
775
|
+
th: {
|
|
776
|
+
nativeName: 'ภาษาไทย',
|
|
777
|
+
englishName: 'Thai',
|
|
778
|
+
},
|
|
779
|
+
'th-TH': {
|
|
780
|
+
nativeName: 'ภาษาไทย (ประเทศไทย)',
|
|
781
|
+
englishName: 'Thai (Thailand)',
|
|
782
|
+
},
|
|
783
|
+
tl: {
|
|
784
|
+
nativeName: 'Filipino',
|
|
785
|
+
englishName: 'Filipino',
|
|
786
|
+
},
|
|
787
|
+
'tl-PH': {
|
|
788
|
+
nativeName: 'Filipino',
|
|
789
|
+
englishName: 'Filipino',
|
|
790
|
+
},
|
|
791
|
+
tlh: {
|
|
792
|
+
nativeName: 'tlhIngan-Hol',
|
|
793
|
+
englishName: 'Klingon',
|
|
794
|
+
},
|
|
795
|
+
tr: {
|
|
796
|
+
nativeName: 'Türkçe',
|
|
797
|
+
englishName: 'Turkish',
|
|
798
|
+
},
|
|
799
|
+
'tr-TR': {
|
|
800
|
+
nativeName: 'Türkçe',
|
|
801
|
+
englishName: 'Turkish',
|
|
802
|
+
},
|
|
803
|
+
'tt-RU': {
|
|
804
|
+
nativeName: 'татарча',
|
|
805
|
+
englishName: 'Tatar',
|
|
806
|
+
},
|
|
807
|
+
uk: {
|
|
808
|
+
nativeName: 'Українська',
|
|
809
|
+
englishName: 'Ukrainian',
|
|
810
|
+
},
|
|
811
|
+
'uk-UA': {
|
|
812
|
+
nativeName: 'Українська',
|
|
813
|
+
englishName: 'Ukrainian',
|
|
814
|
+
},
|
|
815
|
+
ur: {
|
|
816
|
+
nativeName: 'اردو',
|
|
817
|
+
englishName: 'Urdu',
|
|
818
|
+
},
|
|
819
|
+
'ur-PK': {
|
|
820
|
+
nativeName: 'اردو',
|
|
821
|
+
englishName: 'Urdu',
|
|
822
|
+
},
|
|
823
|
+
uz: {
|
|
824
|
+
nativeName: "O'zbek",
|
|
825
|
+
englishName: 'Uzbek',
|
|
826
|
+
},
|
|
827
|
+
'uz-UZ': {
|
|
828
|
+
nativeName: "O'zbek",
|
|
829
|
+
englishName: 'Uzbek',
|
|
830
|
+
},
|
|
831
|
+
vi: {
|
|
832
|
+
nativeName: 'Tiếng Việt',
|
|
833
|
+
englishName: 'Vietnamese',
|
|
834
|
+
},
|
|
835
|
+
'vi-VN': {
|
|
836
|
+
nativeName: 'Tiếng Việt',
|
|
837
|
+
englishName: 'Vietnamese',
|
|
838
|
+
},
|
|
839
|
+
'xh-ZA': {
|
|
840
|
+
nativeName: 'isiXhosa',
|
|
841
|
+
englishName: 'Xhosa',
|
|
842
|
+
},
|
|
843
|
+
yi: {
|
|
844
|
+
nativeName: 'ייִדיש',
|
|
845
|
+
englishName: 'Yiddish',
|
|
846
|
+
},
|
|
847
|
+
'yi-DE': {
|
|
848
|
+
nativeName: 'ייִדיש (German)',
|
|
849
|
+
englishName: 'Yiddish (German)',
|
|
850
|
+
},
|
|
851
|
+
zh: {
|
|
852
|
+
nativeName: '中文',
|
|
853
|
+
englishName: 'Chinese',
|
|
854
|
+
},
|
|
855
|
+
'zh-Hans': {
|
|
856
|
+
nativeName: '中文简体',
|
|
857
|
+
englishName: 'Chinese Simplified',
|
|
858
|
+
},
|
|
859
|
+
'zh-Hant': {
|
|
860
|
+
nativeName: '中文繁體',
|
|
861
|
+
englishName: 'Chinese Traditional',
|
|
862
|
+
},
|
|
863
|
+
'zh-CN': {
|
|
864
|
+
nativeName: '中文(中国)',
|
|
865
|
+
englishName: 'Chinese Simplified (China)',
|
|
866
|
+
},
|
|
867
|
+
'zh-HK': {
|
|
868
|
+
nativeName: '中文(香港)',
|
|
869
|
+
englishName: 'Chinese Traditional (Hong Kong)',
|
|
870
|
+
},
|
|
871
|
+
'zh-SG': {
|
|
872
|
+
nativeName: '中文(新加坡)',
|
|
873
|
+
englishName: 'Chinese Simplified (Singapore)',
|
|
874
|
+
},
|
|
875
|
+
'zh-TW': {
|
|
876
|
+
nativeName: '中文(台灣)',
|
|
877
|
+
englishName: 'Chinese Traditional (Taiwan)',
|
|
878
|
+
},
|
|
879
|
+
'zu-ZA': {
|
|
880
|
+
nativeName: 'isiZulu',
|
|
881
|
+
englishName: 'Zulu',
|
|
882
|
+
},
|
|
883
|
+
},
|
|
884
|
+
{
|
|
885
|
+
get: function (obj, lang) {
|
|
886
|
+
if (lang.includes('-')) {
|
|
887
|
+
lang = lang.split('-');
|
|
888
|
+
lang = `${lang[0]}-${lang[1].toUpperCase()}`;
|
|
889
|
+
} else if (lang.includes('_')) {
|
|
890
|
+
lang = lang.split('_');
|
|
891
|
+
lang = `${lang[0]}-${lang[1].toUpperCase()}`;
|
|
892
|
+
}
|
|
893
|
+
return obj[lang];
|
|
894
|
+
},
|
|
895
|
+
},
|
|
896
|
+
);
|
|
897
|
+
|
|
898
|
+
export default langmap;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
customized to add nn, in addition to nn-NO
|
package/src/utils.js
CHANGED
|
@@ -81,18 +81,41 @@ export const filterBlocks = (content, blockTypes = []) => {
|
|
|
81
81
|
export const formatTextToHTML = (text) => {
|
|
82
82
|
if (!text) return '';
|
|
83
83
|
|
|
84
|
-
let formattedText = text
|
|
84
|
+
let formattedText = text
|
|
85
|
+
.replace(/\\\\/g, '\\') // unescape backslashes
|
|
86
|
+
.replace(/\\'/g, "'") // unescape single quotes
|
|
87
|
+
.replace(/\\"/g, '"') // unescape double quotes
|
|
88
|
+
.replace(/\\t\\n/g, '') // handle \t\n
|
|
89
|
+
.replace(/\\n\\n/g, '</p><p>') // double line break = paragraph
|
|
90
|
+
.replace(/\\no\s*/g, '<br />• ') // list-like "o " to bullet point
|
|
91
|
+
.replace(/\\n/g, '<br />'); // single line break
|
|
85
92
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
formattedText = formattedText.replace(/\\'/g, "'"); // unescape single quotes
|
|
89
|
-
formattedText = formattedText.replace(/\\"/g, '"'); // unescape double quotes
|
|
90
|
-
|
|
91
|
-
// Replace \\n\\n with </p><p> for paragraph separation
|
|
92
|
-
formattedText = formattedText.replace(/\\n\\n/g, '</p><p>');
|
|
93
|
+
return `<p>${formattedText}</p>`;
|
|
94
|
+
};
|
|
93
95
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
+
export const extractPlanNameAndURL = (text) => {
|
|
97
|
+
if (!text) return { name: '', url: '' };
|
|
98
|
+
|
|
99
|
+
// Match URL inside parentheses
|
|
100
|
+
const parenthesisMatch = text.match(/\((https?:\/\/[^\s)]+)\)/);
|
|
101
|
+
// Match first direct URL not inside parentheses
|
|
102
|
+
const directMatch = text.match(/https?:\/\/[^\s,;)]+/);
|
|
103
|
+
const url = parenthesisMatch?.[1] || directMatch?.[0] || '';
|
|
104
|
+
|
|
105
|
+
let name = text;
|
|
106
|
+
|
|
107
|
+
if (url) {
|
|
108
|
+
// Remove URL and any punctuation before it
|
|
109
|
+
name = name
|
|
110
|
+
.replace(`(${url})`, '')
|
|
111
|
+
.replace(url, '')
|
|
112
|
+
.replace(/[-–;,:\s]+$/, '')
|
|
113
|
+
.replace(/[-–;,:\s]+$/, '')
|
|
114
|
+
.trim();
|
|
115
|
+
}
|
|
96
116
|
|
|
97
|
-
return
|
|
117
|
+
return {
|
|
118
|
+
name: name,
|
|
119
|
+
url,
|
|
120
|
+
};
|
|
98
121
|
};
|