@unclepaul/allcountjs
Version:
The open source framework for rapid business application development with Node.js
100 lines (86 loc) • 3.48 kB
JavaScript
var fs = require('fs');
var _ = require('underscore');
var path = require('path');
module.exports = function () {
var messages = {};
var service = {};
var appMessages = {};
var forceLocale;
service.compile = function(objects, errors) {
_.chain(objects)
.map(function (obj) {
return obj.propertyValue('messages') && obj.propertyValue('messages').evaluateProperties() || {};
})
.forEach(function (messagesObj) {
_.forEach(messagesObj, function (messages, locale) {
if (!appMessages[locale]) {
appMessages[locale] = {};
}
_.extend(appMessages[locale], messages);
});
});
objects.forEach(function (obj) {
if (obj.propertyValue('forceLocale')) {
forceLocale = obj.stringPropertyValue('forceLocale'); //TODO check format
}
})
};
service.messagesByLocale = function (acceptLanguageHeader, languageSetting) {
var locale = service.extractLocale(acceptLanguageHeader, languageSetting);
var fileSuffix = locale ? '_' + locale.locale : '';
var localeKey = locale ? locale.locale : 'default';
if (!messages[localeKey]) {
if (_.isUndefined(messages[localeKey])) {
var p = '../config/locale/messages' + fileSuffix + '.js';
messages[localeKey] = fs.existsSync(path.join(__dirname, p)) && require(p);
}
if (appMessages[localeKey]) {
if (!messages[localeKey]) {
messages[localeKey] = {};
}
_.extend(messages[localeKey], appMessages[localeKey]);
}
}
return messages[localeKey];
};
service.messages = function (acceptLanguageHeader, languageSetting) {
var messagesByLocale = service.messagesByLocale(acceptLanguageHeader, languageSetting);
return function (msg) {
return messagesByLocale && messagesByLocale[msg] || msg;
}
};
service.extractLocale = function (acceptLanguageHeader, languageSetting) {
var languages = forceLocale && [forceLocale] || languageSetting && [languageSetting] || parseAcceptLanguageHeader(acceptLanguageHeader);
var locale = _.find(languages, function (lang) {
if (appMessages[lang]) {
return true;
} else if (_.isUndefined(messages[lang])) {
if (fs.existsSync(path.join(__dirname, '../config/locale/messages_' + lang + '.js'))) {
return true;
} else {
messages[lang] = false;
return false;
}
} else {
return !!messages[lang];
}
});
if (locale) {
var split = locale.split('-');
return {
language: split[0],
country: split[1],
locale: locale
}
} else {
return undefined;
}
};
function parseAcceptLanguageHeader(header) {
var langs = header && header.split(',') || [];
return langs.map(function (lang) {
return lang.split(';')[0];
});
}
return service;
};