Skip to content

Commit 8a2cd2c

Browse files
committed
langParser.js: Generate language list dynamically
This adds ``langParser.js`` to generate the available language list automatically from available translation files. This also adds a npm script for generating before webpack bundles. Modifies .gitignore so that generated ``languages.js`` file is ignored. Adds tests. Renames ``nb_NO.json`` to ``nb-NO.json`` to comply with RFC standards. Closes: #125
1 parent 8960f21 commit 8a2cd2c

File tree

8 files changed

+90
-51
lines changed

8 files changed

+90
-51
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@ out
33
yarn.lock
44
.DS_Store
55
**.orig
6+
src/js/languages.js

lib/langParser.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
const fs = require('fs')
2+
const iso639 = require('iso-639-1')
3+
4+
fs.readdir(`${__dirname}/../static/i18n`, (err, items) => {
5+
const availableLanguages = {
6+
Languages: {},
7+
}
8+
items.forEach(function(value) {
9+
const langName = value.substring(0, value.indexOf('.'))
10+
const normalizedName = langName.split('-')[0]
11+
const nativeName = iso639.getNativeName(normalizedName)
12+
availableLanguages['Languages'][nativeName] = langName
13+
})
14+
fs.writeFileSync(
15+
`${__dirname}/../src/js/languages.js`,
16+
'export default ' +
17+
JSON.stringify(availableLanguages) +
18+
' // eslint-disable-line'
19+
)
20+
})

package-lock.json

Lines changed: 21 additions & 44 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,11 @@
99
"generate": "node ./lib/generate.js",
1010
"gather": "node ./lib/gather.js",
1111
"main": "node ./lib/main.js",
12+
"languages": "node ./lib/langParser.js",
1213
"clean": "rm -rf out/*",
1314
"dev": "webpack-dev-server --progress",
1415
"bundle": "NODE_ENV=production webpack --progress",
15-
"build": "npm run bundle && npm run gather && npm run scrape && npm run planet && npm run main && npm run generate",
16+
"build": "npm run languages && npm run bundle && npm run gather && npm run scrape && npm run planet && npm run main && npm run generate",
1617
"build:clean": "npm run clean && npm run build",
1718
"test": "jest"
1819
},
@@ -27,6 +28,7 @@
2728
"find-rss": "^1.6.4",
2829
"glob": "^7.1.2",
2930
"graphql-client": "^2.0.0",
31+
"iso-639-1": "^2.0.3",
3032
"jquery": "^3.2.1",
3133
"jquery.i18n": "git+https://github.com/wikimedia/jquery.i18n.git",
3234
"json2yaml": "^1.1.0",

src/js/locale.js

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import init from './app'
2+
import Languages from './languages'
23

34
var browserLocale
45

@@ -26,12 +27,7 @@ function updateTranslation(localex) {
2627
}
2728

2829
$(window).on('load', function() {
29-
var localeOptions = {
30-
English: 'en',
31-
Español: 'es',
32-
Polski: 'pl',
33-
'Norwegian Bokmål': 'nb_NO',
34-
}
30+
var localeOptions = Languages['Languages']
3531

3632
var locList = $('#lang-select')
3733
$.each(localeOptions, function(key, value) {
File renamed without changes.

tests/__data__/test-languages.js

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tests/lib/langParser.test.js

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/**
2+
* langParser Library Test
3+
*/
4+
5+
const fs = require('fs')
6+
const iso639 = require('iso-639-1')
7+
8+
const testLangs = ['en', 'es', 'ja-AK', 'fr']
9+
const expectedLangs = ['English', 'Español', '日本語', 'Français']
10+
11+
describe('lib.langParser', () => {
12+
it('should get nativeName for each language', () => {
13+
const resultLangs = []
14+
testLangs.forEach(function(value) {
15+
const normalizedName = value.split('-')[0]
16+
const nativeName = iso639.getNativeName(normalizedName)
17+
resultLangs.push(nativeName)
18+
})
19+
20+
expect(resultLangs).toEqual(expectedLangs)
21+
})
22+
23+
it('should create a file given language codes', () => {
24+
const langDict = {
25+
Languages: {},
26+
}
27+
testLangs.forEach(function(value) {
28+
const normalizedName = value.split('-')[0]
29+
const nativeName = iso639.getNativeName(normalizedName)
30+
langDict['Languages'][nativeName] = value
31+
})
32+
33+
const expectedData = fs
34+
.readFileSync(`${__dirname}/../__data__/test-languages.js`)
35+
.toString()
36+
37+
const output =
38+
'export default ' + JSON.stringify(langDict) + ' // eslint-disable-line'
39+
40+
expect(output).toEqual(expectedData)
41+
})
42+
})

0 commit comments

Comments
 (0)