Skip to content

Commit

Permalink
Localized model error-messages, stubs for tests.
Browse files Browse the repository at this point in the history
  • Loading branch information
mde committed Feb 26, 2012
1 parent 05fdb09 commit a581938
Show file tree
Hide file tree
Showing 4 changed files with 72 additions and 25 deletions.
5 changes: 2 additions & 3 deletions lib/i18n/index.js
Expand Up @@ -6,18 +6,17 @@ var i18n = new (function () {

this.getText = function (key, opts, locale) {
var currentLocale = locale || geddy.config.i18n.defaultLocale
, str = _strings[currentLocale][key] || "[[" + key + "]]";
, strings = _strings[currentLocale] || {}
, str = strings[key] || "[[" + key + "]]";
for (p in opts){
str = str.replace(new RegExp('\\{' + p + '\\}', 'g'), opts[p]);
}
return str;
};

this.loadLocale = function (locale, strings) {
geddy.log.debug('registering ' + locale);
_strings[locale] = _strings[locale] || {};
geddy.mixin(_strings[locale], strings);
geddy.log.debug('registered ' + locale + ' ' + JSON.stringify(_strings[locale]));
};

})();
Expand Down
80 changes: 58 additions & 22 deletions lib/model/validators.js
Expand Up @@ -16,6 +16,8 @@
*
*/

var i18n = require('../i18n');

/*
* Basic validators -- name is the field name, params is the entire params
* collection (needed for stuff like password confirmation so it's possible
Expand All @@ -28,65 +30,99 @@
* message: 'Something is wrong'}
*/
var validators = {
present: function (name, val, params, rule) {
present: function (name, val, params, rule, locale) {
var currentLocale = locale || geddy.config.i18n.defaultLocale
, msg;
if (!val) {
return rule.message || 'Field "' + name + '" is required.';
//'Field "' + name + '" is required.';
msg = rule.message || i18n.getText('model.validatesPresent',
{name: name}, currentLocale);
}
return msg;
},

absent: function (name, val, params, rule) {
absent: function (name, val, params, rule, locale) {
var currentLocale = locale || geddy.config.i18n.defaultLocale
, msg;
if (val) {
return rule.message || 'Field "' + name + '" must not be filled in.';
//return rule.message || 'Field "' + name + '" must not be filled in.';
msg = rule.message || i18n.getText('model.validatesAbsent',
{name: name}, currentLocale);
}
return msg;
},

confirmed: function (name, val, params, rule) {
var qual = rule.qualifier;
confirmed: function (name, val, params, rule, locale) {
var qual = rule.qualifier
, currentLocale = locale || geddy.config.i18n.defaultLocale
, msg;
if (val != params[qual]) {
return rule.message || 'Field "' + name + '" and field "' + qual +
'" must match.';
//return rule.message || 'Field "' + name + '" and field "' + qual +
// '" must match.';
msg = rule.message || i18n.getText('model.validatesConfirmed',
{name: name, qual: qual}, currentLocale);
}
return msg;
},

format: function (name, val, params, rule) {
format: function (name, val, params, rule, locale) {
var currentLocale = locale || geddy.config.i18n.defaultLocale
, msg;
if (!rule.qualifier.test(val)) {
return rule.message || 'Field "' + name + '" is not correctly formatted.';
//return rule.message || 'Field "' + name + '" is not correctly formatted.';
msg = rule.message || i18n.getText('model.validatesFormat',
{name: name}, currentLocale);
}
return msg;
},

length: function (name, val, params, rule) {
var qual = rule.qualifier;
var err;
length: function (name, val, params, rule, locale) {
var qual = rule.qualifier
, err
, currentLocale = locale || geddy.config.i18n.defaultLocale
, msg;
if (!val) {
return rule.message || 'Field "' + name + '" is required.';
}
if (typeof qual == 'number') {
if (val.length != qual) {
return rule.message || 'Field "' + name + '" must be ' + qual +
' characters long.';
//return rule.message || 'Field "' + name + '" must be ' + qual +
// ' characters long.';
msg = rule.message || i18n.getText('model.validatesExactLength',
{name: name}, currentLocale);
}
}
else {
if (typeof qual.min == 'number' && val.length < qual.min) {
return rule.message || 'Field "' + name + '" must be at least ' +
qual.min + ' characters long.';
//return rule.message || 'Field "' + name + '" must be at least ' +
// qual.min + ' characters long.';
msg = rule.message || i18n.getText('model.validatesMinLength',
{name: name, min: qual.min}, currentLocale);
}
if (typeof qual.max == 'number' && val.length > qual.max) {
return rule.message || 'Field "' + name + '" may not be more than ' +
qual.max + ' characters long.';
//return rule.message || 'Field "' + name + '" may not be more than ' +
// qual.max + ' characters long.';
msg = rule.message || i18n.getText('model.validatesMaxLength',
{name: name, max: qual.max}, currentLocale);
}
}
return msg;
},

withFunction: function (name, val, params, rule) {
var func = rule.qualifier;
withFunction: function (name, val, params, rule, locale) {
var func = rule.qualifier
, currentLocale = locale || geddy.config.i18n.defaultLocale
, msg;
if (typeof func != 'function') {
throw new Error('withFunction validator for field "' + name +
'" must be a function.');
}
if (!func(val, params)) {
return rule.message || 'Field "' + name + '" is not valid.';
//return rule.message || 'Field "' + name + '" is not valid.';
msg = rule.message || i18n.getText('model.validatesWithFunction',
{name: name}, currentLocale);
}
return msg;
}
};

Expand Down
6 changes: 6 additions & 0 deletions test/model_create_user.js
@@ -1,6 +1,12 @@
// Load the basic Geddy toolkit
require('../lib/geddy');

geddy.config = {
i18n: {
defaultLocale: 'en-us'
}
};

var model = require('../lib/model')
, assert = require('assert')
, tests;
Expand Down
6 changes: 6 additions & 0 deletions test/model_datatypes.js
@@ -1,6 +1,12 @@
// Load the basic Geddy toolkit
require('../lib/geddy');

geddy.config = {
i18n: {
defaultLocale: 'en-us'
}
};

var model = require('../lib/model')
, assert = require('assert')
, tests;
Expand Down

0 comments on commit a581938

Please sign in to comment.