Skip to content

Commit 4c2b1a9

Browse files
danielkaradachkitsvetomir
authored andcommitted
feat: support for generating locales
1 parent d930451 commit 4c2b1a9

File tree

1,442 files changed

+1716867
-48
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

1,442 files changed

+1716867
-48
lines changed

build-locales.js

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
const likelySubtags = require("cldr-data/supplemental/likelySubtags.json");
2+
const currencyData = require("cldr-data/supplemental/currencyData.json");
3+
const weekData = require("cldr-data/supplemental/weekData.json");
4+
const fs = require('fs');
5+
const path = require('path');
6+
const jsonNameRegex = /"(\w+)":/g;
7+
8+
const LOCALES_PATH = path.join(process.cwd(), 'node_modules', 'cldr-data', 'main');
9+
10+
module.exports = {};
11+
12+
const EXCLUDE = {
13+
root: true
14+
};
15+
16+
const NO_CURRENCY = {
17+
'es-419': true // latin america. not sure what to use here
18+
};
19+
20+
const toJSObject = module.exports.toJSObject = (obj) => {
21+
return JSON.stringify(obj, null, 4).replace(jsonNameRegex, '$1:');
22+
};
23+
24+
const defaultTemplate = (data) => {
25+
return `const data = ${ toJSObject(data) };
26+
export default data;
27+
28+
`};
29+
30+
const localeInfo = (info) => {
31+
return {
32+
name: info.name,
33+
likelySubtags: info.likelySubtags,
34+
identity: info.identity,
35+
territory: info.territory
36+
};
37+
};
38+
39+
const loadLocale = (name, intl) => {
40+
const numbers = require(`cldr-data/main/${ name }/numbers.json`);
41+
const currencies = require(`cldr-data/main/${ name }/currencies.json`);
42+
const calendar = require(`cldr-data/main/${ name }/ca-gregorian.json`);
43+
const timeZoneNames = require(`cldr-data/main/${ name }/timeZoneNames.json`);
44+
const dateFields = require(`cldr-data/main/${ name }/dateFields.json`);
45+
46+
intl.load(numbers, currencies, calendar, timeZoneNames, dateFields);
47+
};
48+
49+
module.exports.buildLocales = (intl, { contentTemplate = defaultTemplate, extension = 'js', destFolder = 'locales' }) => {
50+
destFolder = path.join(process.cwd(), destFolder);
51+
if (!fs.existsSync(destFolder)){
52+
fs.mkdirSync(destFolder);
53+
}
54+
55+
intl.load(likelySubtags, currencyData, weekData);
56+
57+
const data = intl.cldr;
58+
const likelySubtagsData = data.supplemental.likelySubtags;
59+
60+
const locales = fs.readdirSync(LOCALES_PATH);
61+
62+
for (let idx = 0; idx < locales.length; idx++) {
63+
const name = locales[idx];
64+
if (!EXCLUDE[name]) {
65+
const localePath = path.join(destFolder, name);
66+
loadLocale(name, intl);
67+
68+
intl.firstDay(name);
69+
70+
if (!NO_CURRENCY[name]) {
71+
intl.localeCurrency(name);
72+
}
73+
74+
if (!fs.existsSync(localePath)){
75+
fs.mkdirSync(localePath);
76+
}
77+
78+
const localeData = data[name];
79+
const language = name.split('-')[0];
80+
localeData.likelySubtags = {};
81+
82+
if (likelySubtagsData[language]) {
83+
localeData.likelySubtags[language] = likelySubtagsData[language];
84+
}
85+
86+
if (likelySubtagsData[name]) {
87+
localeData.likelySubtags[name] = likelySubtagsData[name];
88+
}
89+
90+
delete localeData.identity.version;
91+
92+
fs.writeFileSync(path.join(localePath, `all.${ extension }`), contentTemplate({
93+
[name]: localeData
94+
}));
95+
96+
const currencies = {
97+
[name]: Object.assign(localeInfo(localeData), {
98+
numbers: {
99+
currencies: localeData.numbers.currencies,
100+
localeCurrency: localeData.numbers.localeCurrency
101+
}
102+
})
103+
};
104+
105+
delete localeData.numbers.currencies;
106+
delete localeData.numbers.localeCurrency;
107+
108+
const numbers = {
109+
[name]: Object.assign(localeInfo(localeData), {
110+
numbers: localeData.numbers
111+
})
112+
};
113+
114+
const calendar = {
115+
[name]: Object.assign(localeInfo(localeData), {
116+
calendar: localeData.calendar,
117+
firstDay: localeData.firstDay
118+
})
119+
};
120+
121+
fs.writeFileSync(path.join(localePath, `currencies.${ extension }`), contentTemplate(currencies));
122+
fs.writeFileSync(path.join(localePath, `numbers.${ extension }`), contentTemplate(numbers));
123+
fs.writeFileSync(path.join(localePath, `calendar.${ extension }`), contentTemplate(calendar));
124+
}
125+
}
126+
};

gulpfile.js

Lines changed: 5 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,7 @@ const likelySubtags = require("cldr-data/supplemental/likelySubtags.json");
88
const currencyData = require("cldr-data/supplemental/currencyData.json");
99
const weekData = require("cldr-data/supplemental/weekData.json");
1010
const fs = require('fs');
11-
const path = require('path');
12-
13-
const LOCALES_PATH = path.join(process.cwd(), 'node_modules', 'cldr-data', 'main');
11+
const { toJSObject, buildLocales } = require("./build-locales.js");
1412

1513
require('@telerik/kendo-package-tasks')(gulp, 'kendo-intl');
1614

@@ -54,59 +52,18 @@ gulp.task("build-default-data", ["build-npm-package"], () => {
5452
}
5553
}
5654
};
57-
fs.writeFileSync('src/cldr/default-data.js', "const defaultData = " + JSON.stringify(defaultData, null, 4) + ";\nexport default defaultData;");
55+
fs.writeFileSync('src/cldr/default-data.js', `const defaultData = ${ toJSObject(defaultData) };\nexport default defaultData;`);
5856
});
5957

60-
const loadLocale = (name, cldr) => {
61-
const numbers = require(`cldr-data/main/${ name }/numbers.json`);
62-
const currencies = require(`cldr-data/main/${ name }/currencies.json`);
63-
const calendar = require(`cldr-data/main/${ name }/ca-gregorian.json`);
64-
const timeZoneNames = require(`cldr-data/main/${ name }/timeZoneNames.json`);
65-
const dateFields = require(`cldr-data/main/${ name }/dateFields.json`);
66-
67-
68-
cldr.load(numbers, currencies, calendar, timeZoneNames, dateFields);
69-
};
70-
7158
gulp.task('clean-locales', (done) => {
7259
exec(`rm -rf locales`, () => {
7360
done();
7461
});
7562
});
7663

77-
const EXCLUDE = {
78-
root: true
79-
};
80-
81-
const NO_CURRENCY = {
82-
'es-419': true // latin america. not sure what to use here
83-
};
84-
8564
gulp.task("build-locales", ["build-npm-package", 'clean-locales'], () => {
86-
const cldr = require("./dist/npm/js/cldr");
87-
cldr.load(likelySubtags, currencyData, weekData);
88-
const data = cldr.cldr;
89-
90-
const locales = fs.readdirSync(LOCALES_PATH);
91-
fs.mkdirSync('./locales');
92-
93-
for (let idx = 0; idx < locales.length; idx++) {
94-
const name = locales[idx];
95-
if (!EXCLUDE[name]) {
96-
console.log(name);
97-
const localePath = path.join('./locales', name);
98-
loadLocale(name, cldr);
99-
100-
cldr.firstDay(name);
101-
if (!NO_CURRENCY[name]) {
102-
cldr.localeCurrency(name);
103-
}
65+
const intl = require('./dist/npm/js/main');
10466

105-
if (!fs.existsSync(localePath)){
106-
fs.mkdirSync(localePath);
107-
}
108-
109-
fs.writeFileSync(path.join(localePath, 'all.js'), `const data = ${ JSON.stringify(data[name], null, 4) };\nexport default data;`);
110-
}
111-
}
67+
buildLocales(intl, { destFolder: './locale-tests/locales' });
11268
});
69+

locale-tests/generated-locales.js

Lines changed: 171 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,171 @@
1+
import { cldr, formatNumber, parseNumber, formatDate, parseDate, firstDay, setData } from '../src/main';
2+
3+
const fs = require('fs');
4+
const path = require('path');
5+
const locales = fs.readdirSync(path.join('./node_modules', 'cldr-data', 'main'));
6+
const defaultDataClone = clone(cldr);
7+
const NO_CURRENCY_LOCALE = 'es-419';
8+
9+
function clone(obj) {
10+
return JSON.parse(JSON.stringify(obj));
11+
}
12+
13+
function clean() {
14+
for (let field in cldr) {
15+
delete cldr[field];
16+
}
17+
Object.assign(cldr, clone(defaultDataClone));
18+
}
19+
20+
describe('generated-locales', () => {
21+
const date = new Date(2000, 0, 1);
22+
const number = 5.55;
23+
const numberString = '5.55';
24+
25+
locales.forEach((locale) => {
26+
if (locale !== 'root') {
27+
describe(`${ locale }`, () => {
28+
29+
describe(`numbers`, () => {
30+
beforeAll(() => {
31+
const numbers = require(`./locales/${ locale }/numbers`).default;
32+
setData(numbers);
33+
});
34+
35+
afterAll(() => {
36+
clean();
37+
});
38+
39+
it('format', () => {
40+
expect(() => {
41+
formatNumber(number, 'n', locale);
42+
}).not.toThrow();
43+
});
44+
45+
it('parse', () => {
46+
expect(() => {
47+
parseNumber(numberString, locale, 'n');
48+
}).not.toThrow();
49+
});
50+
51+
});
52+
53+
if (locale !== NO_CURRENCY_LOCALE) {
54+
55+
describe(`currency`, () => {
56+
beforeAll(() => {
57+
const numbers = require(`./locales/${ locale }/numbers`).default;
58+
const currencies = require(`./locales/${ locale }/currencies`).default;
59+
60+
setData(numbers);
61+
setData(currencies);
62+
63+
});
64+
65+
afterAll(() => {
66+
clean();
67+
});
68+
69+
it('format', () => {
70+
expect(() => {
71+
formatNumber(number, 'c', locale);
72+
}).not.toThrow();
73+
});
74+
75+
it('parse', () => {
76+
expect(() => {
77+
parseNumber(numberString, locale, 'c');
78+
}).not.toThrow();
79+
});
80+
81+
});
82+
}
83+
84+
describe(`calendar`, () => {
85+
beforeAll(() => {
86+
const calendar = require(`./locales/${ locale }/calendar`).default;
87+
setData(calendar);
88+
});
89+
90+
afterAll(() => {
91+
clean();
92+
});
93+
94+
it('format', () => {
95+
expect(() => {
96+
formatDate(date, 'F', locale);
97+
}).not.toThrow();
98+
});
99+
100+
it('parse', () => {
101+
expect(() => {
102+
parseDate(formatDate(date, 'F'), 'F', locale);
103+
}).not.toThrow();
104+
});
105+
106+
it('firstDay', () => {
107+
expect(() => {
108+
firstDay(locale);
109+
}).not.toThrow();
110+
});
111+
});
112+
113+
describe(`all`, () => {
114+
beforeAll(() => {
115+
const all = require(`./locales/${ locale }/all`).default;
116+
setData(all);
117+
});
118+
119+
afterAll(() => {
120+
clean();
121+
});
122+
123+
it('format number', () => {
124+
expect(() => {
125+
formatNumber(number, 'n', locale);
126+
}).not.toThrow();
127+
});
128+
129+
it('parse number', () => {
130+
expect(() => {
131+
parseNumber(numberString, locale, 'n');
132+
}).not.toThrow();
133+
});
134+
if (locale !== NO_CURRENCY_LOCALE) {
135+
136+
it('format currency', () => {
137+
expect(() => {
138+
formatNumber(number, 'c', locale);
139+
}).not.toThrow();
140+
});
141+
142+
it('parse currency', () => {
143+
expect(() => {
144+
parseNumber(numberString, locale, 'c');
145+
}).not.toThrow();
146+
});
147+
}
148+
149+
it('format date', () => {
150+
expect(() => {
151+
formatDate(date, 'F', locale);
152+
}).not.toThrow();
153+
});
154+
155+
it('parse date', () => {
156+
expect(() => {
157+
parseDate(formatDate(date, 'F'), 'F', locale);
158+
}).not.toThrow();
159+
});
160+
161+
it('firstDay', () => {
162+
expect(() => {
163+
firstDay(locale);
164+
}).not.toThrow();
165+
});
166+
});
167+
168+
});
169+
}
170+
});
171+
});

0 commit comments

Comments
 (0)