Updated translation support
This commit is contained in:
parent
b1e8cd68cd
commit
d25565b6f8
114 changed files with 42095 additions and 1902 deletions
26
lib/fakelang.js
Normal file
26
lib/fakelang.js
Normal file
|
@ -0,0 +1,26 @@
|
|||
'use strict';
|
||||
|
||||
/* lloyd|2012|http://wtfpl.org */
|
||||
|
||||
/* eslint-disable */
|
||||
|
||||
module.exports = str => {
|
||||
let from = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_=+\\|`~[{]};:'\",<.>/?";
|
||||
let to = "ɐqɔpǝɟƃɥıɾʞʅɯuodbɹsʇnʌʍxʎz∀ԐↃᗡƎℲ⅁HIſӼ⅂WNOԀÒᴚS⊥∩ɅMX⅄Z0123456789¡@#$%ᵥ⅋⁎()-_=+\\|,~[{]};:,„´<.>/¿";
|
||||
|
||||
return str.replace(/(\{\{[^\}]+\}\}|%s)/g, '\x00\x04$1\x00').split('\x00').map(c => {
|
||||
if (c.charAt(0) === '\x04') {
|
||||
return c;
|
||||
}
|
||||
let r = '';
|
||||
for (let i = 0, len = c.length; i < len; i++) {
|
||||
let pos = from.indexOf(c.charAt(i));
|
||||
if (pos < 0) {
|
||||
r += c.charAt(i);
|
||||
} else {
|
||||
r += to.charAt(pos);
|
||||
}
|
||||
}
|
||||
return r;
|
||||
}).join('\x00').replace(/[\x00\x04]/g, '');
|
||||
}
|
|
@ -2,6 +2,8 @@
|
|||
|
||||
let FeedParser = require('feedparser');
|
||||
let request = require('request');
|
||||
let _ = require('./translate')._;
|
||||
let util = require('util');
|
||||
|
||||
module.exports.fetch = (url, callback) => {
|
||||
let req = request(url);
|
||||
|
@ -26,7 +28,7 @@ module.exports.fetch = (url, callback) => {
|
|||
}
|
||||
|
||||
if (res.statusCode !== 200) {
|
||||
return req.emit('error', new Error('Bad status code'));
|
||||
return req.emit('error', new Error(util.format(_('Bad status code %s'), res.statusCode)));
|
||||
}
|
||||
|
||||
req.pipe(feedparser);
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
let lists = require('./models/lists');
|
||||
let fields = require('./models/fields');
|
||||
let _ = require('./translate')._;
|
||||
|
||||
module.exports = {
|
||||
getDefaultMergeTags,
|
||||
|
@ -13,34 +14,34 @@ function getDefaultMergeTags(callback) {
|
|||
callback(null, [
|
||||
{
|
||||
key: 'LINK_UNSUBSCRIBE',
|
||||
value: 'URL that points to the unsubscribe page'
|
||||
value: _('URL that points to the unsubscribe page')
|
||||
}, {
|
||||
key: 'LINK_PREFERENCES',
|
||||
value: 'URL that points to the preferences page of the subscriber'
|
||||
value: _('URL that points to the preferences page of the subscriber')
|
||||
}, {
|
||||
key: 'LINK_BROWSER',
|
||||
value: 'URL to preview the message in a browser'
|
||||
value: _('URL to preview the message in a browser')
|
||||
}, {
|
||||
key: 'EMAIL',
|
||||
value: 'Email address'
|
||||
value: _('Email address')
|
||||
}, {
|
||||
key: 'FIRST_NAME',
|
||||
value: 'First name'
|
||||
value: _('First name')
|
||||
}, {
|
||||
key: 'LAST_NAME',
|
||||
value: 'Last name'
|
||||
value: _('Last name')
|
||||
}, {
|
||||
key: 'FULL_NAME',
|
||||
value: 'Full name (first and last name combined)'
|
||||
value: _('Full name (first and last name combined)')
|
||||
}, {
|
||||
key: 'SUBSCRIPTION_ID',
|
||||
value: 'Unique ID that identifies the recipient'
|
||||
value: _('Unique ID that identifies the recipient')
|
||||
}, {
|
||||
key: 'LIST_ID',
|
||||
value: 'Unique ID that identifies the list used for this campaign'
|
||||
value: _('Unique ID that identifies the list used for this campaign')
|
||||
}, {
|
||||
key: 'CAMPAIGN_ID',
|
||||
value: 'Unique ID that identifies current campaign'
|
||||
value: _('Unique ID that identifies current campaign')
|
||||
}
|
||||
]);
|
||||
}
|
||||
|
|
|
@ -14,6 +14,23 @@ let templates = new Map();
|
|||
let htmlToText = require('html-to-text');
|
||||
let aws = require('aws-sdk');
|
||||
|
||||
let _ = require('./translate')._;
|
||||
let util = require('util');
|
||||
|
||||
Handlebars.registerHelper('translate', function (context, options) { // eslint-disable-line prefer-arrow-callback
|
||||
if (typeof options === 'undefined' && context) {
|
||||
options = context;
|
||||
context = false;
|
||||
}
|
||||
|
||||
let result = _(options.fn(this)); // eslint-disable-line no-invalid-this
|
||||
|
||||
if (Array.isArray(context)) {
|
||||
result = util.format(result, ...context);
|
||||
}
|
||||
return new Handlebars.SafeString(result);
|
||||
});
|
||||
|
||||
module.exports.transport = false;
|
||||
|
||||
module.exports.update = () => {
|
||||
|
@ -195,7 +212,7 @@ function createMailer(callback) {
|
|||
}
|
||||
};
|
||||
} else {
|
||||
return callback(new Error('Invalid mail transport'));
|
||||
return callback(new Error(_('Invalid mail transport')));
|
||||
}
|
||||
|
||||
module.exports.transport = nodemailer.createTransport(transportOptions, config.nodemailer);
|
||||
|
|
|
@ -12,6 +12,7 @@ let feed = require('../feed');
|
|||
let log = require('npmlog');
|
||||
let mailer = require('../mailer');
|
||||
let humanize = require('humanize');
|
||||
let _ = require('../translate')._;
|
||||
|
||||
let allowedKeys = ['description', 'from', 'address', 'reply_to', 'subject', 'editor_name', 'editor_data', 'template', 'source_url', 'list', 'segment', 'html', 'text', 'tracking_disabled'];
|
||||
|
||||
|
@ -267,7 +268,7 @@ module.exports.filterStatusSubscribers = (campaign, status, request, columns, ca
|
|||
module.exports.getByCid = (cid, callback) => {
|
||||
cid = (cid || '').toString().trim();
|
||||
if (!cid) {
|
||||
return callback(new Error('Missing Campaign ID'));
|
||||
return callback(new Error(_('Missing Campaign ID')));
|
||||
}
|
||||
db.getConnection((err, connection) => {
|
||||
if (err) {
|
||||
|
@ -294,7 +295,7 @@ module.exports.get = (id, withSegment, callback) => {
|
|||
id = Number(id) || 0;
|
||||
|
||||
if (id < 1) {
|
||||
return callback(new Error('Missing Campaign ID'));
|
||||
return callback(new Error(_('Missing Campaign ID')));
|
||||
}
|
||||
|
||||
db.getConnection((err, connection) => {
|
||||
|
@ -367,7 +368,7 @@ module.exports.getAttachments = (campaign, callback) => {
|
|||
campaign = Number(campaign) || 0;
|
||||
|
||||
if (campaign < 1) {
|
||||
return callback(new Error('Missing Campaign ID'));
|
||||
return callback(new Error(_('Missing Campaign ID')));
|
||||
}
|
||||
|
||||
db.getConnection((err, connection) => {
|
||||
|
@ -403,7 +404,7 @@ module.exports.addAttachment = (id, attachment, callback) => {
|
|||
let size = attachment.content ? attachment.content.length : 0;
|
||||
|
||||
if (!size) {
|
||||
return callback(new Error('Emtpy or too large attahcment'));
|
||||
return callback(new Error(_('Emtpy or too large attahcment')));
|
||||
}
|
||||
db.getConnection((err, connection) => {
|
||||
if (err) {
|
||||
|
@ -490,7 +491,7 @@ module.exports.getLinks = (id, linkId, callback) => {
|
|||
linkId = Number(linkId) || 0;
|
||||
|
||||
if (id < 1) {
|
||||
return callback(new Error('Missing Campaign ID'));
|
||||
return callback(new Error(_('Missing Campaign ID')));
|
||||
}
|
||||
|
||||
db.getConnection((err, connection) => {
|
||||
|
@ -569,11 +570,11 @@ module.exports.create = (campaign, opts, callback) => {
|
|||
campaign.template = Number(campaign.template) || 0;
|
||||
|
||||
if (!name) {
|
||||
return callback(new Error('Campaign Name must be set'));
|
||||
return callback(new Error(_('Campaign Name must be set')));
|
||||
}
|
||||
|
||||
if (campaign.type === 2 && (!campaign.sourceUrl || !isUrl(campaign.sourceUrl))) {
|
||||
return callback(new Error('RSS URL must be set and needs to be a valid URL'));
|
||||
return callback(new Error(_('RSS URL must be set and needs to be a valid URL')));
|
||||
}
|
||||
|
||||
let getList = (listId, callback) => {
|
||||
|
@ -726,7 +727,7 @@ module.exports.create = (campaign, opts, callback) => {
|
|||
return callback(err);
|
||||
}
|
||||
if (!template) {
|
||||
return callback(new Error('Selected template not found'));
|
||||
return callback(new Error(_('Selected template not found')));
|
||||
}
|
||||
|
||||
campaign.editorName = template.editorName;
|
||||
|
@ -748,7 +749,7 @@ module.exports.update = (id, updates, callback) => {
|
|||
id = Number(id) || 0;
|
||||
|
||||
if (id < 1) {
|
||||
return callback(new Error('Missing Campaign ID'));
|
||||
return callback(new Error(_('Missing Campaign ID')));
|
||||
}
|
||||
|
||||
let campaign = tools.convertKeys(updates);
|
||||
|
@ -757,7 +758,7 @@ module.exports.update = (id, updates, callback) => {
|
|||
campaign.trackingDisabled = campaign.trackingDisabled ? 1 : 0;
|
||||
|
||||
if (!name) {
|
||||
return callback(new Error('Campaign Name must be set'));
|
||||
return callback(new Error(_('Campaign Name must be set')));
|
||||
}
|
||||
|
||||
if (/^\d+:\d+$/.test(campaign.list)) {
|
||||
|
@ -877,7 +878,7 @@ module.exports.delete = (id, callback) => {
|
|||
id = Number(id) || 0;
|
||||
|
||||
if (id < 1) {
|
||||
return callback(new Error('Missing Campaign ID'));
|
||||
return callback(new Error(_('Missing Campaign ID')));
|
||||
}
|
||||
|
||||
db.getConnection((err, connection) => {
|
||||
|
@ -1078,7 +1079,7 @@ module.exports.getMail = (campaignId, listId, subscriptionId, callback) => {
|
|||
subscriptionId = Number(subscriptionId) || 0;
|
||||
|
||||
if (campaignId < 1 || listId < 1 || subscriptionId < 1) {
|
||||
return callback(new Error('Invalid or missing message ID'));
|
||||
return callback(new Error(_('Invalid or missing message ID')));
|
||||
}
|
||||
|
||||
db.getConnection((err, connection) => {
|
||||
|
|
|
@ -6,26 +6,28 @@ let slugify = require('slugify');
|
|||
let lists = require('./lists');
|
||||
let shortid = require('shortid');
|
||||
let Handlebars = require('handlebars');
|
||||
let _ = require('../translate')._;
|
||||
let util = require('util');
|
||||
|
||||
let allowedKeys = ['name', 'key', 'default_value', 'group', 'group_template', 'visible'];
|
||||
let allowedTypes;
|
||||
|
||||
module.exports.grouped = ['radio', 'checkbox', 'dropdown'];
|
||||
module.exports.types = {
|
||||
text: 'Text',
|
||||
website: 'Website',
|
||||
longtext: 'Multi-line text',
|
||||
gpg: 'GPG Public Key',
|
||||
number: 'Number',
|
||||
radio: 'Radio Buttons',
|
||||
checkbox: 'Checkboxes',
|
||||
dropdown: 'Drop Down',
|
||||
'date-us': 'Date (MM/DD/YYY)',
|
||||
'date-eur': 'Date (DD/MM/YYYY)',
|
||||
'birthday-us': 'Birthday (MM/DD)',
|
||||
'birthday-eur': 'Birthday (DD/MM)',
|
||||
json: 'JSON value for custom rendering',
|
||||
option: 'Option'
|
||||
text: _('Text'),
|
||||
website: _('Website'),
|
||||
longtext: _('Multi-line text'),
|
||||
gpg: _('GPG Public Key'),
|
||||
number: _('Number'),
|
||||
radio: _('Radio Buttons'),
|
||||
checkbox: _('Checkboxes'),
|
||||
dropdown: _('Drop Down'),
|
||||
'date-us': _('Date (MM/DD/YYY)'),
|
||||
'date-eur': _('Date (DD/MM/YYYY)'),
|
||||
'birthday-us': _('Birthday (MM/DD)'),
|
||||
'birthday-eur': _('Birthday (DD/MM)'),
|
||||
json: _('JSON value for custom rendering'),
|
||||
option: _('Option')
|
||||
};
|
||||
|
||||
module.exports.allowedTypes = allowedTypes = Object.keys(module.exports.types);
|
||||
|
@ -48,7 +50,7 @@ module.exports.list = (listId, callback) => {
|
|||
listId = Number(listId) || 0;
|
||||
|
||||
if (listId < 1) {
|
||||
return callback(new Error('Missing List ID'));
|
||||
return callback(new Error(_('Missing List ID')));
|
||||
}
|
||||
|
||||
db.getConnection((err, connection) => {
|
||||
|
@ -93,7 +95,7 @@ module.exports.get = (id, callback) => {
|
|||
id = Number(id) || 0;
|
||||
|
||||
if (id < 1) {
|
||||
return callback(new Error('Missing List ID'));
|
||||
return callback(new Error(_('Missing List ID')));
|
||||
}
|
||||
|
||||
db.getConnection((err, connection) => {
|
||||
|
@ -118,13 +120,13 @@ module.exports.create = (listId, field, callback) => {
|
|||
listId = Number(listId) || 0;
|
||||
|
||||
if (listId < 1) {
|
||||
return callback(new Error('Missing List ID'));
|
||||
return callback(new Error(_('Missing List ID')));
|
||||
}
|
||||
|
||||
field = tools.convertKeys(field);
|
||||
|
||||
if (field.type === 'option' && !field.group) {
|
||||
return callback(new Error('Option field requires a group to be selected'));
|
||||
return callback(new Error(_('Option field requires a group to be selected')));
|
||||
}
|
||||
|
||||
if (field.type !== 'option') {
|
||||
|
@ -144,11 +146,11 @@ module.exports.update = (id, updates, callback) => {
|
|||
updates = tools.convertKeys(updates);
|
||||
|
||||
if (id < 1) {
|
||||
return callback(new Error('Missing Field ID'));
|
||||
return callback(new Error(_('Missing Field ID')));
|
||||
}
|
||||
|
||||
if (!(updates.name || '').toString().trim()) {
|
||||
return callback(new Error('Field Name must be set'));
|
||||
return callback(new Error(_('Field Name must be set')));
|
||||
}
|
||||
|
||||
if (updates.key) {
|
||||
|
@ -194,7 +196,7 @@ module.exports.delete = (fieldId, callback) => {
|
|||
fieldId = Number(fieldId) || 0;
|
||||
|
||||
if (fieldId < 1) {
|
||||
return callback(new Error('Missing Field ID'));
|
||||
return callback(new Error(_('Missing Field ID')));
|
||||
}
|
||||
|
||||
db.getConnection((err, connection) => {
|
||||
|
@ -211,7 +213,7 @@ module.exports.delete = (fieldId, callback) => {
|
|||
|
||||
if (!rows || !rows.length) {
|
||||
connection.release();
|
||||
return callback(new Error('Custom field not found'));
|
||||
return callback(new Error(_('Custom field not found')));
|
||||
}
|
||||
|
||||
let field = tools.convertKeys(rows[0]);
|
||||
|
@ -284,15 +286,15 @@ function addCustomField(listId, name, defaultValue, type, group, groupTemplate,
|
|||
let key = slugify('merge ' + name, '_').toUpperCase();
|
||||
|
||||
if (allowedTypes.indexOf(type) < 0) {
|
||||
return callback(new Error('Unknown column type ' + type));
|
||||
return callback(new Error(util.format(_('Unknown column type %s'), type)));
|
||||
}
|
||||
|
||||
if (!name) {
|
||||
return callback(new Error('Missing column name'));
|
||||
return callback(new Error(_('Missing column name')));
|
||||
}
|
||||
|
||||
if (listId <= 0) {
|
||||
return callback(new Error('Missing list ID'));
|
||||
return callback(new Error(_('Missing list ID')));
|
||||
}
|
||||
|
||||
lists.get(listId, (err, list) => {
|
||||
|
@ -300,7 +302,7 @@ function addCustomField(listId, name, defaultValue, type, group, groupTemplate,
|
|||
return callback(err);
|
||||
}
|
||||
if (!list) {
|
||||
return callback('Provided List ID not found');
|
||||
return callback(_('Provided List ID not found'));
|
||||
}
|
||||
|
||||
db.getConnection((err, connection) => {
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
let db = require('../db');
|
||||
let shortid = require('shortid');
|
||||
let util = require('util');
|
||||
let _ = require('../translate')._;
|
||||
|
||||
let geoip = require('geoip-ultralight');
|
||||
let campaigns = require('./campaigns');
|
||||
|
@ -324,7 +325,7 @@ function getSubscriptionData(campaignCid, listCid, subscriptionCid, callback) {
|
|||
return callback(err);
|
||||
}
|
||||
if (!campaign) {
|
||||
return callback(new Error('Campaign not found'));
|
||||
return callback(new Error(_('Campaign not found')));
|
||||
}
|
||||
|
||||
lists.getByCid(listCid, (err, list) => {
|
||||
|
@ -332,7 +333,7 @@ function getSubscriptionData(campaignCid, listCid, subscriptionCid, callback) {
|
|||
return callback(err);
|
||||
}
|
||||
if (!list) {
|
||||
return callback(new Error('Campaign not found'));
|
||||
return callback(new Error(_('List not found')));
|
||||
}
|
||||
|
||||
subscriptions.get(list.id, subscriptionCid, (err, subscription) => {
|
||||
|
@ -340,7 +341,7 @@ function getSubscriptionData(campaignCid, listCid, subscriptionCid, callback) {
|
|||
return callback(err);
|
||||
}
|
||||
if (!subscription) {
|
||||
return callback(new Error('Subscription not found'));
|
||||
return callback(new Error(_('Subscription not found')));
|
||||
}
|
||||
|
||||
return callback(null, {
|
||||
|
|
|
@ -4,6 +4,7 @@ let db = require('../db');
|
|||
let tools = require('../tools');
|
||||
let shortid = require('shortid');
|
||||
let segments = require('./segments');
|
||||
let _ = require('../translate')._;
|
||||
|
||||
let allowedKeys = ['description'];
|
||||
|
||||
|
@ -77,7 +78,7 @@ module.exports.get = (id, callback) => {
|
|||
id = Number(id) || 0;
|
||||
|
||||
if (id < 1) {
|
||||
return callback(new Error('Missing List ID'));
|
||||
return callback(new Error(_('Missing List ID')));
|
||||
}
|
||||
|
||||
db.getConnection((err, connection) => {
|
||||
|
@ -113,7 +114,7 @@ module.exports.create = (list, callback) => {
|
|||
let name = (data.name || '').toString().trim();
|
||||
|
||||
if (!data) {
|
||||
return callback(new Error('List Name must be set'));
|
||||
return callback(new Error(_('List Name must be set')));
|
||||
}
|
||||
|
||||
let keys = ['name'];
|
||||
|
@ -171,11 +172,11 @@ module.exports.update = (id, updates, callback) => {
|
|||
let values = [name];
|
||||
|
||||
if (id < 1) {
|
||||
return callback(new Error('Missing List ID'));
|
||||
return callback(new Error(_('Missing List ID')));
|
||||
}
|
||||
|
||||
if (!name) {
|
||||
return callback(new Error('List Name must be set'));
|
||||
return callback(new Error(_('List Name must be set')));
|
||||
}
|
||||
|
||||
Object.keys(updates).forEach(key => {
|
||||
|
@ -208,7 +209,7 @@ module.exports.delete = (id, callback) => {
|
|||
id = Number(id) || 0;
|
||||
|
||||
if (id < 1) {
|
||||
return callback(new Error('Missing List ID'));
|
||||
return callback(new Error(_('Missing List ID')));
|
||||
}
|
||||
|
||||
db.getConnection((err, connection) => {
|
||||
|
@ -237,7 +238,7 @@ module.exports.delete = (id, callback) => {
|
|||
function resolveCid(cid, callback) {
|
||||
cid = (cid || '').toString().trim();
|
||||
if (!cid) {
|
||||
return callback(new Error('Missing List CID'));
|
||||
return callback(new Error(_('Missing List CID')));
|
||||
}
|
||||
|
||||
db.getConnection((err, connection) => {
|
||||
|
|
|
@ -3,34 +3,36 @@
|
|||
let tools = require('../tools');
|
||||
let db = require('../db');
|
||||
let fields = require('./fields');
|
||||
let util = require('util');
|
||||
let _ = require('../translate')._;
|
||||
|
||||
module.exports.defaultColumns = [{
|
||||
column: 'email',
|
||||
name: 'Email address',
|
||||
name: _('Email address'),
|
||||
type: 'string'
|
||||
}, {
|
||||
column: 'opt_in_country',
|
||||
name: 'Signup country',
|
||||
name: _('Signup country'),
|
||||
type: 'string'
|
||||
}, {
|
||||
column: 'created',
|
||||
name: 'Sign up date',
|
||||
name: _('Sign up date'),
|
||||
type: 'date'
|
||||
}, {
|
||||
column: 'latest_open',
|
||||
name: 'Latest open',
|
||||
name: _('Latest open'),
|
||||
type: 'date'
|
||||
}, {
|
||||
column: 'latest_click',
|
||||
name: 'Latest click',
|
||||
name: _('Latest click'),
|
||||
type: 'date'
|
||||
}, {
|
||||
column: 'first_name',
|
||||
name: 'First name',
|
||||
name: _('First name'),
|
||||
type: 'string'
|
||||
}, {
|
||||
column: 'last_name',
|
||||
name: 'Last name',
|
||||
name: _('Last name'),
|
||||
type: 'string'
|
||||
}];
|
||||
|
||||
|
@ -38,7 +40,7 @@ module.exports.list = (listId, callback) => {
|
|||
listId = Number(listId) || 0;
|
||||
|
||||
if (listId < 1) {
|
||||
return callback(new Error('Missing List ID'));
|
||||
return callback(new Error(_('Missing List ID')));
|
||||
}
|
||||
|
||||
|
||||
|
@ -64,7 +66,7 @@ module.exports.get = (id, callback) => {
|
|||
id = Number(id) || 0;
|
||||
|
||||
if (id < 1) {
|
||||
return callback(new Error('Missing Segment ID'));
|
||||
return callback(new Error(_('Missing Segment ID')));
|
||||
}
|
||||
|
||||
db.getConnection((err, connection) => {
|
||||
|
@ -80,7 +82,7 @@ module.exports.get = (id, callback) => {
|
|||
}
|
||||
if (!rows || !rows.length) {
|
||||
connection.release();
|
||||
return callback(new Error('Segment not found'));
|
||||
return callback(new Error(_('Segment not found')));
|
||||
}
|
||||
|
||||
let segment = tools.convertKeys(rows[0]);
|
||||
|
@ -141,7 +143,9 @@ module.exports.get = (id, callback) => {
|
|||
case 'date':
|
||||
case 'birthday':
|
||||
if (rule.value.relativeRange) {
|
||||
rule.formatted = (rule.value.start ? rule.value.start + ' days ' + (rule.value.startDirection ? 'after' : 'before') + ' today' : 'today') + ' … ' + (rule.value.end ? rule.value.end + ' days ' + (rule.value.endDirection ? 'after' : 'before') + ' today' : 'today');
|
||||
let startString = rule.value.startDirection ? util.format(_('%s days after today'), rule.value.start) : util.format(_('%s days before today'), rule.value.start);
|
||||
let endString = rule.value.endDirection ? util.format(_('%s days after today'), rule.value.end) : util.format(_('%s days before today'), rule.value.end);
|
||||
rule.formatted = (rule.value.start ? startString : _('today')) + ' … ' + (rule.value.end ? endString : _('today'));
|
||||
} else if (rule.value.range) {
|
||||
rule.formatted = (rule.value.start || '') + ' … ' + (rule.value.end || '');
|
||||
} else {
|
||||
|
@ -149,7 +153,7 @@ module.exports.get = (id, callback) => {
|
|||
}
|
||||
break;
|
||||
case 'boolean':
|
||||
rule.formatted = rule.value.value ? 'Selected' : 'Not selected';
|
||||
rule.formatted = rule.value.value ? _('Selected') : _('Not selected');
|
||||
break;
|
||||
default:
|
||||
rule.formatted = rule.value.value || '';
|
||||
|
@ -169,7 +173,7 @@ module.exports.create = (listId, segment, callback) => {
|
|||
listId = Number(listId) || 0;
|
||||
|
||||
if (listId < 1) {
|
||||
return callback(new Error('Missing List ID'));
|
||||
return callback(new Error(_('Missing List ID')));
|
||||
}
|
||||
|
||||
segment = tools.convertKeys(segment);
|
||||
|
@ -178,11 +182,11 @@ module.exports.create = (listId, segment, callback) => {
|
|||
segment.type = Number(segment.type) || 0;
|
||||
|
||||
if (!segment.name) {
|
||||
return callback(new Error('Field Name must be set'));
|
||||
return callback(new Error(_('Field Name must be set')));
|
||||
}
|
||||
|
||||
if (segment.type <= 0) {
|
||||
return callback(new Error('Invalid segment rule type'));
|
||||
return callback(new Error(_('Invalid segment rule type')));
|
||||
}
|
||||
|
||||
let keys = ['list', 'name', 'type'];
|
||||
|
@ -209,7 +213,7 @@ module.exports.update = (id, updates, callback) => {
|
|||
id = Number(id) || 0;
|
||||
|
||||
if (id < 1) {
|
||||
return callback(new Error('Missing Segment ID'));
|
||||
return callback(new Error(_('Missing Segment ID')));
|
||||
}
|
||||
|
||||
let segment = tools.convertKeys(updates);
|
||||
|
@ -218,11 +222,11 @@ module.exports.update = (id, updates, callback) => {
|
|||
segment.type = Number(segment.type) || 0;
|
||||
|
||||
if (!segment.name) {
|
||||
return callback(new Error('Field Name must be set'));
|
||||
return callback(new Error(_('Field Name must be set')));
|
||||
}
|
||||
|
||||
if (segment.type <= 0) {
|
||||
return callback(new Error('Invalid segment rule type'));
|
||||
return callback(new Error(_('Invalid segment rule type')));
|
||||
}
|
||||
|
||||
let keys = ['name', 'type'];
|
||||
|
@ -249,7 +253,7 @@ module.exports.delete = (id, callback) => {
|
|||
id = Number(id) || 0;
|
||||
|
||||
if (id < 1) {
|
||||
return callback(new Error('Missing Segment ID'));
|
||||
return callback(new Error(_('Missing Segment ID')));
|
||||
}
|
||||
|
||||
db.getConnection((err, connection) => {
|
||||
|
@ -271,7 +275,7 @@ module.exports.createRule = (segmentId, rule, callback) => {
|
|||
segmentId = Number(segmentId) || 0;
|
||||
|
||||
if (segmentId < 1) {
|
||||
return callback(new Error('Missing Segment ID'));
|
||||
return callback(new Error(_('Missing Segment ID')));
|
||||
}
|
||||
|
||||
rule = tools.convertKeys(rule);
|
||||
|
@ -282,12 +286,12 @@ module.exports.createRule = (segmentId, rule, callback) => {
|
|||
}
|
||||
|
||||
if (!segment) {
|
||||
return callback(new Error('Selected segment not found'));
|
||||
return callback(new Error(_('Selected segment not found')));
|
||||
}
|
||||
|
||||
let column = segment.columns.filter(column => column.column === rule.column).pop();
|
||||
if (!column) {
|
||||
return callback(new Error('Invalid rule type'));
|
||||
return callback(new Error(_('Invalid rule type')));
|
||||
}
|
||||
|
||||
let value;
|
||||
|
@ -351,7 +355,7 @@ module.exports.getRule = (id, callback) => {
|
|||
id = Number(id) || 0;
|
||||
|
||||
if (id < 1) {
|
||||
return callback(new Error('Missing Rule ID'));
|
||||
return callback(new Error(_('Missing Rule ID')));
|
||||
}
|
||||
|
||||
db.getConnection((err, connection) => {
|
||||
|
@ -367,7 +371,7 @@ module.exports.getRule = (id, callback) => {
|
|||
}
|
||||
|
||||
if (!rows || !rows.length) {
|
||||
return callback(new Error('Specified rule not found'));
|
||||
return callback(new Error(_('Specified rule not found')));
|
||||
}
|
||||
|
||||
let rule = tools.convertKeys(rows[0]);
|
||||
|
@ -378,7 +382,7 @@ module.exports.getRule = (id, callback) => {
|
|||
}
|
||||
|
||||
if (!segment) {
|
||||
return callback(new Error('Specified segment not found'));
|
||||
return callback(new Error(_('Specified segment not found')));
|
||||
}
|
||||
|
||||
if (rule.value) {
|
||||
|
@ -400,7 +404,10 @@ module.exports.getRule = (id, callback) => {
|
|||
case 'date':
|
||||
case 'birthday':
|
||||
if (rule.value.relativeRange) {
|
||||
rule.formatted = (rule.value.start ? rule.value.start + ' days ' + (rule.value.startDirection ? 'after' : 'before') + ' today' : 'today') + ' … ' + (rule.value.end ? rule.value.end + ' days ' + (rule.value.endDirection ? 'after' : 'before') + ' today' : 'today');
|
||||
|
||||
let startString = rule.value.startDirection ? util.format(_('%s days after today'), rule.value.start) : util.format(_('%s days before today'), rule.value.start);
|
||||
let endString = rule.value.endDirection ? util.format(_('%s days after today'), rule.value.end) : util.format(_('%s days before today'), rule.value.end);
|
||||
rule.formatted = (rule.value.start ? startString : _('today')) + ' … ' + (rule.value.end ? endString : _('today'));
|
||||
} else if (rule.value.range) {
|
||||
rule.formatted = (rule.value.start || '') + ' … ' + (rule.value.end || '');
|
||||
} else {
|
||||
|
@ -408,7 +415,7 @@ module.exports.getRule = (id, callback) => {
|
|||
}
|
||||
break;
|
||||
case 'boolean':
|
||||
rule.formatted = rule.value.value ? 'Selected' : 'Not selected';
|
||||
rule.formatted = rule.value.value ? _('Selected') : _('Not selected');
|
||||
break;
|
||||
default:
|
||||
rule.formatted = rule.value.value || '';
|
||||
|
@ -424,7 +431,7 @@ module.exports.updateRule = (id, rule, callback) => {
|
|||
id = Number(id) || 0;
|
||||
|
||||
if (id < 1) {
|
||||
return callback(new Error('Missing Rule ID'));
|
||||
return callback(new Error(_('Missing Rule ID')));
|
||||
}
|
||||
|
||||
rule = tools.convertKeys(rule);
|
||||
|
@ -435,7 +442,7 @@ module.exports.updateRule = (id, rule, callback) => {
|
|||
}
|
||||
|
||||
if (!existingRule) {
|
||||
return callback(new Error('Selected rule not found'));
|
||||
return callback(new Error(_('Selected rule not found')));
|
||||
}
|
||||
|
||||
module.exports.get(existingRule.segment, (err, segment) => {
|
||||
|
@ -444,12 +451,12 @@ module.exports.updateRule = (id, rule, callback) => {
|
|||
}
|
||||
|
||||
if (!segment) {
|
||||
return callback(new Error('Selected segment not found'));
|
||||
return callback(new Error(_('Selected segment not found')));
|
||||
}
|
||||
|
||||
let column = segment.columns.filter(column => column.column === existingRule.column).pop();
|
||||
if (!column) {
|
||||
return callback(new Error('Invalid rule type'));
|
||||
return callback(new Error(_('Invalid rule type')));
|
||||
}
|
||||
|
||||
let value;
|
||||
|
@ -514,7 +521,7 @@ module.exports.deleteRule = (id, callback) => {
|
|||
id = Number(id) || 0;
|
||||
|
||||
if (id < 1) {
|
||||
return callback(new Error('Missing Rule ID'));
|
||||
return callback(new Error(_('Missing Rule ID')));
|
||||
}
|
||||
|
||||
db.getConnection((err, connection) => {
|
||||
|
@ -539,7 +546,7 @@ module.exports.getQuery = (id, prefix, callback) => {
|
|||
}
|
||||
|
||||
if (!segment) {
|
||||
return callback(new Error('Segment not found'));
|
||||
return callback(new Error(_('Segment not found')));
|
||||
}
|
||||
|
||||
prefix = prefix ? prefix + '.' : '';
|
||||
|
@ -648,7 +655,7 @@ module.exports.subscribers = (id, onlySubscribed, callback) => {
|
|||
return callback(err);
|
||||
}
|
||||
if (!segment) {
|
||||
return callback(new Error('Segment not found'));
|
||||
return callback(new Error(_('Segment not found')));
|
||||
}
|
||||
module.exports.getQuery(id, false, (err, queryData) => {
|
||||
if (err) {
|
||||
|
|
|
@ -10,6 +10,8 @@ let settings = require('./settings');
|
|||
let mailer = require('../mailer');
|
||||
let urllib = require('url');
|
||||
let log = require('npmlog');
|
||||
let _ = require('../translate')._;
|
||||
let util = require('util');
|
||||
|
||||
module.exports.list = (listId, start, limit, callback) => {
|
||||
listId = Number(listId) || 0;
|
||||
|
@ -83,7 +85,7 @@ module.exports.filter = (listId, request, columns, segmentId, callback) => {
|
|||
segmentId = Number(segmentId) || 0;
|
||||
|
||||
if (!listId) {
|
||||
return callback(new Error('Missing List ID'));
|
||||
return callback(new Error(_('Missing List ID')));
|
||||
}
|
||||
|
||||
let processQuery = queryData => {
|
||||
|
@ -228,7 +230,7 @@ module.exports.addConfirmation = (list, email, optInIp, data, callback) => {
|
|||
name: [].concat(data.firstName || []).concat(data.lastName || []).join(' '),
|
||||
address: email
|
||||
},
|
||||
subject: list.name + ': Please Confirm Subscription',
|
||||
subject: util.format(_('%s: Please Confirm Subscription'),list.name),
|
||||
encryptionKeys
|
||||
}, {
|
||||
html: 'emails/confirm-html.hbs',
|
||||
|
@ -319,7 +321,7 @@ module.exports.subscribe = (cid, optInIp, callback) => {
|
|||
}
|
||||
|
||||
if (!result.entryId) {
|
||||
return callback(new Error('Could not save subscription'));
|
||||
return callback(new Error(_('Could not save subscription')));
|
||||
}
|
||||
|
||||
db.getConnection((err, connection) => {
|
||||
|
@ -502,7 +504,7 @@ module.exports.get = (listId, cid, callback) => {
|
|||
cid = (cid || '').toString().trim();
|
||||
|
||||
if (!cid) {
|
||||
return callback(new Error('Missing Subbscription ID'));
|
||||
return callback(new Error(_('Missing Subbscription ID')));
|
||||
}
|
||||
|
||||
db.getConnection((err, connection) => {
|
||||
|
@ -532,7 +534,7 @@ module.exports.getById = (listId, id, callback) => {
|
|||
id = Number(id) || 0;
|
||||
|
||||
if (!id) {
|
||||
return callback(new Error('Missing Subbscription ID'));
|
||||
return callback(new Error(_('Missing Subbscription ID')));
|
||||
}
|
||||
|
||||
db.getConnection((err, connection) => {
|
||||
|
@ -560,7 +562,7 @@ module.exports.getById = (listId, id, callback) => {
|
|||
|
||||
module.exports.getByEmail = (listId, email, callback) => {
|
||||
if (!email) {
|
||||
return callback(new Error('Missing Subbscription email address'));
|
||||
return callback(new Error(_('Missing Subbscription email address')));
|
||||
}
|
||||
|
||||
db.getConnection((err, connection) => {
|
||||
|
@ -635,11 +637,11 @@ module.exports.update = (listId, cid, updates, allowEmail, callback) => {
|
|||
let values = [];
|
||||
|
||||
if (listId < 1) {
|
||||
return callback(new Error('Missing List ID'));
|
||||
return callback(new Error(_('Missing List ID')));
|
||||
}
|
||||
|
||||
if (!cid) {
|
||||
return callback(new Error('Missing subscription ID'));
|
||||
return callback(new Error(_('Missing subscription ID')));
|
||||
}
|
||||
|
||||
fields.list(listId, (err, fieldList) => {
|
||||
|
@ -698,11 +700,11 @@ module.exports.unsubscribe = (listId, email, campaignId, callback) => {
|
|||
campaignId = (campaignId || '').toString().trim() || false;
|
||||
|
||||
if (listId < 1) {
|
||||
return callback(new Error('Missing List ID'));
|
||||
return callback(new Error(_('Missing List ID')));
|
||||
}
|
||||
|
||||
if (!email) {
|
||||
return callback(new Error('Missing email address'));
|
||||
return callback(new Error(_('Missing email address')));
|
||||
}
|
||||
|
||||
db.getConnection((err, connection) => {
|
||||
|
@ -884,11 +886,11 @@ module.exports.delete = (listId, cid, callback) => {
|
|||
cid = (cid || '').toString().trim();
|
||||
|
||||
if (listId < 1) {
|
||||
return callback(new Error('Missing List ID'));
|
||||
return callback(new Error(_('Missing List ID')));
|
||||
}
|
||||
|
||||
if (!cid) {
|
||||
return callback(new Error('Missing subscription ID'));
|
||||
return callback(new Error(_('Missing subscription ID')));
|
||||
}
|
||||
|
||||
db.getConnection((err, connection) => {
|
||||
|
@ -987,11 +989,11 @@ module.exports.updateImport = (listId, importId, data, callback) => {
|
|||
importId = Number(importId) || 0;
|
||||
|
||||
if (listId < 1) {
|
||||
return callback(new Error('Missing List ID'));
|
||||
return callback(new Error(_('Missing List ID')));
|
||||
}
|
||||
|
||||
if (importId < 1) {
|
||||
return callback(new Error('Missing Import ID'));
|
||||
return callback(new Error(_('Missing Import ID')));
|
||||
}
|
||||
|
||||
let keys = [];
|
||||
|
@ -1041,11 +1043,11 @@ module.exports.getImport = (listId, importId, callback) => {
|
|||
importId = Number(importId) || 0;
|
||||
|
||||
if (listId < 1) {
|
||||
return callback(new Error('Missing List ID'));
|
||||
return callback(new Error(_('Missing List ID')));
|
||||
}
|
||||
|
||||
if (importId < 1) {
|
||||
return callback(new Error('Missing Import ID'));
|
||||
return callback(new Error(_('Missing Import ID')));
|
||||
}
|
||||
|
||||
db.getConnection((err, connection) => {
|
||||
|
@ -1081,7 +1083,7 @@ module.exports.getFailedImports = (importId, callback) => {
|
|||
importId = Number(importId) || 0;
|
||||
|
||||
if (importId < 1) {
|
||||
return callback(new Error('Missing Import ID'));
|
||||
return callback(new Error(_('Missing Import ID')));
|
||||
}
|
||||
|
||||
db.getConnection((err, connection) => {
|
||||
|
@ -1104,7 +1106,7 @@ module.exports.listImports = (listId, callback) => {
|
|||
listId = Number(listId) || 0;
|
||||
|
||||
if (listId < 1) {
|
||||
return callback(new Error('Missing List ID'));
|
||||
return callback(new Error(_('Missing List ID')));
|
||||
}
|
||||
|
||||
db.getConnection((err, connection) => {
|
||||
|
@ -1147,11 +1149,11 @@ module.exports.updateAddress = (list, cid, updates, optInIp, callback) => {
|
|||
let emailNew = (updates.emailNew || '').toString().trim();
|
||||
|
||||
if (!list || !list.id) {
|
||||
return callback(new Error('Missing List ID'));
|
||||
return callback(new Error(_('Missing List ID')));
|
||||
}
|
||||
|
||||
if (!cid) {
|
||||
return callback(new Error('Missing subscription ID'));
|
||||
return callback(new Error(_('Missing subscription ID')));
|
||||
}
|
||||
|
||||
tools.validateEmail(emailNew, false, err => {
|
||||
|
@ -1173,12 +1175,12 @@ module.exports.updateAddress = (list, cid, updates, optInIp, callback) => {
|
|||
}
|
||||
if (!rows || !rows.length) {
|
||||
connection.release();
|
||||
return callback(new Error('Unknown subscription ID'));
|
||||
return callback(new Error(_('Unknown subscription ID')));
|
||||
}
|
||||
|
||||
if (rows[0].email === emailNew) {
|
||||
connection.release();
|
||||
return callback(new Error('Nothing seems to be changed'));
|
||||
return callback(new Error(_('Nothing seems to be changed')));
|
||||
}
|
||||
|
||||
let old = rows[0];
|
||||
|
@ -1192,7 +1194,7 @@ module.exports.updateAddress = (list, cid, updates, optInIp, callback) => {
|
|||
}
|
||||
|
||||
if (rows && rows[0] && rows[0].id) {
|
||||
return callback(new Error('This address is already registered by someone else'));
|
||||
return callback(new Error(_('This address is already registered by someone else')));
|
||||
}
|
||||
|
||||
module.exports.addConfirmation(list, emailNew, optInIp, {
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
let db = require('../db');
|
||||
let tools = require('../tools');
|
||||
let _ = require('../translate')._;
|
||||
|
||||
let allowedKeys = ['description', 'editor_name', 'editor_data', 'html', 'text'];
|
||||
|
||||
|
@ -47,7 +48,7 @@ module.exports.get = (id, callback) => {
|
|||
id = Number(id) || 0;
|
||||
|
||||
if (id < 1) {
|
||||
return callback(new Error('Missing Template ID'));
|
||||
return callback(new Error(_('Missing Template ID')));
|
||||
}
|
||||
|
||||
db.getConnection((err, connection) => {
|
||||
|
@ -76,7 +77,7 @@ module.exports.create = (template, callback) => {
|
|||
let data = tools.convertKeys(template);
|
||||
|
||||
if (!(data.name || '').toString().trim()) {
|
||||
return callback(new Error('Template Name must be set'));
|
||||
return callback(new Error(_('Template Name must be set')));
|
||||
}
|
||||
|
||||
let name = (template.name || '').toString().trim();
|
||||
|
@ -118,11 +119,11 @@ module.exports.update = (id, updates, callback) => {
|
|||
let data = tools.convertKeys(updates);
|
||||
|
||||
if (id < 1) {
|
||||
return callback(new Error('Missing Template ID'));
|
||||
return callback(new Error(_('Missing Template ID')));
|
||||
}
|
||||
|
||||
if (!(data.name || '').toString().trim()) {
|
||||
return callback(new Error('Template Name must be set'));
|
||||
return callback(new Error(_('Template Name must be set')));
|
||||
}
|
||||
|
||||
let name = (updates.name || '').toString().trim();
|
||||
|
@ -159,7 +160,7 @@ module.exports.delete = (id, callback) => {
|
|||
id = Number(id) || 0;
|
||||
|
||||
if (id < 1) {
|
||||
return callback(new Error('Missing Template ID'));
|
||||
return callback(new Error(_('Missing Template ID')));
|
||||
}
|
||||
|
||||
db.getConnection((err, connection) => {
|
||||
|
|
|
@ -4,36 +4,37 @@ let tools = require('../tools');
|
|||
let db = require('../db');
|
||||
let lists = require('./lists');
|
||||
let util = require('util');
|
||||
let _ = require('../translate')._;
|
||||
|
||||
module.exports.defaultColumns = [{
|
||||
column: 'created',
|
||||
name: 'Sign up date',
|
||||
name: _('Sign up date'),
|
||||
type: 'date'
|
||||
}, {
|
||||
column: 'latest_open',
|
||||
name: 'Latest open',
|
||||
name: _('Latest open'),
|
||||
type: 'date'
|
||||
}, {
|
||||
column: 'latest_click',
|
||||
name: 'Latest click',
|
||||
name: _('Latest click'),
|
||||
type: 'date'
|
||||
}];
|
||||
|
||||
module.exports.defaultCampaignEvents = [{
|
||||
option: 'delivered',
|
||||
name: 'Delivered'
|
||||
name: _('Delivered')
|
||||
}, {
|
||||
option: 'opened',
|
||||
name: 'Has Opened'
|
||||
name: _('Has Opened')
|
||||
}, {
|
||||
option: 'clicked',
|
||||
name: 'Has Clicked'
|
||||
name: _('Has Clicked')
|
||||
}, {
|
||||
option: 'not_opened',
|
||||
name: 'Not Opened'
|
||||
name: _('Not Opened')
|
||||
}, {
|
||||
option: 'not_clicked',
|
||||
name: 'Not Clicked'
|
||||
name: _('Not Clicked')
|
||||
}];
|
||||
|
||||
let defaultColumnMap = {};
|
||||
|
@ -170,36 +171,36 @@ module.exports.create = (trigger, callback) => {
|
|||
let column;
|
||||
|
||||
if (!listId) {
|
||||
return callback(new Error('Missing or invalid list ID'));
|
||||
return callback(new Error(_('Missing or invalid list ID')));
|
||||
}
|
||||
|
||||
if (seconds < 0) {
|
||||
return callback(new Error('Days in the past are not allowed'));
|
||||
return callback(new Error(_('Days in the past are not allowed')));
|
||||
}
|
||||
|
||||
if (!rule || ['campaign', 'subscription'].indexOf(rule) < 0) {
|
||||
return callback(new Error('Missing or invalid trigger rule'));
|
||||
return callback(new Error(_('Missing or invalid trigger rule')));
|
||||
}
|
||||
|
||||
switch (rule) {
|
||||
case 'subscription':
|
||||
column = (trigger.column || '').toString().toLowerCase().trim();
|
||||
if (!column) {
|
||||
return callback(new Error('Invalid subscription configuration'));
|
||||
return callback(new Error(_('Invalid subscription configuration')));
|
||||
}
|
||||
break;
|
||||
case 'campaign':
|
||||
column = (trigger.campaignOption || '').toString().toLowerCase().trim();
|
||||
sourceCampaign = Number(trigger.sourceCampaign) || 0;
|
||||
if (!column || !sourceCampaign) {
|
||||
return callback(new Error('Invalid campaign configuration'));
|
||||
return callback(new Error(_('Invalid campaign configuration')));
|
||||
}
|
||||
if (sourceCampaign === destCampaign) {
|
||||
return callback(new Error('A campaing can not be a target for itself'));
|
||||
return callback(new Error(_('A campaing can not be a target for itself')));
|
||||
}
|
||||
break;
|
||||
default:
|
||||
return callback(new Error('Missing or invalid trigger rule'));
|
||||
return callback(new Error(_('Missing or invalid trigger rule')));
|
||||
}
|
||||
|
||||
lists.get(listId, (err, list) => {
|
||||
|
@ -207,7 +208,7 @@ module.exports.create = (trigger, callback) => {
|
|||
return callback(err);
|
||||
}
|
||||
if (!list) {
|
||||
return callback(new Error('Missing or invalid list ID'));
|
||||
return callback(new Error(_('Missing or invalid list ID')));
|
||||
}
|
||||
|
||||
db.getConnection((err, connection) => {
|
||||
|
@ -228,7 +229,7 @@ module.exports.create = (trigger, callback) => {
|
|||
|
||||
let id = result && result.insertId;
|
||||
if (!id) {
|
||||
return callback(new Error('Could not store trigger row'));
|
||||
return callback(new Error(_('Could not store trigger row')));
|
||||
}
|
||||
|
||||
createTriggerTable(id, err => {
|
||||
|
@ -245,7 +246,7 @@ module.exports.create = (trigger, callback) => {
|
|||
module.exports.update = (id, trigger, callback) => {
|
||||
id = Number(id) || 0;
|
||||
if (id < 1) {
|
||||
return callback(new Error('Missing or invalid Trigger ID'));
|
||||
return callback(new Error(_('Missing or invalid Trigger ID')));
|
||||
}
|
||||
|
||||
trigger = tools.convertKeys(trigger);
|
||||
|
@ -259,32 +260,32 @@ module.exports.update = (id, trigger, callback) => {
|
|||
let column;
|
||||
|
||||
if (seconds < 0) {
|
||||
return callback(new Error('Days in the past are not allowed'));
|
||||
return callback(new Error(_('Days in the past are not allowed')));
|
||||
}
|
||||
|
||||
if (!rule || ['campaign', 'subscription'].indexOf(rule) < 0) {
|
||||
return callback(new Error('Missing or invalid trigger rule'));
|
||||
return callback(new Error(_('Missing or invalid trigger rule')));
|
||||
}
|
||||
|
||||
switch (rule) {
|
||||
case 'subscription':
|
||||
column = (trigger.column || '').toString().toLowerCase().trim();
|
||||
if (!column) {
|
||||
return callback(new Error('Invalid subscription configuration'));
|
||||
return callback(new Error(_('Invalid subscription configuration')));
|
||||
}
|
||||
break;
|
||||
case 'campaign':
|
||||
column = (trigger.campaignOption || '').toString().toLowerCase().trim();
|
||||
sourceCampaign = Number(trigger.sourceCampaign) || 0;
|
||||
if (!column || !sourceCampaign) {
|
||||
return callback(new Error('Invalid campaign configuration'));
|
||||
return callback(new Error(_('Invalid campaign configuration')));
|
||||
}
|
||||
if (sourceCampaign === destCampaign) {
|
||||
return callback(new Error('A campaing can not be a target for itself'));
|
||||
return callback(new Error(_('A campaing can not be a target for itself')));
|
||||
}
|
||||
break;
|
||||
default:
|
||||
return callback(new Error('Missing or invalid trigger rule'));
|
||||
return callback(new Error(_('Missing or invalid trigger rule')));
|
||||
}
|
||||
|
||||
db.getConnection((err, connection) => {
|
||||
|
@ -312,7 +313,7 @@ module.exports.delete = (id, callback) => {
|
|||
id = Number(id) || 0;
|
||||
|
||||
if (id < 1) {
|
||||
return callback(new Error('Missing Trigger ID'));
|
||||
return callback(new Error(_('Missing Trigger ID')));
|
||||
}
|
||||
|
||||
db.getConnection((err, connection) => {
|
||||
|
|
|
@ -9,6 +9,7 @@ let mailer = require('../mailer');
|
|||
let settings = require('./settings');
|
||||
let crypto = require('crypto');
|
||||
let urllib = require('url');
|
||||
let _ = require('../translate')._;
|
||||
|
||||
/**
|
||||
* Fetches user by ID value
|
||||
|
@ -99,7 +100,7 @@ module.exports.add = (username, password, email, callback) => {
|
|||
|
||||
let id = result && result.insertId;
|
||||
if (!id) {
|
||||
return callback(new Error('Could not store user row'));
|
||||
return callback(new Error(_('Could not store user row')));
|
||||
}
|
||||
|
||||
return callback(null, id);
|
||||
|
@ -169,7 +170,7 @@ module.exports.authenticate = (username, password, callback) => {
|
|||
module.exports.update = (id, updates, callback) => {
|
||||
|
||||
if (!updates.email) {
|
||||
return callback(new Error('Email Address must be set'));
|
||||
return callback(new Error(_('Email Address must be set')));
|
||||
}
|
||||
|
||||
let update = (connection, callback) => {
|
||||
|
@ -180,7 +181,7 @@ module.exports.update = (id, updates, callback) => {
|
|||
}
|
||||
|
||||
if (!rows.length) {
|
||||
return callback('Failed to check user data');
|
||||
return callback(_('Failed to check user data'));
|
||||
}
|
||||
|
||||
let keys = ['email'];
|
||||
|
@ -191,7 +192,7 @@ module.exports.update = (id, updates, callback) => {
|
|||
connection.query('UPDATE users SET ' + keys.map(key => key + '=?').join(', ') + ' WHERE id=? LIMIT 1', values, (err, result) => {
|
||||
if (err) {
|
||||
if (err.code === 'ER_DUP_ENTRY') {
|
||||
err = new Error('Can\'t change email as another user with the same email address already exists');
|
||||
err = new Error(_('Can\'t change email as another user with the same email address already exists'));
|
||||
}
|
||||
return callback(err);
|
||||
}
|
||||
|
@ -208,15 +209,15 @@ module.exports.update = (id, updates, callback) => {
|
|||
return callback(err);
|
||||
}
|
||||
if (!result) {
|
||||
return callback('Incorrect current password');
|
||||
return callback(_('Incorrect current password'));
|
||||
}
|
||||
|
||||
if (!updates.password) {
|
||||
return callback(new Error('New password not set'));
|
||||
return callback(new Error(_('New password not set')));
|
||||
}
|
||||
|
||||
if (updates.password !== updates.password2) {
|
||||
return callback(new Error('Passwords do not match'));
|
||||
return callback(new Error(_('Passwords do not match')));
|
||||
}
|
||||
|
||||
bcrypt.hash(updates.password, null, null, (err, hash) => {
|
||||
|
@ -254,7 +255,7 @@ module.exports.resetToken = (id, callback) => {
|
|||
id = Number(id) || 0;
|
||||
|
||||
if (!id) {
|
||||
return callback(new Error('User ID not set'));
|
||||
return callback(new Error(_('User ID not set')));
|
||||
}
|
||||
|
||||
db.getConnection((err, connection) => {
|
||||
|
@ -282,7 +283,7 @@ module.exports.sendReset = (username, callback) => {
|
|||
username = (username || '').toString().trim();
|
||||
|
||||
if (!username) {
|
||||
return callback(new Error('Username must be set'));
|
||||
return callback(new Error(_('Username must be set')));
|
||||
}
|
||||
|
||||
db.getConnection((err, connection) => {
|
||||
|
@ -319,7 +320,7 @@ module.exports.sendReset = (username, callback) => {
|
|||
to: {
|
||||
address: rows[0].email
|
||||
},
|
||||
subject: 'Mailer password change request'
|
||||
subject: _('Mailer password change request')
|
||||
}, {
|
||||
html: 'emails/password-reset-html.hbs',
|
||||
text: 'emails/password-reset-text.hbs',
|
||||
|
@ -343,7 +344,7 @@ module.exports.sendReset = (username, callback) => {
|
|||
|
||||
module.exports.checkResetToken = (username, resetToken, callback) => {
|
||||
if (!username || !resetToken) {
|
||||
return callback(new Error('Missing username or reset token'));
|
||||
return callback(new Error(_('Missing username or reset token')));
|
||||
}
|
||||
db.getConnection((err, connection) => {
|
||||
if (err) {
|
||||
|
@ -363,11 +364,11 @@ module.exports.resetPassword = (data, callback) => {
|
|||
let updates = tools.convertKeys(data);
|
||||
|
||||
if (!updates.username || !updates.resetToken) {
|
||||
return callback(new Error('Missing username or reset token'));
|
||||
return callback(new Error(_('Missing username or reset token')));
|
||||
}
|
||||
|
||||
if (!updates.password || !updates.password2 || updates.password !== updates.password2) {
|
||||
return callback(new Error('Invalid new password'));
|
||||
return callback(new Error(_('Invalid new password')));
|
||||
}
|
||||
|
||||
bcrypt.hash(updates.password, null, null, (err, hash) => {
|
||||
|
|
|
@ -2,6 +2,8 @@
|
|||
|
||||
let config = require('config');
|
||||
let log = require('npmlog');
|
||||
let _ = require('./translate')._;
|
||||
let util = require('util');
|
||||
|
||||
let passport = require('passport');
|
||||
let LocalStrategy = require('passport-local').Strategy;
|
||||
|
@ -33,7 +35,7 @@ module.exports.setup = app => {
|
|||
|
||||
module.exports.logout = (req, res) => {
|
||||
if (req.user) {
|
||||
req.flash('info', req.user.username + ' logged out');
|
||||
req.flash('info', util.format(_('%s logged out'), req.user.username));
|
||||
req.logout();
|
||||
}
|
||||
res.redirect('/');
|
||||
|
@ -46,7 +48,7 @@ module.exports.login = (req, res, next) => {
|
|||
return next(err);
|
||||
}
|
||||
if (!user) {
|
||||
req.flash('danger', info && info.message || 'Failed to authenticate user');
|
||||
req.flash('danger', info && info.message || _('Failed to authenticate user'));
|
||||
return res.redirect('/users/login' + (req.body.next ? '?next=' + encodeURIComponent(req.body.next) : ''));
|
||||
}
|
||||
req.logIn(user, err => {
|
||||
|
@ -62,7 +64,7 @@ module.exports.login = (req, res, next) => {
|
|||
req.session.cookie.expires = false;
|
||||
}
|
||||
|
||||
req.flash('success', 'Logged in as ' + user.username);
|
||||
req.flash('success', util.format(_('Logged in as %s'), user.username));
|
||||
return res.redirect(req.body.next || '/');
|
||||
});
|
||||
})(req, res, next);
|
||||
|
@ -120,7 +122,7 @@ if (config.ldap.enabled && LdapStrategy) {
|
|||
|
||||
if (!user) {
|
||||
return done(null, false, {
|
||||
message: 'Incorrect username or password'
|
||||
message: _('Incorrect username or password')
|
||||
});
|
||||
}
|
||||
|
||||
|
|
20
lib/tools.js
20
lib/tools.js
|
@ -6,6 +6,8 @@ let Isemail = require('isemail');
|
|||
let urllib = require('url');
|
||||
let juice = require('juice');
|
||||
let jsdom = require('jsdom');
|
||||
let _ = require('./translate')._;
|
||||
let util = require('util');
|
||||
|
||||
let blockedUsers = ['abuse', 'admin', 'billing', 'compliance', 'devnull', 'dns', 'ftp', 'hostmaster', 'inoc', 'ispfeedback', 'ispsupport', 'listrequest', 'list', 'maildaemon', 'noc', 'noreply', 'noreply', 'null', 'phish', 'phishing', 'postmaster', 'privacy', 'registrar', 'root', 'security', 'spam', 'support', 'sysadmin', 'tech', 'undisclosedrecipients', 'unsubscribe', 'usenet', 'uucp', 'webmaster', 'www'];
|
||||
|
||||
|
@ -106,19 +108,19 @@ function updateMenu(res) {
|
|||
}
|
||||
|
||||
res.locals.menu.push({
|
||||
title: 'Lists',
|
||||
title: _('Lists'),
|
||||
url: '/lists',
|
||||
key: 'lists'
|
||||
}, {
|
||||
title: 'Templates',
|
||||
title: _('Templates'),
|
||||
url: '/templates',
|
||||
key: 'templates'
|
||||
}, {
|
||||
title: 'Campaigns',
|
||||
title: _('Campaigns'),
|
||||
url: '/campaigns',
|
||||
key: 'campaigns'
|
||||
}, {
|
||||
title: 'Automation',
|
||||
title: _('Automation'),
|
||||
url: '/triggers',
|
||||
key: 'triggers'
|
||||
});
|
||||
|
@ -128,7 +130,7 @@ function validateEmail(address, checkBlocked, callback) {
|
|||
|
||||
let user = (address || '').toString().split('@').shift().toLowerCase().replace(/[^a-z0-9]/g, '');
|
||||
if (checkBlocked && blockedUsers.indexOf(user) >= 0) {
|
||||
return callback(new Error('Blocked email address "' + address + '"'));
|
||||
return callback(new Error(util.format(_('Blocked email address "%s"'), address)));
|
||||
}
|
||||
|
||||
Isemail.validate(address, {
|
||||
|
@ -137,16 +139,16 @@ function validateEmail(address, checkBlocked, callback) {
|
|||
}, result => {
|
||||
|
||||
if (result !== 0) {
|
||||
let message = 'Invalid email address "' + address + '"';
|
||||
let message = util.format(_('Invalid email address "%s".'), address);
|
||||
switch (result) {
|
||||
case 5:
|
||||
message += '. MX record not found for domain';
|
||||
message += ' ' + _('MX record not found for domain');
|
||||
break;
|
||||
case 6:
|
||||
message += '. Address domain not found';
|
||||
message += ' ' + _('Address domain not found');
|
||||
break;
|
||||
case 12:
|
||||
message += '. Address domain name is required';
|
||||
message += ' ' + _('Address domain name is required');
|
||||
break;
|
||||
}
|
||||
return callback(new Error(message));
|
||||
|
|
|
@ -8,6 +8,7 @@ const fs = require('fs');
|
|||
const path = require('path');
|
||||
const log = require('npmlog');
|
||||
const gettextParser = require('gettext-parser');
|
||||
const fakelang = require('./fakelang');
|
||||
|
||||
const language = config.language || 'en';
|
||||
|
||||
|
@ -31,5 +32,10 @@ module.exports._ = str => {
|
|||
if (typeof str !== 'string') {
|
||||
str = String(str);
|
||||
}
|
||||
|
||||
if (language === 'zz') {
|
||||
return fakelang(str);
|
||||
}
|
||||
|
||||
return gt.dgettext(language, str);
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue