Skip to content

Commit 249efc1

Browse files
committed
Create localization bundle
Localization files will now be distributed in three ways: - included in the library itself (dist/knockout-validation-with-locales.js) - bundle with all localization files (dist/locales.js) - individual files in localization directory (localization/*.js) Closes #541
1 parent 0926b11 commit 249efc1

38 files changed

Lines changed: 3962 additions & 960 deletions

dist/knockout.validation-with-locales.js

Lines changed: 2236 additions & 0 deletions
Large diffs are not rendered by default.

dist/knockout.validation-with-locales.min.js

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

dist/knockout.validation-with-locales.min.js.map

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

dist/locales.js

Lines changed: 930 additions & 0 deletions
Large diffs are not rendered by default.

dist/locales.min.js

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

dist/locales.min.js.map

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

gruntfile.js

Lines changed: 77 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,54 @@
22
/*jshint node:true*/
33
module.exports = function (grunt) {
44

5+
6+
function processFileSource(contents, filePath, embedLocales) {
7+
if (embedLocales && filePath.indexOf('localization/') === 0) {
8+
var re = /function\(factory\) \{[^]*}(?=\(function\(kv\) \{)/gm;
9+
var replacement = 'function(factory) {\n factory(ko.validation);\n}';
10+
11+
if (!re.test(contents)) {
12+
grunt.log.warn('Localization file cannot be embedded: ', filePath);
13+
return '/*Failed to embed localization file: ' + filePath + '*/\n';
14+
}
15+
else {
16+
contents = contents.replace(re, replacement);
17+
}
18+
}
19+
return contents
20+
.replace(/ko\.validation\./g, 'kv.')
21+
.replace(/ko\.utils\.arrayForEach/g, 'forEach')
22+
.replace(/ko\.utils\.extend/g, 'extend')
23+
.replace(/ko\.utils\.unwrapObservable/g, 'unwrap')
24+
.replace(/ko\.utils\./g, 'koUtils.');
25+
}
26+
27+
function getSourceFiles(includeLocales) {
28+
var items = [
29+
"<%= meta.banner %>",
30+
"src/ko.validation.start.frag",
31+
"src/configuration.js",
32+
"src/utils.js",
33+
"src/api.js",
34+
"src/rules.js",
35+
"src/bindingHandlers.js",
36+
"src/extenders.js",
37+
"src/localization.js",
38+
"src/ko.extensions.js"
39+
];
40+
if (includeLocales) {
41+
items.push(["localization/*.js", "!localization/en-US.js"]);
42+
}
43+
items.push("src/ko.validation.end.frag");
44+
return items;
45+
}
46+
47+
548
// Project configuration.
649
grunt.initConfig({
750
pkg: grunt.file.readJSON("package.json"),
851
meta: {
52+
banner_l10n: "/* Localization for Knockout Validation <%= pkg.version %> */",
953
banner: "/*=============================================================================\n" +
1054
" Author: Eric M. Barnard - @ericmbarnard \n" +
1155
" License: MIT (http://opensource.org/licenses/mit-license.php) \n" +
@@ -18,30 +62,30 @@ module.exports = function (grunt) {
1862
options: {
1963
separator: ";",
2064
banner: "<%= meta.banner %>",
21-
process: function (src) {
22-
return src
23-
.replace(/ko\.validation\./g, 'kv.')
24-
.replace(/ko\.utils\.arrayForEach/g, 'forEach')
25-
.replace(/ko\.utils\.extend/g, 'extend')
26-
.replace(/ko\.utils\.unwrapObservable/g, 'unwrap')
27-
.replace(/ko\.utils\./g, 'koUtils.');
65+
process: function(contents, filePath) {
66+
return processFileSource(contents, filePath, false);
2867
}
2968
},
3069
dist: {
31-
src: [
32-
"<%= meta.banner %>",
33-
"src/ko.validation.start.frag",
34-
"src/configuration.js",
35-
"src/utils.js",
36-
"src/api.js",
37-
"src/rules.js",
38-
"src/bindingHandlers.js",
39-
"src/extenders.js",
40-
"src/localization.js",
41-
"src/ko.extensions.js",
42-
"src/ko.validation.end.frag"
43-
],
70+
src: getSourceFiles(false),
4471
dest: "dist/<%= pkg.name %>.js"
72+
},
73+
dist_locales: {
74+
options: {
75+
process: function(contents, filePath) {
76+
return processFileSource(contents, filePath, true);
77+
}
78+
},
79+
src: getSourceFiles(true),
80+
dest: "dist/<%= pkg.name %>-with-locales.js"
81+
},
82+
locales: {
83+
options: {
84+
process: null,
85+
banner: "<%= meta.banner_l10n %>\n\n"
86+
},
87+
src: ['localization/*.js', '!localization/en-US.js'],
88+
dest: "dist/locales.js"
4589
}
4690
},
4791
uglify: {
@@ -54,6 +98,19 @@ module.exports = function (grunt) {
5498
files: {
5599
"dist/<%= pkg.name %>.min.js": ["<%= concat.dist.dest %>"]
56100
}
101+
},
102+
dist_locales: {
103+
files: {
104+
"dist/<%= pkg.name %>-with-locales.min.js": ["<%= concat.dist_locales.dest %>"]
105+
}
106+
},
107+
locales: {
108+
options: {
109+
banner: "<%= meta.banner_l10n %>"
110+
},
111+
files: {
112+
"dist/locales.min.js": ["<%= concat.locales.dest %>"]
113+
}
57114
}
58115
},
59116
qunit: {

localization/ar-JO.js

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,15 @@
22
* Localization file for Arabic - Jordan (ar-JO)
33
*/
44
(function(factory) {
5-
// Module systems magic dance.
6-
/*global require,ko.validation,define,module*/
7-
if (typeof require === 'function' && typeof exports === 'object' && typeof module === 'object') {
8-
// CommonJS or Node
9-
module.exports = factory(require('../'));
10-
} else if (typeof define === 'function' && define['amd']) {
11-
// AMD anonymous module with hard-coded dependency on 'knockout.validation'
12-
define(['knockout.validation'], factory);
13-
} else {
14-
// <script> tag: use the global `ko.validation` object
15-
factory(ko.validation);
16-
}
5+
/*global ko,require,define,module*/
6+
if (typeof require === 'function' && typeof exports === 'object' && typeof module === 'object') {
7+
module.exports = factory(require('../'));
8+
} else if (typeof define === 'function' && define.amd) {
9+
define(['knockout.validation'], factory);
10+
} else {
11+
factory(ko.validation);
12+
}
1713
}(function(kv) {
18-
if (!kv || typeof kv.defineLocale !== 'function') {
19-
throw new Error('Knockout-Validation is required, please ensure it is loaded before this localization file');
20-
}
2114
return kv.defineLocale('ar-JO', {
2215
required: 'مطلوب.',
2316
min: 'أدخل قيمة اكبر من {0}.',

localization/bg-BG.js

Lines changed: 26 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -2,38 +2,31 @@
22
* Localization file for Bulgarian - Bulgaria (bg-BG)
33
*/
44
(function(factory) {
5-
// Module systems magic dance.
6-
/*global require,ko.validation,define,module*/
7-
if (typeof require === 'function' && typeof exports === 'object' && typeof module === 'object') {
8-
// CommonJS or Node
9-
module.exports = factory(require('../'));
10-
} else if (typeof define === 'function' && define['amd']) {
11-
// AMD anonymous module with hard-coded dependency on 'knockout.validation'
12-
define(['knockout.validation'], factory);
13-
} else {
14-
// <script> tag: use the global `ko.validation` object
15-
factory(ko.validation);
16-
}
5+
/*global ko,require,define,module*/
6+
if (typeof require === 'function' && typeof exports === 'object' && typeof module === 'object') {
7+
module.exports = factory(require('../'));
8+
} else if (typeof define === 'function' && define.amd) {
9+
define(['knockout.validation'], factory);
10+
} else {
11+
factory(ko.validation);
12+
}
1713
}(function(kv) {
18-
if (!kv || typeof kv.defineLocale !== 'function') {
19-
throw new Error('Knockout-Validation is required, please ensure it is loaded before this localization file');
20-
}
21-
return kv.defineLocale('bg-BG', {
22-
required: 'Моля, въведете стойност.',
23-
min: 'Моля, въведете стойност по-голяма или равна на {0}.',
24-
max: 'Моля, въведете стойност по-малка или равна на {0}.',
25-
minLength: 'Моля, въведете поне {0} символа.',
26-
maxLength: 'Моля, въведете по-малко от {0} символа.',
27-
pattern: 'Моля, проверете тази стойност.',
28-
step: 'Стойността трябва да се увеличава с {0}.',
29-
email: 'Това не е валиден e-mail адрес.',
30-
date: 'Моля, въведете валидна дата.',
31-
dateISO: 'Моля, въведете валидна дата.',
32-
number: 'Моля, въведете число.',
33-
digit: 'Моля, въведете цифра.',
34-
phoneUS: 'Моля, въведете валиден телефонен номер.',
35-
equal: 'Стойностите трябва да са равни.',
36-
notEqual: 'Моля, изберете различна стойност.',
37-
unique: 'Моля, убедете се, че стойността е уникална.'
38-
});
14+
return kv.defineLocale('bg-BG', {
15+
required: 'Моля, въведете стойност.',
16+
min: 'Моля, въведете стойност по-голяма или равна на {0}.',
17+
max: 'Моля, въведете стойност по-малка или равна на {0}.',
18+
minLength: 'Моля, въведете поне {0} символа.',
19+
maxLength: 'Моля, въведете по-малко от {0} символа.',
20+
pattern: 'Моля, проверете тази стойност.',
21+
step: 'Стойността трябва да се увеличава с {0}.',
22+
email: 'Това не е валиден e-mail адрес.',
23+
date: 'Моля, въведете валидна дата.',
24+
dateISO: 'Моля, въведете валидна дата.',
25+
number: 'Моля, въведете число.',
26+
digit: 'Моля, въведете цифра.',
27+
phoneUS: 'Моля, въведете валиден телефонен номер.',
28+
equal: 'Стойностите трябва да са равни.',
29+
notEqual: 'Моля, изберете различна стойност.',
30+
unique: 'Моля, убедете се, че стойността е уникална.'
31+
});
3932
}));

0 commit comments

Comments
 (0)