Skip to content

Commit a8d7d4f

Browse files
committed
added: localization
1 parent 6672009 commit a8d7d4f

15 files changed

Lines changed: 183 additions & 48 deletions

File tree

changes.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ Framework loads modules, packages, models, definitions, controllers
7575
- added: response.throw431([problem])
7676
- added: response.throw500([error])
7777
- added: response.throw501([problem])
78-
78+
- added: view supports localization
7979

8080
- updated: (IMPORTANT) framework doesn't remove subdirectories with files in temporary directory
8181
- updated: (IMPORTANT) all models are loaded after is the framework loaded

index.js

Lines changed: 31 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ function Framework() {
123123

124124
this.id = null;
125125
this.version = 1700;
126-
this.version_header = '1.7.0 (build: 23)';
126+
this.version_header = '1.7.0 (build: 24)';
127127
this.versionNode = parseInt(process.version.replace('v', '').replace(/\./g, ''), 10);
128128

129129
this.config = {
@@ -5337,24 +5337,28 @@ Framework.prototype.hash = function(type, value, salt) {
53375337
*/
53385338
Framework.prototype.resource = function(name, key) {
53395339

5340-
if (key === undefined || name.length === 0) {
5340+
if (!key) {
53415341
key = name;
5342-
name = 'default';
5342+
name = null;
53435343
}
53445344

5345+
if (!name)
5346+
name = 'default';
5347+
53455348
var self = this;
53465349
var res = self.resources[name];
53475350

53485351
if (res !== undefined)
53495352
return res[key] || '';
53505353

5351-
var fileName = utils.combine(self.config['directory-resources'], name + '.resource');
5354+
var filename = utils.combine(self.config['directory-resources'], name + '.resource');
53525355

5353-
if (!fs.existsSync(fileName))
5356+
if (!fs.existsSync(filename))
53545357
return '';
53555358

5356-
var obj = fs.readFileSync(fileName).toString(ENCODING).parseConfig();
5359+
var obj = fs.readFileSync(filename).toString(ENCODING).parseConfig();
53575360
self.resources[name] = obj;
5361+
53585362
return obj[key] || '';
53595363
};
53605364

@@ -7512,10 +7516,6 @@ Controller.prototype = {
75127516
return this.req.files;
75137517
},
75147518

7515-
get language() {
7516-
return this.req.language;
7517-
},
7518-
75197519
get subdomain() {
75207520
return this.req.subdomain;
75217521
},
@@ -7632,6 +7632,18 @@ Controller.prototype.clear = function() {
76327632
return self;
76337633
};
76347634

7635+
/**
7636+
* Translate text
7637+
* @param {String} text
7638+
* @return {String}
7639+
*/
7640+
Controller.prototype.translate = function(text) {
7641+
var value = framework.resource(this.language, text);
7642+
if (!value)
7643+
return text.replace(/\\:/g, ':');
7644+
return value.replace(/\\:/g, ':');
7645+
};
7646+
76357647
/**
76367648
* Exec middleware
76377649
* @param {String Array} names Middleware name.
@@ -10439,7 +10451,7 @@ Controller.prototype.view = function(name, model, headers, isPartial) {
1043910451
if (skip === 3)
1044010452
filename = '.' + framework.path.package(filename);
1044110453

10442-
var generator = framework_internal.generateView(name, filename);
10454+
var generator = framework_internal.generateView(name, filename, self.language);
1044310455
if (generator === null) {
1044410456

1044510457
var err = new Error('View "' + filename + '" not found.');
@@ -12104,7 +12116,14 @@ http.IncomingMessage.prototype = {
1210412116
},
1210512117

1210612118
get language() {
12107-
return ((this.headers['accept-language'].split(';')[0] || '').split(',')[0] || '').toLowerCase();
12119+
if (!this.$language) {
12120+
this.$language = (((this.headers['accept-language'] || '').split(';')[0] || '').split(',')[0] || '').toLowerCase();
12121+
}
12122+
return this.$language;
12123+
},
12124+
12125+
set language(value) {
12126+
this.$language = value;
1210812127
}
1210912128
};
1211012129

internal.js

Lines changed: 79 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1652,6 +1652,32 @@ MultipartParser.prototype.explain = function() {
16521652
*/
16531653
function View() {}
16541654

1655+
function view_parse_localization(content, language) {
1656+
1657+
var command = view_find_localization(content, 0);
1658+
var output = '';
1659+
var end = 0;
1660+
1661+
if (command === null)
1662+
return content;
1663+
1664+
var prepare = function(content) {
1665+
return framework.resource(language || '', content) || content;
1666+
};
1667+
1668+
while (command !== null) {
1669+
1670+
if (command !== null)
1671+
output += content.substring(0, command.beg) + prepare(command.command);
1672+
1673+
end = command.end;
1674+
command = view_find_localization(content, command.end);
1675+
}
1676+
1677+
output += content.substring(end + 1);
1678+
return output;
1679+
}
1680+
16551681
/**
16561682
* View parser
16571683
* @param {String} content
@@ -1981,6 +2007,9 @@ function view_prepare(command, dynamicCommand, functions) {
19812007
case 'routeStatic':
19822008
return 'self.' + command;
19832009

2010+
case 'translate':
2011+
return 'self.' + command;
2012+
19842013
case 'json':
19852014
case 'image':
19862015
case 'layout':
@@ -2116,7 +2145,6 @@ function view_is_assign(value) {
21162145
return false;
21172146
}
21182147

2119-
21202148
function view_find_command(content, index) {
21212149

21222150
var index = content.indexOf('@{', index);
@@ -2153,6 +2181,42 @@ function view_find_command(content, index) {
21532181
return null;
21542182
}
21552183

2184+
function view_find_localization(content, index) {
2185+
2186+
var index = content.indexOf('@(', index);
2187+
if (index === -1)
2188+
return null;
2189+
2190+
var length = content.length;
2191+
var count = 0;
2192+
2193+
for (var i = index + 2; i < length; i++) {
2194+
var c = content[i];
2195+
2196+
if (c === '(') {
2197+
count++;
2198+
continue;
2199+
}
2200+
2201+
if (c !== ')')
2202+
continue;
2203+
else {
2204+
if (count > 0) {
2205+
count--;
2206+
continue;
2207+
}
2208+
}
2209+
2210+
return {
2211+
beg: index,
2212+
end: i,
2213+
command: content.substring(index + 2, i).trim()
2214+
};
2215+
}
2216+
2217+
return null;
2218+
}
2219+
21562220
function removeCondition(text, beg) {
21572221

21582222
if (beg) {
@@ -2336,15 +2400,15 @@ function compressHTML(html, minify) {
23362400
* @param {String} path
23372401
* @return {Object}
23382402
*/
2339-
View.prototype.read = function(path) {
2403+
View.prototype.read = function(path, language) {
23402404

23412405
var self = this;
23422406
var config = framework.config;
23432407
var isOut = path[0] === '.';
23442408
var filename = isOut ? path.substring(1) : framework.path.views(path);
23452409

23462410
if (fs.existsSync(filename))
2347-
return view_parse(fs.readFileSync(filename).toString('utf8'), config['allow-compile-html']);
2411+
return view_parse(view_parse_localization(fs.readFileSync(filename).toString('utf8'), language), config['allow-compile-html']);
23482412

23492413
if (isOut)
23502414
return null;
@@ -2356,7 +2420,7 @@ View.prototype.read = function(path) {
23562420
filename = framework.path.views(path.substring(index + 1));
23572421

23582422
if (fs.existsSync(filename))
2359-
return view_parse(fs.readFileSync(filename).toString('utf8'), config['allow-compile-html']);
2423+
return view_parse(view_parse_localization(fs.readFileSync(filename).toString('utf8'), language), config['allow-compile-html']);
23602424

23612425
return null;
23622426
};
@@ -2367,13 +2431,13 @@ View.prototype.read = function(path) {
23672431
* @param {String} filename
23682432
* @return {Objec}
23692433
*/
2370-
View.prototype.load = function(name, filename) {
2434+
View.prototype.load = function(name, filename, language) {
23712435

23722436
var self = this;
23732437

23742438
// Is dynamic content?
23752439
if (name.indexOf('@{') !== -1 || name.indexOf('<') !== -1)
2376-
return self.dynamic(name);
2440+
return self.dynamic(name, language);
23772441

23782442
var precompiled = framework.routes.views[name];
23792443

@@ -2383,12 +2447,16 @@ View.prototype.load = function(name, filename) {
23832447
filename += '.html';
23842448

23852449
var key = 'view#' + filename;
2450+
2451+
if (language)
2452+
key += language;
2453+
23862454
var generator = framework.temporary.views[key] || null;
23872455

23882456
if (generator !== null)
23892457
return generator;
23902458

2391-
generator = self.read(filename);
2459+
generator = self.read(filename, language);
23922460

23932461
if (!framework.isDebug)
23942462
framework.temporary.views[key] = generator;
@@ -2401,7 +2469,7 @@ View.prototype.load = function(name, filename) {
24012469
@content {String}
24022470
return {Object} :: return parsed HTML
24032471
*/
2404-
View.prototype.dynamic = function(content) {
2472+
View.prototype.dynamic = function(content, language) {
24052473

24062474
var self = this;
24072475
var key = content.md5();
@@ -2410,7 +2478,7 @@ View.prototype.dynamic = function(content) {
24102478
if (generator !== null)
24112479
return generator;
24122480

2413-
generator = view_parse(content, framework.config['allow-compile-html']);
2481+
generator = view_parse(view_parse_localization(content, language), framework.config['allow-compile-html']);
24142482

24152483
if (!framework.isDebug)
24162484
framework.temporary.views[key] = generator;
@@ -2423,8 +2491,8 @@ View.prototype.dynamic = function(content) {
24232491
@name {String}
24242492
return {Object}
24252493
*/
2426-
exports.generateView = function(name, plus) {
2427-
return new View().load(name, plus);
2494+
exports.generateView = function(name, plus, language) {
2495+
return new View().load(name, plus, language);
24282496
};
24292497

24302498
exports.appendModel = function(str) {

minify/merged/total.js

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

minify/total.js/index.js

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

minify/total.js/internal.js

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

minify/total.js/utils.js

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

test/controllers/default.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ exports.install = function(framework) {
5050
framework.route('/a/{a}/', viewRouteAA);
5151
framework.route('/a/b/c/', viewRouteABC);
5252
framework.route('/test/', viewTest);
53+
framework.route('/translate/', viewTranslate);
5354
framework.route('/test-view/', view_test_view);
5455
framework.route('/login/google/callback/', aa);
5556
framework.route('/timeout/', function() {}, [], null, [], 50);
@@ -381,6 +382,11 @@ function viewDynamic() {
381382
});
382383
}
383384

385+
function viewTranslate() {
386+
this.language = this.query.language || '';
387+
this.view('translate');
388+
}
389+
384390
function viewIndex() {
385391

386392
var self = this;

test/resources/default.resource

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,5 @@
1-
name : default
1+
name : default
2+
3+
4+
5+
Preklad ako hrom : FET

test/resources/sk.resource

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
translate : preklad

0 commit comments

Comments
 (0)