From e91fbe191c48456f9aeacefde732b436b23d6e12 Mon Sep 17 00:00:00 2001 From: Vitor George Date: Mon, 28 Apr 2014 12:36:17 -0300 Subject: [PATCH 01/10] fix ttl error --- config/express.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/config/express.js b/config/express.js index 7f4e6ef..a9daedd 100644 --- a/config/express.js +++ b/config/express.js @@ -83,8 +83,10 @@ module.exports = function (app, config, passport) { store: new mongoStore({ url: config.db, collection : 'sessions' + }, function(){ + console.log('Connection to Mongo opened.'); }) - })) + })); // Passport session app.use(passport.initialize()) From eb8ed6cd69d3ab6665a44aad572f3092f20c8bfb Mon Sep 17 00:00:00 2001 From: Vitor George Date: Mon, 28 Apr 2014 13:42:01 -0300 Subject: [PATCH 02/10] i18n --- app/controllers/access_token.js | 34 ++++++------ app/controllers/admin.js | 2 +- app/controllers/contents.js | 39 ++++++-------- app/controllers/features.js | 36 ++++++------- app/controllers/images.js | 10 ++-- app/controllers/layers.js | 62 +++++++++++----------- app/controllers/maps.js | 15 +++--- app/controllers/users.js | 11 ++-- app/models/user.js | 4 +- config/express.js | 2 +- config/passport.js | 4 +- lib/messages.js | 91 +++++++++++++++++++-------------- locales/en/translation.json | 28 +++++----- locales/pt-BR/translation.json | 6 ++- 14 files changed, 178 insertions(+), 166 deletions(-) diff --git a/app/controllers/access_token.js b/app/controllers/access_token.js index e7f62c3..ae942d6 100644 --- a/app/controllers/access_token.js +++ b/app/controllers/access_token.js @@ -24,7 +24,7 @@ var generateAccessToken = function(user, res) { token.save(function(err) { if (err) { console.log(err); - return res.json(401, messages.errors(err)); + return res.json(401, {messages: messages.mongooseErrors(req.i18n, err)}); } var response = _.extend({ @@ -57,13 +57,13 @@ var authSocialUser = function(provider, profile, res) { User.load({email: userProfile.email}, function(err, user){ if (err) - return res.json(401, messages.error('Aconteceu um erro ao gerar o token.')); + return res.json(401, {messages: messages.error(req.i18n.t('access_token:tokenGenerationError.'))}); if (!user) { user = new User(userProfile); user.save(function(err){ if (err) - return res.json(401, messages.error('Erro gravando usuário.')); + return res.json(401, {messages: messages.error(req.i18n.t('Error while saving user.'))}); generateAccessToken(user, res); }) } else { @@ -75,7 +75,7 @@ var authSocialUser = function(provider, profile, res) { if (user.isModified) { user.save(function(err){ - if (err) return res.json(err); + if (err) return res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); generateAccessToken(user, res); }) } else generateAccessToken(user, res); @@ -110,7 +110,7 @@ exports.google = function(req, res){ }); } } else { - return res.json(400, messages.error('Missing Google authorization token.')); + return res.json(400, {messages: messages.error(req.i18n.t('Missing Google authorization token.'))}); } } @@ -142,7 +142,7 @@ exports.facebook = function(req, res, next) { }); } } else { - return res.json(400, messages.error('Missing Facebook authorization token.')); + return res.json(400, {messages: messages.error(req.i18n.t('Missing Facebook authorization token.'))}); } @@ -154,37 +154,37 @@ exports.local = function(req, res, next) { // Unknown error if (err) { - return res.json(400, messages.errors(err)); + return res.json(400, {messages: messages.mongooseError(req.i18n, err)}); // Error raised by passport } else if (info && info.message) { - res.json(400, messages.error(info.message)); + res.json(400, { messages: messages.error(req.i18n.t(info.message))}); // User not found. } else if (!user) { - return res.json(403, messages.error("Unauthorized.")); + return res.json(403, { messages: messages.error(req.i18n.t("Unauthorized."))}); } // User needs to finish migration. else if (user.status == 'to_migrate') { - return res.json(400, messages.error("Sua conta não foi migrada ainda. Visite esta página.")); + return res.json(400, {messages: messages.error(req.i18n.t("Your account wasn't migrated yet, please visit this page."))}); // User doesn't have a password, because it logged before via Facebook or Google } else if (!user.hashed_password) { mailer.passwordNeeded(user, req.app.locals.settings.general.serverUrl, user.callback_url, function(err){ if (err) - return res.json(400, messages.error("Você precisa de uma senha para acessar sua conta, mas houve um erro. Por favor, contate o suporte.")); + return res.json(400, { messages: messages.error(req.i18n.t("There was an error while sending a password token to your e-mail."))}); else - return res.json(400, messages.error("Você precisa de uma senha para acessar sua conta. Verifique seu e-mail para continuar.")); + return res.json(400, { messages: messages.error(req.i18n.t("Your need a password to acccess your profile. Check your e-mail to continue."))}); }); // User needs to confirm his email } else if (user.needsEmailConfirmation) { mailer.confirmEmail(user, req.app.locals.settings.general.serverUrl, req.body.callback_url, function(err){ if (err) - return res.json(400, messages.error("Erro ao enviar e-mail de ativação, por favor, contate o suporte.")); + return res.json(400, {messages: messages.error(req.i18n.t("Erro ao enviar e-mail de ativação, por favor, contate o suporte."))}); else - return res.json(400, messages.error("Você ainda não ativou sua conta. Verifique seu e-mail.")); + return res.json(400, {messages: messages.error(req.i18n.t("Você ainda não ativou sua conta. Verifique seu e-mail."))}); }); // Login successful, proceed with token @@ -207,16 +207,16 @@ exports.logout = function(req, res, next) { var access_token = req.headers.authorization.split(' ')[1]; AccessToken.findOne({_id: access_token}, function(err, at){ if (err) return res.json(400, err); - if (!at) return res.json(400, messages.error("Can't find access token.")); + if (!at) return res.json(400, {messages: messages.error(req.i18n.t("Can't find access token."))}); at.expired = true; at.save(function(err){ if (err) return res.json(400, err); - else return res.json(messages.success('Logout successful.')); + else return res.json({messags: messages.success(req.i18n.t('Logout successful.'))}); }); }); } else { - res.json(400, messages.error('You are not logged in.')); + res.json(400, {messages: messages.error(req.i18n.t('You are not logged in.'))}); } diff --git a/app/controllers/admin.js b/app/controllers/admin.js index c053c76..f24ec43 100644 --- a/app/controllers/admin.js +++ b/app/controllers/admin.js @@ -68,7 +68,7 @@ exports.firstAdmin = function(req, res) { } else { user.save(function (err) { if (err) { - res.render('admin/first_admin', {messages: messages.mongooseErrors(err)}); + res.render('admin/first_admin', {messages: messages.mongooseErrors(req.i18n, err)}); } else { req.flash('info', 'Admin created successfully.'); diff --git a/app/controllers/contents.js b/app/controllers/contents.js index 37e38ef..c69c2e3 100644 --- a/app/controllers/contents.js +++ b/app/controllers/contents.js @@ -3,11 +3,11 @@ * Module dependencies. */ -var mongoose = require('mongoose'), +var + messages = require('../../lib/messages'), + mongoose = require('mongoose'), Content = mongoose.model('Content'), Layer = mongoose.model('Layer'), - utils = require('../../lib/utils'), - extend = require('util')._extend, _ = require('underscore'); /** @@ -19,12 +19,7 @@ exports.load = function(req, res, next, id) { if (err) { return next(err) } else if (!content) { - return res.json(400, { - messages: [{ - status: 'error', - message: 'Content not found.' - }] - }); + return res.json(400, { messages: messages.error(req.i18n.t('Content not found.'))}); } else { req.content = content; next(); @@ -57,9 +52,9 @@ exports.index = function(req, res){ } Content.list(options, function(err, contents) { - if (err) return res.json(400, utils.errorMessages(err.errors || err)); + if (err) return res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); Content.count(options.criteria).exec(function (err, count) { - if (err) res.json(400, utils.errorMessages(err.errors || err)); + if (err) res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); else res.json({options: options, contentsTotal: count, contents: contents}); }) }) @@ -82,18 +77,18 @@ exports.create = function (req, res) { content.creator = req.user; Layer.findById(req.body['layer'], function(err, layer){ - if (err) res.json(400, utils.errorMessages(err.errors || err)); + if (err) res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); else { layer.contents.addToSet(content); layer.save(function(err){ - if (err) res.json(400, utils.errorMessages(err.errors || err)); + if (err) res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); else { content.updateSirTrevor(req.body.sirTrevorData, function(err, ct){ - if (err) res.json(400, utils.errorMessages(err.errors || err)); + if (err) res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); else content.save(function(err){ // console.log('salvou o content assim\n'+content); - if (err) res.json(400, utils.errorMessages(err.errors || err)); + if (err) res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); else res.json(content); }); }); @@ -117,13 +112,13 @@ exports.update = function(req, res){ delete req.body['creator']; delete req.body.layer; - content = extend(content, req.body) + content = _.extend(content, req.body) content.updateSirTrevor(updatedSirTrevor, function(err, ct){ - if (err) res.json(400, utils.errorMessages(err.errors || err)); + if (err) res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); else ct.save(function(err){ - if (err) res.json(400, utils.errorMessages(err.errors || err)); + if (err) res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); else res.json(ct); }); }); @@ -148,17 +143,17 @@ exports.destroy = function(req, res){ content = req.content; mongoose.model('Layer').findById(content.layer._id, function(err, layer){ - if (err) res.json(400, utils.errorMessages(err.errors || err)); + if (err) res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); else { layer.contents.pull({_id: content._id}); layer.save(function(err){ - if (err) res.json(400, utils.errorMessages(err.errors || err)); + if (err) res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); else { content.remove(function(err){ - if (err) res.json(400, utils.errorMessages(err.errors || err)); - else res.json({messages: [{status: 'ok', text: 'Content removed successfully.'}]}); + if (err) res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); + else res.json({messages: messages.success(req.i18n.t('Content removed successfully.'))}); }) } }) diff --git a/app/controllers/features.js b/app/controllers/features.js index a9d374c..e587799 100644 --- a/app/controllers/features.js +++ b/app/controllers/features.js @@ -8,7 +8,6 @@ var mongoose = require('mongoose'), Feature = mongoose.model('Feature'), Content = mongoose.model('Content'), - extend = require('util')._extend, messages = require('../../lib/messages'), async = require('async'); @@ -21,12 +20,7 @@ exports.load = function(req, res, next, id){ if (err) { return next(err) } else if (!feature) { - return res.json(400, { - messages: [{ - status: 'error', - message: 'Feature not found.' - }] - }); + return res.json(400, {messages: messages.error(req.i18n.t("Can't find feature"))}); } else { req.feature = feature; next(); @@ -47,12 +41,12 @@ exports.index = function(req, res){ } Feature.list(options, function(err, features) { - if (err) return res.json(400, messages.errors(err)); + if (err) return res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); Feature.count().exec(function (err, count) { if (!err) { res.json({options: options, featuresTotal: count, features: features}); } else { - res.json(400, messages.errors(err)) + res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); } }) }) @@ -72,14 +66,14 @@ exports.create = function (req, res) { // save feature feature.save(function (err) { if (err) { - res.json(400, messages.errors(err)); + res.json(400, messages.mongooseErrors(req.i18n, err)); } else { var layer = feature.layer; layer.features.addToSet(feature); // save layer layer.save(function(err){ - if (err) res.json(400, messages.errors(err)); + if (err) res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); res.json(feature); }); } @@ -130,10 +124,10 @@ exports.update = function(req, res){ delete req.body.geometry; } - feature = extend(feature, req.body); + feature = _.extend(feature, req.body); feature.save(function(err) { - if (err) res.json(400, messages.errors(err)); + if (err) res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); else res.json(feature); }); } @@ -159,10 +153,10 @@ exports.addContent = function(req, res){ // save both content.save(function(err){ - if (err) res.json(400, messages.errors(err)); + if (err) res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); feature.save(function(err){ if (err) res.json(400,err) - else res.json(messages.success('Content added successfully.')); + else res.json({messages: messages.success(req.i18n.t('Content added successfully.'))}); }); }); @@ -187,10 +181,10 @@ exports.removeContent = function(req, res){ // save both content.save(function(err){ - if (err) res.json(400, utils.errorMessages(err.errors || err)); + if (err) res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); feature.save(function(err){ - if (err) res.json(400,err) - else res.json(messages.success('Content removed successfully.')); + if (err) res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); + else res.json({messages: messages.success(req.i18n.t('Content removed successfully.'))}); }); }); } @@ -224,12 +218,12 @@ exports.import = function(req, res) { } }); }, function(err) { - if(err) res.json(400, messages.errors(err)); + if(err) res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); else { // save layer layer.save(function(err){ if(err) { - if(err) res.json(400, messages.errors(err)); + if(err) res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); } else { res.json(layer.features); } @@ -237,6 +231,6 @@ exports.import = function(req, res) { } }); } else { - res.json(messages.error('A importação de arquivos está desabilitada.')); + res.json({messages: messages.error(req.i18n.t('Geo files import is disabled.'))}); } } diff --git a/app/controllers/images.js b/app/controllers/images.js index 082d4c4..826b486 100644 --- a/app/controllers/images.js +++ b/app/controllers/images.js @@ -19,7 +19,7 @@ var exports.load = function (req, res, next, id) { Image.load(id, function (err, image) { if (err) return next(err) - if (!image) return res.json(400, { messages: [{status: 'error', text: 'Image not found.'}] }); + if (!image) return res.json(400, { messages: messages.error(req.i18n.t('Image not found.'))}); req.image = image next() }); @@ -52,7 +52,7 @@ exports.showForm = function (req, res) { exports.create = function (req, res) { if (!req.files.attachment.file) - return res.json(400, {errors: [new Error('Image file not found')]}); + return res.json(400, {messages: messages.error(req.i18n.t('Image file not found'))}); else { var image = new Image(); @@ -60,7 +60,7 @@ exports.create = function (req, res) { baseUrl = process.env.APP_URL + '/uploads/images/img_'; image.uploadImageAndSave(req.files.attachment.file, baseUrl, function(err){ - if (err) return res.json(400, utils.errorMessages(err.errors || err)); + if (err) return res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); else res.json(image); }) } @@ -72,7 +72,7 @@ exports.create = function (req, res) { exports.destroy = function (req, res) { req.image.remove(function(err) { - if (err) res.json(400, utils.errorMessages(err.errors || err)) - else res.json({ messages: [{status: 'ok', text: 'Content removed successfully.'}] }); + if (err) res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); + else res.json({ messages: messages.success(req.i18n.t('Content removed successfully.'))}); }); } \ No newline at end of file diff --git a/app/controllers/layers.js b/app/controllers/layers.js index cf19b29..c6539a8 100644 --- a/app/controllers/layers.js +++ b/app/controllers/layers.js @@ -3,14 +3,14 @@ * Module dependencies. */ -var mongoose = require('mongoose'), +var + messages = require('../../lib/messages'), + mongoose = require('mongoose'), Layer = mongoose.model('Layer'), Feature = mongoose.model('Feature'), Content = mongoose.model('Content'), User = mongoose.model('User'), mailer = require('../../lib/mailer'), - utils = require('../../lib/utils'), - extend = require('util')._extend, _ = require('underscore'), async = require('async'); @@ -19,9 +19,12 @@ var mongoose = require('mongoose'), */ exports.load = function(req, res, next, id){ + console.log(req.locale); Layer.load(id, function (err, layer) { - if (err) return res.json(400, { messages: [{status: 'error', text: 'Erro ao carregar camada.'}] }); - else if (!layer) return res.json(400, { messages: [{status: 'error', text: 'Camada não encontrada.'}] }); + if (err) + return res.json(400, {messages: messages.error(req.i18n.t('Error loading layer.'))}); + else if (!layer) + return res.json(400, {messages: messages.error(req.i18n.t('Layer not found.'))}); else { req.layer = layer next() @@ -61,12 +64,12 @@ exports.index = function(req, res){ } Layer.list(options, function(err, layers) { - if (err) return res.json(400, err); + if (err) return res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); Layer.count(options.criteria).exec(function (err, count) { if (!err) { res.json({options: options, layersTotal: count, layers: layers}); } else { - res.json(400, utils.errorMessages(err.errors || err)) + res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); } }); }); @@ -118,7 +121,7 @@ exports.create = function (req, res) { if (!type) { - return res.json(400, { messages: [{status: 'error', text: 'Layer type missing.'}] }) + return res.json(400, { messages: messages.error(req.i18n.t('Layer type missing.')) } ); } else if (type == 'TileLayer') { @@ -144,9 +147,9 @@ exports.create = function (req, res) { layer.save(function (err) { if (!err) { - res.json({ layer: layer, messages: [{status: 'ok', text: 'Camada gerada com sucesso.'}] }); + res.json({ layer: layer, messages: messages.success(req.i18n.t('Layer created successfully.'))}); } else { - res.json(400, utils.errorMessages(err.errors || err)) + res.json(400, {messages: messages.mongooseError(req.i18n, err)}); } }) } @@ -164,16 +167,17 @@ exports.update = function(req, res){ delete req.body['__v']; if (req.layer == 'TileLayer') { - return res.json(400, { messages: [{status: 'error', text: "Não foi possível atualizar o TileLayer."}] }); + return res.json(400, { messages: messages.error(req.i18n.t("Can't update TileLayer.") ) } ); } - layer = extend(layer, req.body); + layer = _.extend(layer, req.body); layer.save(function(err) { if (!err) { - res.json({ layer: layer, messages: [{status: 'ok', text: 'Camada atualizada com sucesso.'}] }) + res.json({ layer: layer, messages: messages.success(req.i18n.t('Layer updated successfully.'))}); } else { - res.json(400, utils.errorMessages(err.errors || err)) + console.log(err); + res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); } }) } @@ -186,9 +190,9 @@ exports.destroy = function(req, res){ var layer = req.layer layer.remove(function(err){ if(err) { - res.json(400, utils.errorMessages(err.errors || err)); + res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); } else { - res.json({ messages: [{status: 'ok', text: 'Camada removida com sucesso.'}] }); + res.json({ messages: messages.success(req.i18n.t('Layer removed successfully'))}); } }) } @@ -208,9 +212,9 @@ exports.addFeature = function (req, res) { } feature.save(function(err){ - if (err) res.json(400, utils.errorMessages(err.errors || err)); + res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); layer.save(function(err){ - if (err) res.json(400,utils.errorMessages(err.errors || err)) + if (err) res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); else res.json(feature); }) }) @@ -226,10 +230,10 @@ exports.removeFeature = function (req, res) { layer = req.layer; var saveLayer = function(err) { - if (err) res.json(400, utils.errorMessages(err.errors || err)); + if (err) res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); layer.features = _.filter(layer.features, function(f) { return !f._id.equals(feature._id); }); layer.save(function(err) { - if (err) res.json(400,utils.errorMessages(err.errors || err)); + if (err) res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); else res.json(feature); }); } @@ -249,18 +253,18 @@ exports.addContributor = function (req, res) { layer = req.layer; if (contributorEmail == req.user.email) { - res.json(400, { messages: [{status:'error', text: "O usuário já é o criador da camada."}] }) + res.json(400, { messages: messages.error(req.i18n.t("User is already layer creator."))}); } else { User.findOne({email: contributorEmail}, function(err, user){ if (err) { - res.json(400, utils.errorMessages(err.errors || err)) + res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); } else if (!user) { - res.json(400, { messages: [{status:'error', text: "Não foi encontrar usuário com email "+contributorEmail+"."}] }) + res.json(400, { messages: messages.error(req.i18n.t("Can't find user with this e-mail"))}); } else { layer.contributors.addToSet(user); layer.save(function(err){ if (err) - res.json(400, { messages: utils.errors(err.errors || err) }) + res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); else Layer .findById(layer._id) @@ -272,8 +276,8 @@ exports.addContributor = function (req, res) { creator: req.user, contributor: user }, function(err){ - if (err) res.json(400, { messages: [{status:'error', text: "Erro ao enviar e-mail de aviso ao contribuidor."}] }) - res.json({ layer: updatedLayer, messages: [{status:'ok', text: 'Contribuidor adicionado com sucesso'}] }); + if (err) res.json(400, { messages: messages.error(req.i18n.t("Error while sending e-mail to contributor."))}) + res.json({ layer: updatedLayer, messages: messages.success(req.i18n.t('Contributor added successfully.'))}); }); }); }); @@ -296,17 +300,17 @@ exports.removeContributor = function (req, res) { layer.contributors.pull({_id: contributorId}); if (contributorCount == layer.contributors.lentgh) { - res.json(400, { messages: [{status:'error', text: "Invalid contributor id."}] }) + res.json(400, { messages: messages.error( req.i18n.t( "Invalid contributor id.") ) } ); } else { layer.save(function(err){ if (err) { - res.json(400, utils.errorMessagesutils( err.errors || err) ); + res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); } else { Layer .findById(layer._id) .populate('contributors', 'name username email') .exec(function(err, updatedLayer){ - res.json({ layer: updatedLayer, messages: [{status:'ok', text: 'Contributor removed successfully'}] }) + res.json({ layer: updatedLayer, messages: messages.success(req.i18n.t('Contributor removed successfully'))}); }) } }) diff --git a/app/controllers/maps.js b/app/controllers/maps.js index 8d991b1..b13ba73 100644 --- a/app/controllers/maps.js +++ b/app/controllers/maps.js @@ -6,7 +6,6 @@ var _ = require('underscore'), mongoose = require('mongoose'), - utils = require('../../lib/utils'), Map = mongoose.model('Map'), extend = require('util')._extend; @@ -17,7 +16,7 @@ var exports.load = function(req, res, next, id){ Map.load(id, function (err, map) { if (err) return next(err) - if (!map) return res.json(400, { messages: [{status: 'error', text: 'Map not found.'}] }); + if (!map) return res.json(400, { messages: messages.error(req.i18n.t('Map not found.'))}); req.map = map next() }); @@ -49,9 +48,9 @@ exports.index = function(req, res){ } Map.list(options, function(err, maps) { - if (err) return res.json(400, utils.errorMessages(err.errors || err)); + if (err) return res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); Map.count(options.criteria).exec(function (err, count) { - if (err) res.json(400, utils.errorMessages(err.errors || err)); + if (err) res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); else res.json({options: options, mapsTotal: count, maps: maps}); }) }) @@ -78,7 +77,7 @@ exports.create = function (req, res) { // save map map.setLayersAndSave(req.body.layers, function (err) { - if (err) res.json(400, utils.errorMessages(err.errors || err)); + if (err) res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); else res.json(map); }); } @@ -101,7 +100,7 @@ exports.update = function(req, res){ map = extend(map, req.body); map.setLayersAndSave(newLayerSet, function(err) { - if (err) res.json(400, utils.errorMessages(err.errors || err)); + if (err) res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); else res.json(map); }) } @@ -113,7 +112,7 @@ exports.update = function(req, res){ exports.destroy = function(req, res){ var map = req.map map.remove(function(err){ - if (err) res.json(400, utils.errorMessages(err.errors || err)); - else res.json({ messages: [{status: 'ok', text: 'Mapa removido com sucesso.'}] }); + if (err) res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); + else res.json({ messages: messages.error(req.i18n.t('Map removed successfully.'))}); }); } \ No newline at end of file diff --git a/app/controllers/users.js b/app/controllers/users.js index 24f968e..bc4d05b 100644 --- a/app/controllers/users.js +++ b/app/controllers/users.js @@ -64,13 +64,14 @@ exports.create = function (req, res) { // } if (preValidationErrors.length > 0){ - return res.json(400, messages.errorsArray(preValidationErrors)); + return res.json(400, { messages: messages.errorsArray(req.i18n, preValidationErrors) }); } else { user.save(function (err) { - if (err) return res.json(400, {messages: messages.mongooseErrors(err)}); + if (err) return res.json(400, { messages: messages.mongooseErrors(req.i18n, err)}); + // Don't send email if user is active if (!user.needsEmailConfirmation) { - return res.json(messages.success('Usuário criado com sucesso.')) + return res.json(messages.success(req.i18n.t('User profile created successfully.'))) } else { mailer.confirmEmail({ mailSender: req.app.mailer, @@ -79,9 +80,9 @@ exports.create = function (req, res) { }, function(err){ console.log(err); if (err) - return res.json(messages.errors(err)); + return res.json({ messages: messages.mongooseErrors(req.i18n, err)}); else - return res.json(messages.success('Usuário criado com sucesso. Um link de confirmação foi enviado para seu email.')); + return res.json(messages.success(req.i18n('User profile created successfully. An activation link was sent.'))); }) } }) diff --git a/app/models/user.js b/app/models/user.js index 24c0b12..fceeaa4 100644 --- a/app/models/user.js +++ b/app/models/user.js @@ -80,7 +80,7 @@ UserSchema.path('email').validate(function (email, fn) { }) } else fn(true); -}, 'Este e-mail já está sendo utilizado.'); +}, 'E-mail address already in use.'); UserSchema.path('username').validate(function (username, fn) { var User = mongoose.model('User'); @@ -92,7 +92,7 @@ UserSchema.path('username').validate(function (username, fn) { }) } else fn(true); -}, 'Este nome de usuário já é utilizado.'); +}, 'Username already in use.'); /** * Methods diff --git a/config/express.js b/config/express.js index a9daedd..19b4876 100644 --- a/config/express.js +++ b/config/express.js @@ -84,7 +84,7 @@ module.exports = function (app, config, passport) { url: config.db, collection : 'sessions' }, function(){ - console.log('Connection to Mongo opened.'); + console.log('MongoDB connected.'); }) })); diff --git a/config/passport.js b/config/passport.js index fadcaae..56cc356 100644 --- a/config/passport.js +++ b/config/passport.js @@ -29,9 +29,9 @@ module.exports = function (passport, config) { if (err) return done(err) else if (!user) - return done(null, false, { message: 'Usuário não cadastrado.' }) + return done(null, false, { message: 'User not registered.' }) else if (user.hashed_password && !user.authenticate(password)) - return done(null, false, { message: 'Invalid password' }) + return done(null, false, { message: 'Invalid password.' }) else return done(null, user); }) diff --git a/lib/messages.js b/lib/messages.js index 01f492a..d6bf913 100644 --- a/lib/messages.js +++ b/lib/messages.js @@ -1,3 +1,56 @@ + +/** + * Single error message. + */ + +exports.error = function (text) { + return [{ status: 'error', text: text }]; +} + +/** + * Single success message. + */ + +exports.success = function (text) { + return [{ status: 'ok', text: text }] +} + +/** + * Mongoose error messages. + */ + +exports.mongooseErrors = function(i18n, err) { + var + errors = err.errors || err, + messages = []; + + var keys = Object.keys(errors) + + // if there is no validation error, just display a generic error + if (!keys) { + return [{ status: 'error', text: i18n.t('Database error.')}]; + } else { + keys.forEach(function (key) { + messages.push({status: 'error', text: i18n.t(errors[key].message) }) + }); + return messages; + } +} + + +exports.errorsArray = function(i18n, array) { + + messages = []; + + array.forEach(function (message) { + messages.push({status: 'error', text: i18n.t(message) }); + }) + + return messages; +} + + + exports.errors = function (err) { var errors = err.errors || err; @@ -26,41 +79,3 @@ exports.errors = function (err) { return json; } - -exports.errorsArray = function(array) { - var json = {}; - json.messages = []; - - array.forEach(function (message) { - json.messages.push({status: 'error', text: message }); - }) - - return json; -} - -exports.mongooseErrors = function(errors) { - - errors = errors.errors || errors; - - var keys = Object.keys(errors) - var errs = [] - - // if there is no validation error, just display a generic error - if (!keys) { - return ['Oops! There was an error'] - } - - keys.forEach(function (key) { - errs.push({status: 'error', text: errors[key].message}); - }) - - return errs -} - -exports.error = function (error) { - return {messages: [{ status: 'error', text: error }]} -} - -exports.success = function (message) { - return {messages: [{ status: 'success', text: message }]} -} diff --git a/locales/en/translation.json b/locales/en/translation.json index 827d617..fdb7a5f 100644 --- a/locales/en/translation.json +++ b/locales/en/translation.json @@ -28,19 +28,6 @@ "Allow geo files import": "Allow geo files import", "Update": "Update", "Allow geo-files import": "Allow geo-files import", - "\"From\" address": "\"From\" address", - "e": { - "g": { - " Notifications ": "e.g. Notifications " - }, - " smtp": { - "yourmailhost": { - "com": "e.g. smtp.yourmailhost.com" - } - } - } - }, "SMTP Host": "SMTP Host", "SMTP User": "SMTP User", "username": "username", @@ -70,5 +57,18 @@ "english": "English", "spanish": "Spanish", "brazilian_portuguese": "Portuguese (BR)" - } + }, + "Path `title` is required": "Please type a layer title.", + "Layer not found": "Layer not found", + "Error loading layer": "Error loading layer", + "Layer updated successfully": "Layer updated successfully.", + "Invalid password.": "Invalid password.", + "Content removed successfully.": "Content removed successfully.", + "Logout successful": {}, + "Content removed successfully": {}, + "Please enter your name": {}, + "Invalid e-mail address": {}, + "Password should have at least 6 characters": {}, + "Please enter your e-mail address": {}, + "Please type a password": {} } \ No newline at end of file diff --git a/locales/pt-BR/translation.json b/locales/pt-BR/translation.json index f01346a..92ae6ab 100644 --- a/locales/pt-BR/translation.json +++ b/locales/pt-BR/translation.json @@ -1,5 +1,9 @@ { + "Path `title` is required": "Por favor digite um título.", + "Layer not found": "Camada não encontrada", + "Layer updated successfully": "Camada atualizada com sucesso.", "Administrative area": "Área administrativa", "Create admin": "Criar administrador", - "General settings": "Configurações gerais" + "General settings": "Configurações gerais", + "Content removed successfully.": "Conteúdo removido com sucesso." } \ No newline at end of file From c51932dcb02e909c34285b97a7ba752593b00afd Mon Sep 17 00:00:00 2001 From: Vitor George Date: Tue, 29 Apr 2014 22:03:25 -0300 Subject: [PATCH 03/10] i18n keys; i18n parser at package.json --- app/controllers/access_token.js | 26 +-- app/controllers/admin.js | 22 +-- app/controllers/contents.js | 4 +- app/controllers/features.js | 8 +- app/controllers/images.js | 6 +- app/controllers/layers.js | 26 +-- app/controllers/maps.js | 4 +- app/controllers/token.js | 52 ++--- app/views/admin/first_admin.jade | 2 +- locales/en/translation.json | 325 ++++++++++++++++++++++++------- locales/es/translation.json | 255 ++++++++++++++++++++++++ locales/pt-BR/translation.json | 260 ++++++++++++++++++++++++- locales/pt/translation.json | 256 +++++++++++++++++++++++- package.json | 3 +- 14 files changed, 1092 insertions(+), 157 deletions(-) create mode 100644 locales/es/translation.json diff --git a/app/controllers/access_token.js b/app/controllers/access_token.js index ae942d6..6fc4763 100644 --- a/app/controllers/access_token.js +++ b/app/controllers/access_token.js @@ -57,13 +57,13 @@ var authSocialUser = function(provider, profile, res) { User.load({email: userProfile.email}, function(err, user){ if (err) - return res.json(401, {messages: messages.error(req.i18n.t('access_token:tokenGenerationError.'))}); + return res.json(401, {messages: messages.error(req.i18n.t('access_token.authsocial.error.load_user'))}); if (!user) { user = new User(userProfile); user.save(function(err){ if (err) - return res.json(401, {messages: messages.error(req.i18n.t('Error while saving user.'))}); + return res.json(401, {messages: messages.error(req.i18n.t('access_token.authsocial.error.save_user'))}); generateAccessToken(user, res); }) } else { @@ -110,7 +110,7 @@ exports.google = function(req, res){ }); } } else { - return res.json(400, {messages: messages.error(req.i18n.t('Missing Google authorization token.'))}); + return res.json(400, {messages: messages.error(req.i18n.t('access_token.google.error.missing_token'))}); } } @@ -142,7 +142,7 @@ exports.facebook = function(req, res, next) { }); } } else { - return res.json(400, {messages: messages.error(req.i18n.t('Missing Facebook authorization token.'))}); + return res.json(400, {messages: messages.error(req.i18n.t('access_token.facebook.error.missing_token'))}); } @@ -162,29 +162,29 @@ exports.local = function(req, res, next) { // User not found. } else if (!user) { - return res.json(403, { messages: messages.error(req.i18n.t("Unauthorized."))}); + return res.json(403, { messages: messages.error(req.i18n.t("access_token.local.unauthorized"))}); } // User needs to finish migration. else if (user.status == 'to_migrate') { - return res.json(400, {messages: messages.error(req.i18n.t("Your account wasn't migrated yet, please visit this page."))}); + return res.json(400, {messages: messages.error(req.i18n.t("access_token.local.needs_migration"))}); // User doesn't have a password, because it logged before via Facebook or Google } else if (!user.hashed_password) { mailer.passwordNeeded(user, req.app.locals.settings.general.serverUrl, user.callback_url, function(err){ if (err) - return res.json(400, { messages: messages.error(req.i18n.t("There was an error while sending a password token to your e-mail."))}); + return res.json(400, { messages: messages.error(req.i18n.t("access_token.local.error.send_email"))}); else - return res.json(400, { messages: messages.error(req.i18n.t("Your need a password to acccess your profile. Check your e-mail to continue."))}); + return res.json(400, { messages: messages.error(req.i18n.t("access_token.local.error.need_password"))}); }); // User needs to confirm his email } else if (user.needsEmailConfirmation) { mailer.confirmEmail(user, req.app.locals.settings.general.serverUrl, req.body.callback_url, function(err){ if (err) - return res.json(400, {messages: messages.error(req.i18n.t("Erro ao enviar e-mail de ativação, por favor, contate o suporte."))}); + return res.json(400, {messages: messages.error(req.i18n.t("access_token.local.error.send_email"))}); else - return res.json(400, {messages: messages.error(req.i18n.t("Você ainda não ativou sua conta. Verifique seu e-mail."))}); + return res.json(400, {messages: messages.error(req.i18n.t("access_token.local.error.needs_activation"))}); }); // Login successful, proceed with token @@ -207,16 +207,16 @@ exports.logout = function(req, res, next) { var access_token = req.headers.authorization.split(' ')[1]; AccessToken.findOne({_id: access_token}, function(err, at){ if (err) return res.json(400, err); - if (!at) return res.json(400, {messages: messages.error(req.i18n.t("Can't find access token."))}); + if (!at) return res.json(400, {messages: messages.error(req.i18n.t("access_token.logout.error.inexistent_token"))}); at.expired = true; at.save(function(err){ if (err) return res.json(400, err); - else return res.json({messags: messages.success(req.i18n.t('Logout successful.'))}); + else return res.json({messags: messages.success(req.i18n.t('access_token.logout.successful'))}); }); }); } else { - res.json(400, {messages: messages.error(req.i18n.t('You are not logged in.'))}); + res.json(400, {messages: messages.error(req.i18n.t('access_token.logout.error.not_logged'))}); } diff --git a/app/controllers/admin.js b/app/controllers/admin.js index f24ec43..dde0c06 100644 --- a/app/controllers/admin.js +++ b/app/controllers/admin.js @@ -38,8 +38,7 @@ exports.firstAdmin = function(req, res) { // If an admin user already exists, redirects to login if (admin) { - console.log('admin already exists'); - req.flash('error', 'An admin already exists.'); + req.flash('error', t('admin.first_admin.error.already_exists')); res.redirect('/admin/login'); } else { var user = new User(req.body); @@ -50,18 +49,18 @@ exports.firstAdmin = function(req, res) { // Checks existence of all fields before sending to mongoose if (!user.name) - preValidationErrors.push('Please enter a name.'); + preValidationErrors.push(t('admin.first_admin.error.needs_name')); if (!user.email) - preValidationErrors.push('Please enter a e-mail address.'); + preValidationErrors.push(t('admin.first_admin.error.needs_email')); else if (!validator.isEmail(user.email)) - preValidationErrors.push('Invalid e-mail address.'); + preValidationErrors.push(t('admin.first_admin.error.invalid_email')); if (!user.password) - preValidationErrors.push('Please type a password.'); + preValidationErrors.push(t('admin.first_admin.error.password_missing')); else if (user.password.length < 6) - preValidationErrors.push('Password should have at least 6 characters.'); + preValidationErrors.push(t('admin.first_admin.error.password_length')); if (preValidationErrors.length > 0){ res.render('admin/first_admin', {messages: messages.errorsArray(preValidationErrors).messages}); @@ -71,7 +70,7 @@ exports.firstAdmin = function(req, res) { res.render('admin/first_admin', {messages: messages.mongooseErrors(req.i18n, err)}); } else { - req.flash('info', 'Admin created successfully.'); + req.flash('info', t('admin.first_admin.success')); res.redirect('/admin/login'); } }); @@ -120,7 +119,7 @@ exports.index = function (req, res) { exports.apiSettings = function(req, res) { Settings.load(function(err, settings){ if (err) - return res.json(400, message.error('Could not retrive server info.')); + return res.json(400, message.error(t('admin.api_settings.error.load'))); else { // clear mongoose fields @@ -244,7 +243,7 @@ exports.invite = function(req, res, next) { if (err) res.render('500'); else { if (user && !user.needsEmailConfirmation) { - res.render('admin/users/new', {message: 'User already active.'}); + res.render('admin/users/new', {message: t('admin.invite_user.error.already_active')}); } else { var @@ -263,7 +262,7 @@ exports.invite = function(req, res, next) { console.log(err); next(err); } - else return res.render('admin/users/new', {messages: messages.success('User invited successfully')}); + else return res.render('admin/users/new', {messages: messages.success(t('admin.invite_user.success'))}); }); } } @@ -290,7 +289,6 @@ exports.changeRole = function(req, res, next) { else { User.find({}, function(err, users){ if (err) res.render('500'); - // else res.render('admin/users/roles', {users: users}); else res.redirect('admin/users/roles'); }) } diff --git a/app/controllers/contents.js b/app/controllers/contents.js index c69c2e3..7cac3cd 100644 --- a/app/controllers/contents.js +++ b/app/controllers/contents.js @@ -19,7 +19,7 @@ exports.load = function(req, res, next, id) { if (err) { return next(err) } else if (!content) { - return res.json(400, { messages: messages.error(req.i18n.t('Content not found.'))}); + return res.json(400, { messages: messages.error(req.i18n.t('content.load.error.not_found'))}); } else { req.content = content; next(); @@ -153,7 +153,7 @@ exports.destroy = function(req, res){ else { content.remove(function(err){ if (err) res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); - else res.json({messages: messages.success(req.i18n.t('Content removed successfully.'))}); + else res.json({messages: messages.success(req.i18n.t('content.destroy.success'))}); }) } }) diff --git a/app/controllers/features.js b/app/controllers/features.js index e587799..08846b2 100644 --- a/app/controllers/features.js +++ b/app/controllers/features.js @@ -20,7 +20,7 @@ exports.load = function(req, res, next, id){ if (err) { return next(err) } else if (!feature) { - return res.json(400, {messages: messages.error(req.i18n.t("Can't find feature"))}); + return res.json(400, {messages: messages.error(req.i18n.t('feature.load.error.cant_find'))}); } else { req.feature = feature; next(); @@ -156,7 +156,7 @@ exports.addContent = function(req, res){ if (err) res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); feature.save(function(err){ if (err) res.json(400,err) - else res.json({messages: messages.success(req.i18n.t('Content added successfully.'))}); + else res.json({messages: messages.success(req.i18n.t('feature.add_content.success'))}); }); }); @@ -184,7 +184,7 @@ exports.removeContent = function(req, res){ if (err) res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); feature.save(function(err){ if (err) res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); - else res.json({messages: messages.success(req.i18n.t('Content removed successfully.'))}); + else res.json({messages: messages.success(req.i18n.t('feature.remove_content.success'))}); }); }); } @@ -231,6 +231,6 @@ exports.import = function(req, res) { } }); } else { - res.json({messages: messages.error(req.i18n.t('Geo files import is disabled.'))}); + res.json({messages: messages.error(req.i18n.t('feature.import.error.disabled'))}); } } diff --git a/app/controllers/images.js b/app/controllers/images.js index 826b486..f385f22 100644 --- a/app/controllers/images.js +++ b/app/controllers/images.js @@ -19,7 +19,7 @@ var exports.load = function (req, res, next, id) { Image.load(id, function (err, image) { if (err) return next(err) - if (!image) return res.json(400, { messages: messages.error(req.i18n.t('Image not found.'))}); + if (!image) return res.json(400, { messages: messages.error(req.i18n.t('image.load.error.not_found'))}); req.image = image next() }); @@ -52,7 +52,7 @@ exports.showForm = function (req, res) { exports.create = function (req, res) { if (!req.files.attachment.file) - return res.json(400, {messages: messages.error(req.i18n.t('Image file not found'))}); + return res.json(400, {messages: messages.error(req.i18n.t('image.create.error.not_found'))}); else { var image = new Image(); @@ -73,6 +73,6 @@ exports.create = function (req, res) { exports.destroy = function (req, res) { req.image.remove(function(err) { if (err) res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); - else res.json({ messages: messages.success(req.i18n.t('Content removed successfully.'))}); + else res.json({ messages: messages.success(req.i18n.t('image.destroy.success'))}); }); } \ No newline at end of file diff --git a/app/controllers/layers.js b/app/controllers/layers.js index c6539a8..4da269c 100644 --- a/app/controllers/layers.js +++ b/app/controllers/layers.js @@ -22,9 +22,9 @@ exports.load = function(req, res, next, id){ console.log(req.locale); Layer.load(id, function (err, layer) { if (err) - return res.json(400, {messages: messages.error(req.i18n.t('Error loading layer.'))}); + return res.json(400, {messages: messages.error(req.i18n.t('layer.load.error'))}); else if (!layer) - return res.json(400, {messages: messages.error(req.i18n.t('Layer not found.'))}); + return res.json(400, {messages: messages.error(req.i18n.t('layer.load.not_found'))}); else { req.layer = layer next() @@ -121,7 +121,7 @@ exports.create = function (req, res) { if (!type) { - return res.json(400, { messages: messages.error(req.i18n.t('Layer type missing.')) } ); + return res.json(400, { messages: messages.error(req.i18n.t('layer.create.missing')) } ); } else if (type == 'TileLayer') { @@ -147,7 +147,7 @@ exports.create = function (req, res) { layer.save(function (err) { if (!err) { - res.json({ layer: layer, messages: messages.success(req.i18n.t('Layer created successfully.'))}); + res.json({ layer: layer, messages: messages.success(req.i18n.t('layer.create.success'))}); } else { res.json(400, {messages: messages.mongooseError(req.i18n, err)}); } @@ -167,14 +167,14 @@ exports.update = function(req, res){ delete req.body['__v']; if (req.layer == 'TileLayer') { - return res.json(400, { messages: messages.error(req.i18n.t("Can't update TileLayer.") ) } ); + return res.json(400, { messages: messages.error(req.i18n.t("layer.update.tilelayer.error") ) } ); } layer = _.extend(layer, req.body); layer.save(function(err) { if (!err) { - res.json({ layer: layer, messages: messages.success(req.i18n.t('Layer updated successfully.'))}); + res.json({ layer: layer, messages: messages.success(req.i18n.t('layer.update.success'))}); } else { console.log(err); res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); @@ -192,7 +192,7 @@ exports.destroy = function(req, res){ if(err) { res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); } else { - res.json({ messages: messages.success(req.i18n.t('Layer removed successfully'))}); + res.json({ messages: messages.success(req.i18n.t('layer.destroy.success'))}); } }) } @@ -253,13 +253,13 @@ exports.addContributor = function (req, res) { layer = req.layer; if (contributorEmail == req.user.email) { - res.json(400, { messages: messages.error(req.i18n.t("User is already layer creator."))}); + res.json(400, { messages: messages.error(req.i18n.t("layer.contributor.add.error.already_exists"))}); } else { User.findOne({email: contributorEmail}, function(err, user){ if (err) { res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); } else if (!user) { - res.json(400, { messages: messages.error(req.i18n.t("Can't find user with this e-mail"))}); + res.json(400, { messages: messages.error(req.i18n.t("layer.contributor.add.error.dont_exists"))}); } else { layer.contributors.addToSet(user); layer.save(function(err){ @@ -276,8 +276,8 @@ exports.addContributor = function (req, res) { creator: req.user, contributor: user }, function(err){ - if (err) res.json(400, { messages: messages.error(req.i18n.t("Error while sending e-mail to contributor."))}) - res.json({ layer: updatedLayer, messages: messages.success(req.i18n.t('Contributor added successfully.'))}); + if (err) res.json(400, { messages: messages.error(req.i18n.t("layer.contributor.add.error.email"))}) + res.json({ layer: updatedLayer, messages: messages.success(req.i18n.t('layer.contributor.add.success'))}); }); }); }); @@ -300,7 +300,7 @@ exports.removeContributor = function (req, res) { layer.contributors.pull({_id: contributorId}); if (contributorCount == layer.contributors.lentgh) { - res.json(400, { messages: messages.error( req.i18n.t( "Invalid contributor id.") ) } ); + res.json(400, { messages: messages.error( req.i18n.t( "layer.contributor.remove.error.invalid_id") ) } ); } else { layer.save(function(err){ if (err) { @@ -310,7 +310,7 @@ exports.removeContributor = function (req, res) { .findById(layer._id) .populate('contributors', 'name username email') .exec(function(err, updatedLayer){ - res.json({ layer: updatedLayer, messages: messages.success(req.i18n.t('Contributor removed successfully'))}); + res.json({ layer: updatedLayer, messages: messages.success(req.i18n.t('layer.contributor.remove.success'))}); }) } }) diff --git a/app/controllers/maps.js b/app/controllers/maps.js index b13ba73..53bcd7e 100644 --- a/app/controllers/maps.js +++ b/app/controllers/maps.js @@ -16,7 +16,7 @@ var exports.load = function(req, res, next, id){ Map.load(id, function (err, map) { if (err) return next(err) - if (!map) return res.json(400, { messages: messages.error(req.i18n.t('Map not found.'))}); + if (!map) return res.json(400, { messages: messages.error(req.i18n.t('map.load.error.not_found'))}); req.map = map next() }); @@ -113,6 +113,6 @@ exports.destroy = function(req, res){ var map = req.map map.remove(function(err){ if (err) res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); - else res.json({ messages: messages.error(req.i18n.t('Map removed successfully.'))}); + else res.json({ messages: messages.error(req.i18n.t('map.destroy.success'))}); }); } \ No newline at end of file diff --git a/app/controllers/token.js b/app/controllers/token.js index 3771fb0..c780369 100644 --- a/app/controllers/token.js +++ b/app/controllers/token.js @@ -18,13 +18,13 @@ exports.load = function(req, res, next, id){ if (err) return next(err); if (!token){ return res.render('tokens/index', { - errors: ['Token não encontrado.'], + errors: [t('token.load.error.not_found')], autoRedirect: false }); } if (token.expiresAt < Date.now()) { return res.render('tokens/index', { - errors: ['Este token expirou.'], + errors: [t('token.load.error.expired')], callbackUrl: token.callbackUrl, autoRedirect: false }); @@ -44,12 +44,12 @@ exports.activateAccount = function(req, res){ // invalid route for token if (token.type != 'activateAccount') { - return res.render('tokens/index', {errors: ['Token inválido.']}); + return res.render('tokens/index', {errors: [t('token.activate_account.error.invalid')]}); } else { mongoose.model('User').findById(token.user, function(err, user){ if (err) { return res.render('tokens/index', { - errors: ['Não foi possível ativar este usuário.'], + errors: [t('token.activate_account.error.user')], callbackUrl: token.callbackUrl, autoRedirect: false }); @@ -61,7 +61,7 @@ exports.activateAccount = function(req, res){ user.save(function(err){ if (err) return res.render('tokens/index', { - errors: ['Não foi possível ativar este usuário.'], + errors: [t('token.activate_account.error.user')], callbackUrl: token.callbackUrl, autoRedirect: false }); @@ -72,13 +72,13 @@ exports.activateAccount = function(req, res){ console.log(err); if (err) return res.render('tokens/index', { - errors: ['Houve um erro de gravação do token.'], + errors: [t('token.activate_account.error.saving')], callbackUrl: token.callbackUrl, autoRedirect: false }) else return res.render('tokens/index', { - success: ['Conta ativada com sucesso, aguarde redirecionamento.'], + success: [t('token.activate_account.success')], callbackUrl: token.callbackUrl, autoRedirect: true }); @@ -99,7 +99,7 @@ exports.acceptInvitationForm = function(req, res){ // invalid route for token if (token.type != 'acceptInvitation') { - return res.render('tokens/index', {errors: ['Token inválido.']}); + return res.render('tokens/index', {errors: [t('token.accept_invitation.error.invalid_token')]}); } else { return res.render('tokens/accept_invitation', { token: token @@ -115,12 +115,12 @@ exports.acceptInvitation = function(req, res){ // invalid route for token if (token.type != 'acceptInvitation') { - return res.render('tokens/index', {errors: ['Token inválido.']}); + return res.render('tokens/index', {errors: [t('token.error.invalid')]}); } else { mongoose.model('User').findOne({email: token.data.user.email}, function(err, user){ if (err) { return res.render('tokens/index', { - errors: ['Não foi possível ativar este usuário.'], + errors: [t('token.accept_invitation.error.user_activation')], callbackUrl: token.callbackUrl, autoRedirect: false }); @@ -137,7 +137,7 @@ exports.acceptInvitation = function(req, res){ if (err) { console.log(err); return res.render('tokens/index', { - errors: ['Não foi possível ativar este usuário.'], + errors: [t('token.accept_invitation.error.user_activation')], callbackUrl: token.callbackUrl, autoRedirect: false }); @@ -149,13 +149,13 @@ exports.acceptInvitation = function(req, res){ console.log(err); if (err) return res.render('tokens/index', { - errors: ['Houve um erro de gravação do token.'], + errors: [t('token.error.cant_save')], callbackUrl: token.callbackUrl, autoRedirect: false }) else return res.render('tokens/index', { - success: ['Conta ativada com sucesso, aguarde redirecionamento.'], + success: [t('token.accept_invitation.success')], callbackUrl: token.callbackUrl, autoRedirect: true }); @@ -178,7 +178,7 @@ exports.newPasswordForm = function(req, res){ // invalid route for token if ((token.type != 'password_reset') && (token.type != 'password_needed')) { - return res.render('tokens/index', {errors: ['Token inválido.']}); + return res.render('tokens/index', {errors: [t('token.error.invalid')]}); } else { res.render('users/new_password', {user: req.user, token: token}) } @@ -194,21 +194,21 @@ exports.newPassword = function(req, res){ // invalid route for token if ((token.type != 'password_reset') && (token.type != 'password_needed')) { - return res.render('tokens/index', {errors: ['Token inválido.']}); + return res.render('tokens/index', {errors: [t('token.error.invalid')]}); } else { mongoose.model('User').findById(token.user, function(err, user){ if (err) { - return res.render('tokens/index', {errors: ['Houve um erro no pedido de alteração de senha.']}); + return res.render('tokens/index', {errors: [t('token.new_password.error.generic')]}); } user.password = req.body.password; user.save(function(err){ if (err) - return res.render('tokens/index', {errors: ['Não foi possível alterar a senha deste usuário.']}); + return res.render('tokens/index', {errors: [t('token.new_password.error.generic')]}); else { return res.render('tokens/index', { - info: ['Senha alterada com sucesso.'], + info: [t('token.new_password.success')], callbackUrl: token.callbackUrl, autoRedirect: true }); @@ -229,11 +229,11 @@ exports.migrateAccount = function(req, res){ // invalid route for token if (token.type != 'migrate_account') { - return res.render('tokens/index', {errors: ['Token inválido.']}); + return res.render('tokens/index', {errors: [t('token.error.invalid')]}); } else { mongoose.model('User').findById(token.user, function(err, user){ if (err) { - return res.render('tokens/index', {errors: ['Houve um erro na migração da conta.']}); + return res.render('tokens/index', {errors: [t('token.migration.error.generic')]}); } user.password = token.data.password; @@ -242,9 +242,9 @@ exports.migrateAccount = function(req, res){ user.save(function(err){ if (err) - return res.render('tokens/index', {errors: ['Não foi possível migrar a conta deste usuário']}); + return res.render('tokens/index', {errors: [t('token.migration.error.generic')]}); else { - req.flash('info', 'Usuário migrado com sucesso.') + req.flash('info', t('token.migration.success')) } return res.redirect('/login'); @@ -267,12 +267,12 @@ exports.emailChange = function(req, res){ // invalid route for token if (token.type != 'email_change') { - return res.render('tokens/index', {errors: ['Token inválido.']}); + return res.render('tokens/index', {errors: [t('token.error.invalid')]}); } else { mongoose.model('User').findById(token.user, function(err, user){ if (err) { return res.render('tokens/index', { - errors: ['Houve um erro na solicitação de alteração de e-mail.'] + errors: [t('token.email_change.error.generic')] }); } @@ -282,11 +282,11 @@ exports.emailChange = function(req, res){ // TODO render login form if (err) return res.render('tokens/index', { - errors: ['Não foi possível alterar o e-mail deste usuário.'] + errors: [t('token.email_change.error.generic')] }); else { return res.render('tokens/index', { - info: ['E-mail alterado com sucesso.'], + info: [t('token.email_change.success')], callbackUrl: token.callbackUrl, autoRedirect: true }); diff --git a/app/views/admin/first_admin.jade b/app/views/admin/first_admin.jade index 96677f5..938d23d 100644 --- a/app/views/admin/first_admin.jade +++ b/app/views/admin/first_admin.jade @@ -9,7 +9,7 @@ html .login-content h1= t('Administrative area') include ../includes/messages - p= t("You don't have an admin yet, please provide information below to create one:") + p= t("Create first admin user")+':' .login-form form.form-horizontal(action="/admin/first_admin", method="post", role="form") input(type='hidden', name='_csrf', value="#{csrf_token}") diff --git a/locales/en/translation.json b/locales/en/translation.json index fdb7a5f..ed5314d 100644 --- a/locales/en/translation.json +++ b/locales/en/translation.json @@ -1,74 +1,255 @@ { - "Administrative area": "Administrative area", - "Name": "Name", - "You": "You", - "E-mail": "E-mail", - "Password": "Password", - "Create admin": "Create admin", - "Email": "Email", - "\"Password\"": "\"Password\"", - "Log in": "Log in", - "Settings": "Settings", - "General": "General", - "Mailer": "Mailer", - "Users": "Users", - "Invite new": "Invite new", - "Manage roles": "Manage roles", - "Welcome to admin area": "Welcome to admin area", - "General settings": "General settings", - "Site title": "Site title", - "your site title": "your site title", - "Site description": "Site description", - "a brief site description": "a brief site description", - "Server URL": "Server URL", - "your yby server URL": "your yby server URL", - "Client URL": "Client URL", - "your yby client URL": "your yby client URL", - "Only invited users can register": "Only invited users can register", - "Allow geo files import": "Allow geo files import", - "Update": "Update", - "Allow geo-files import": "Allow geo-files import", - "SMTP Host": "SMTP Host", - "SMTP User": "SMTP User", - "username": "username", - "Password (will be stored as plain text)": "Password (will be stored as plain text)", - "Invite a user": "Invite a user", - "Role": "Role", - "Colaborator": "Colaborator", - "Editor": "Editor", - "Administrador": "Administrador", - "Send invitation": "Send invitation", - "Mange user roles": "Mange user roles", - "Permissão": "Permissão", - "collaborator": "collaborator", - "editor": "editor", - "admin": "admin", - "Change": "Change", - "Use SSL": "Use SSL", - "Port": "Port", - "SMTP port": "SMTP port", - "Mailer configuration": "Mailer configuration", - "Administration": "Administration", - "English": "English", - "Brazilian Portuguese": "Brazilian Portuguese", - "Spanish": "Spanish", - "System language": "System language", - "app": { - "english": "English", - "spanish": "Spanish", - "brazilian_portuguese": "Portuguese (BR)" - }, - "Path `title` is required": "Please type a layer title.", - "Layer not found": "Layer not found", - "Error loading layer": "Error loading layer", - "Layer updated successfully": "Layer updated successfully.", - "Invalid password.": "Invalid password.", - "Content removed successfully.": "Content removed successfully.", - "Logout successful": {}, - "Content removed successfully": {}, - "Please enter your name": {}, - "Invalid e-mail address": {}, - "Password should have at least 6 characters": {}, - "Please enter your e-mail address": {}, - "Please type a password": {} + "\"From\" address": "", + "\"Password\"": "", + "Administrador": "", + "Administration": "", + "Administrative area": "", + "Allow geo-files import": "", + "Change": "", + "Client URL": "", + "Colaborator": "", + "Create admin": "", + "Create first admin user": "", + "E-mail": "", + "Editor": "", + "Email": "", + "General": "", + "General settings": "", + "Invite a user": "", + "Invite new": "", + "Log in": "", + "Mailer": "", + "Mailer configuration": "", + "Manage roles": "", + "Mange user roles": "", + "Name": "", + "Only invited users can register": "", + "Password": "", + "Password (will be stored as plain text)": "", + "Permissão": "", + "Port": "", + "Role": "", + "SMTP Host": "", + "SMTP User": "", + "SMTP port": "", + "Send invitation": "", + "Server URL": "", + "Settings": "", + "Site description": "", + "Site title": "", + "There are no users!": "", + "Update": "", + "Use SSL": "", + "User profile created successfully": { + "": "" + }, + "Users": "", + "a brief site description": "", + "access_token": { + "authsocial": { + "error": { + "load_user": "Error loading user.", + "save_user": "Error while saving user." + } + }, + "facebook": { + "error": { + "missing_token": "Missing Facebook authorization token." + } + }, + "google": { + "error": { + "missing_token": "Missing Google authorization token." + } + }, + "local": { + "error": { + "need_password": "Your need a password to acccess your profile. Check your e-mail to continue.", + "needs_activation": "Profile not active, an activation email was sent.", + "send_email": "There was an error while sending a password token to your e-mail." + }, + "needs_migration": "Your account wasn't migrated yet, please visit this page.", + "unauthorized": "Unauthorized." + }, + "logout": { + "error": { + "inexistent_token": "Can't find access token.", + "not_logged": "You are not logged in." + }, + "successful": "Logout successful." + } + }, + "admin": { + "api_settings": { + "error": { + "load": "Could not retrive server info." + } + }, + "first_admin": { + "error": { + "already_exists": "An admin already exists.", + "invalid_email": "Invalid e-mail address.", + "needs_email": "Please enter a e-mail address.", + "needs_name": "Please enter a name.", + "password_length": "Password should have at least 6 characters.", + "password_missing": "Please type a password." + }, + "success": "Admin created successfully." + }, + "invite_user": { + "error": { + "already_active": "User is already active." + }, + "success": "User invited successfully." + } + }, + "content": { + "destroy": { + "success": "Content removed successfully." + }, + "load": { + "error": { + "not_found": "Content not found." + } + } + }, + "e": { + "g": { + " Notifications ": "" + }, + " smtp": { + "yourmailhost": { + "com": "" + } + } + } + }, + "feature": { + "add_content": { + "success": "Content added successfully." + }, + "import": { + "error": { + "disabled": "Geo files import is disabled." + } + }, + "load": { + "error": { + "cant_find": "Can't find feature." + } + }, + "remove_content": { + "success": "Content removed successfully." + } + }, + "image": { + "create": { + "error": { + "not_found": "Image file not found" + } + }, + "destroy": { + "success": "Image removed successfully." + }, + "load": { + "error": { + "not_found": "Image not found." + } + } + }, + "layer": { + "contributor": { + "add": { + "error": { + "already_exists": "User is already layer creator.", + "dont_exists": "Can't find user with this e-mail.", + "email": "Error while sending e-mail to contributor." + }, + "success": "Contributor added successfully." + }, + "remove": { + "error": { + "invalid_id": "Invalid contributor id." + }, + "success": "Contributor removed successfully." + } + }, + "create": { + "missing": "Layer type missing.", + "success": "Layer created successfully." + }, + "destroy": { + "success": "Layer removed successfully." + }, + "load": { + "error": "Error loading layer.", + "not_found": "Layer not found." + }, + "update": { + "success": "Layer updated successfully.", + "tilelayer": { + "error": "Can't update TileLayer" + } + } + }, + "map": { + "destroy": { + "success": "Map removed successfully." + }, + "load": { + "error": { + "not_found": "Map not found." + } + } + }, + "token": { + "accept_invitation": { + "error": { + "invalid_token": "Invalid token.", + "user_activation": "Can't actived this user." + }, + "success": "Profile activated successfully." + }, + "activate_account": { + "error": { + "invalid": "Invalid token.", + "saving": "Error while saving token.", + "user": "Can't activate this user." + }, + "success": "Profile activated successfully, please wait redirection." + }, + "email_change": { + "error": { + "generic": "Error while changing user e-mail." + }, + "success": "E-mail changed successfully." + }, + "error": { + "cant_save": "Can't save token.", + "invalid": "Invalid token." + }, + "load": { + "error": { + "expired": "This token expired.", + "not_found": "Token not found." + } + }, + "migration": { + "error": { + "generic": "Error while migrating account." + }, + "success": "Account migrated successfully." + }, + "new_password": { + "error": { + "generic": "Error while changing password." + }, + "success": "Password changed successfully." + } + }, + "username": "", + "your site title": "", + "your yby client URL": "", + "your yby server URL": "" } \ No newline at end of file diff --git a/locales/es/translation.json b/locales/es/translation.json new file mode 100644 index 0000000..b5fac26 --- /dev/null +++ b/locales/es/translation.json @@ -0,0 +1,255 @@ +{ + "\"From\" address": "", + "\"Password\"": "\"Password\"", + "Administrador": "Administrador", + "Administration": "Administration", + "Administrative area": "Administrative area", + "Allow geo-files import": "Allow geo-files import", + "Change": "Change", + "Client URL": "Client URL", + "Colaborator": "Colaborator", + "Create admin": "Create admin", + "Create first admin user": "", + "E-mail": "E-mail", + "Editor": "Editor", + "Email": "Email", + "General": "General", + "General settings": "General settings", + "Invite a user": "Invite a user", + "Invite new": "Invite new", + "Log in": "Log in", + "Mailer": "Mailer", + "Mailer configuration": "Mailer configuration", + "Manage roles": "Manage roles", + "Mange user roles": "Mange user roles", + "Name": "Name", + "Only invited users can register": "Only invited users can register", + "Password": "Password", + "Password (will be stored as plain text)": "Password (will be stored as plain text)", + "Permissão": "Permissão", + "Port": "Port", + "Role": "Role", + "SMTP Host": "SMTP Host", + "SMTP User": "SMTP User", + "SMTP port": "SMTP port", + "Send invitation": "Send invitation", + "Server URL": "Server URL", + "Settings": "Settings", + "Site description": "Site description", + "Site title": "Site title", + "There are no users!": "", + "Update": "Update", + "Use SSL": "Use SSL", + "User profile created successfully": { + "": "" + }, + "Users": "Users", + "a brief site description": "a brief site description", + "access_token": { + "authsocial": { + "error": { + "load_user": "", + "save_user": "" + } + }, + "facebook": { + "error": { + "missing_token": "" + } + }, + "google": { + "error": { + "missing_token": "" + } + }, + "local": { + "error": { + "need_password": "", + "needs_activation": "", + "send_email": "" + }, + "needs_migration": "", + "unauthorized": "" + }, + "logout": { + "error": { + "inexistent_token": "", + "not_logged": "" + }, + "successful": "" + } + }, + "admin": { + "api_settings": { + "error": { + "load": "" + } + }, + "first_admin": { + "error": { + "already_exists": "", + "invalid_email": "", + "needs_email": "", + "needs_name": "", + "password_length": "", + "password_missing": "" + }, + "success": "" + }, + "invite_user": { + "error": { + "already_active": "" + }, + "success": "" + } + }, + "content": { + "destroy": { + "success": "" + }, + "load": { + "error": { + "not_found": "" + } + } + }, + "e": { + "g": { + " Notifications ": "" + }, + " smtp": { + "yourmailhost": { + "com": "" + } + } + } + }, + "feature": { + "add_content": { + "success": "" + }, + "import": { + "error": { + "disabled": "" + } + }, + "load": { + "error": { + "cant_find": "" + } + }, + "remove_content": { + "success": "" + } + }, + "image": { + "create": { + "error": { + "not_found": "" + } + }, + "destroy": { + "success": "" + }, + "load": { + "error": { + "not_found": "" + } + } + }, + "layer": { + "contributor": { + "add": { + "error": { + "already_exists": "", + "dont_exists": "", + "email": "" + }, + "success": "" + }, + "remove": { + "error": { + "invalid_id": "" + }, + "success": "" + } + }, + "create": { + "missing": "", + "success": "" + }, + "destroy": { + "success": "" + }, + "load": { + "error": "Error loading layer.", + "not_found": "" + }, + "update": { + "success": "", + "tilelayer": { + "error": "" + } + } + }, + "map": { + "destroy": { + "success": "" + }, + "load": { + "error": { + "not_found": "" + } + } + }, + "token": { + "accept_invitation": { + "error": { + "invalid_token": "", + "user_activation": "" + }, + "success": "" + }, + "activate_account": { + "error": { + "invalid": "", + "saving": "", + "user": "" + }, + "success": "" + }, + "email_change": { + "error": { + "generic": "" + }, + "success": "" + }, + "error": { + "cant_save": "", + "invalid": "" + }, + "load": { + "error": { + "expired": "", + "not_found": "" + } + }, + "migration": { + "error": { + "generic": "" + }, + "success": "" + }, + "new_password": { + "error": { + "generic": "" + }, + "success": "" + } + }, + "username": "username", + "your site title": "your site title", + "your yby client URL": "your yby client URL", + "your yby server URL": "your yby server URL" +} \ No newline at end of file diff --git a/locales/pt-BR/translation.json b/locales/pt-BR/translation.json index 92ae6ab..92a2e2e 100644 --- a/locales/pt-BR/translation.json +++ b/locales/pt-BR/translation.json @@ -1,9 +1,255 @@ { - "Path `title` is required": "Por favor digite um título.", - "Layer not found": "Camada não encontrada", - "Layer updated successfully": "Camada atualizada com sucesso.", - "Administrative area": "Área administrativa", - "Create admin": "Criar administrador", - "General settings": "Configurações gerais", - "Content removed successfully.": "Conteúdo removido com sucesso." + "\"From\" address": "", + "\"Password\"": "\"Password\"", + "Administrador": "Administrador", + "Administration": "Administration", + "Administrative area": "Área administrativa", + "Allow geo-files import": "Allow geo-files import", + "Change": "Change", + "Client URL": "Client URL", + "Colaborator": "Colaborator", + "Create admin": "Criar administrador", + "Create first admin user": "", + "E-mail": "E-mail", + "Editor": "Editor", + "Email": "Email", + "General": "General", + "General settings": "Configurações gerais", + "Invite a user": "Invite a user", + "Invite new": "Invite new", + "Log in": "Log in", + "Mailer": "Mailer", + "Mailer configuration": "Mailer configuration", + "Manage roles": "Manage roles", + "Mange user roles": "Mange user roles", + "Name": "Name", + "Only invited users can register": "Only invited users can register", + "Password": "Password", + "Password (will be stored as plain text)": "Password (will be stored as plain text)", + "Permissão": "Permissão", + "Port": "Port", + "Role": "Role", + "SMTP Host": "SMTP Host", + "SMTP User": "SMTP User", + "SMTP port": "SMTP port", + "Send invitation": "Send invitation", + "Server URL": "Server URL", + "Settings": "Settings", + "Site description": "Site description", + "Site title": "Site title", + "There are no users!": "", + "Update": "Update", + "Use SSL": "Use SSL", + "User profile created successfully": { + "": "" + }, + "Users": "Users", + "a brief site description": "a brief site description", + "access_token": { + "authsocial": { + "error": { + "load_user": "", + "save_user": "" + } + }, + "facebook": { + "error": { + "missing_token": "" + } + }, + "google": { + "error": { + "missing_token": "" + } + }, + "local": { + "error": { + "need_password": "", + "needs_activation": "", + "send_email": "" + }, + "needs_migration": "", + "unauthorized": "" + }, + "logout": { + "error": { + "inexistent_token": "", + "not_logged": "" + }, + "successful": "" + } + }, + "admin": { + "api_settings": { + "error": { + "load": "" + } + }, + "first_admin": { + "error": { + "already_exists": "", + "invalid_email": "", + "needs_email": "", + "needs_name": "", + "password_length": "", + "password_missing": "" + }, + "success": "" + }, + "invite_user": { + "error": { + "already_active": "" + }, + "success": "" + } + }, + "content": { + "destroy": { + "success": "" + }, + "load": { + "error": { + "not_found": "" + } + } + }, + "e": { + "g": { + " Notifications ": "" + }, + " smtp": { + "yourmailhost": { + "com": "" + } + } + } + }, + "feature": { + "add_content": { + "success": "" + }, + "import": { + "error": { + "disabled": "" + } + }, + "load": { + "error": { + "cant_find": "" + } + }, + "remove_content": { + "success": "" + } + }, + "image": { + "create": { + "error": { + "not_found": "" + } + }, + "destroy": { + "success": "" + }, + "load": { + "error": { + "not_found": "" + } + } + }, + "layer": { + "contributor": { + "add": { + "error": { + "already_exists": "", + "dont_exists": "", + "email": "" + }, + "success": "" + }, + "remove": { + "error": { + "invalid_id": "" + }, + "success": "" + } + }, + "create": { + "missing": "", + "success": "" + }, + "destroy": { + "success": "" + }, + "load": { + "error": "Error loading layer.", + "not_found": "" + }, + "update": { + "success": "", + "tilelayer": { + "error": "" + } + } + }, + "map": { + "destroy": { + "success": "" + }, + "load": { + "error": { + "not_found": "" + } + } + }, + "token": { + "accept_invitation": { + "error": { + "invalid_token": "", + "user_activation": "" + }, + "success": "" + }, + "activate_account": { + "error": { + "invalid": "", + "saving": "", + "user": "" + }, + "success": "" + }, + "email_change": { + "error": { + "generic": "" + }, + "success": "" + }, + "error": { + "cant_save": "", + "invalid": "" + }, + "load": { + "error": { + "expired": "", + "not_found": "" + } + }, + "migration": { + "error": { + "generic": "" + }, + "success": "" + }, + "new_password": { + "error": { + "generic": "" + }, + "success": "" + } + }, + "username": "username", + "your site title": "your site title", + "your yby client URL": "your yby client URL", + "your yby server URL": "your yby server URL" } \ No newline at end of file diff --git a/locales/pt/translation.json b/locales/pt/translation.json index 9e26dfe..b5fac26 100644 --- a/locales/pt/translation.json +++ b/locales/pt/translation.json @@ -1 +1,255 @@ -{} \ No newline at end of file +{ + "\"From\" address": "", + "\"Password\"": "\"Password\"", + "Administrador": "Administrador", + "Administration": "Administration", + "Administrative area": "Administrative area", + "Allow geo-files import": "Allow geo-files import", + "Change": "Change", + "Client URL": "Client URL", + "Colaborator": "Colaborator", + "Create admin": "Create admin", + "Create first admin user": "", + "E-mail": "E-mail", + "Editor": "Editor", + "Email": "Email", + "General": "General", + "General settings": "General settings", + "Invite a user": "Invite a user", + "Invite new": "Invite new", + "Log in": "Log in", + "Mailer": "Mailer", + "Mailer configuration": "Mailer configuration", + "Manage roles": "Manage roles", + "Mange user roles": "Mange user roles", + "Name": "Name", + "Only invited users can register": "Only invited users can register", + "Password": "Password", + "Password (will be stored as plain text)": "Password (will be stored as plain text)", + "Permissão": "Permissão", + "Port": "Port", + "Role": "Role", + "SMTP Host": "SMTP Host", + "SMTP User": "SMTP User", + "SMTP port": "SMTP port", + "Send invitation": "Send invitation", + "Server URL": "Server URL", + "Settings": "Settings", + "Site description": "Site description", + "Site title": "Site title", + "There are no users!": "", + "Update": "Update", + "Use SSL": "Use SSL", + "User profile created successfully": { + "": "" + }, + "Users": "Users", + "a brief site description": "a brief site description", + "access_token": { + "authsocial": { + "error": { + "load_user": "", + "save_user": "" + } + }, + "facebook": { + "error": { + "missing_token": "" + } + }, + "google": { + "error": { + "missing_token": "" + } + }, + "local": { + "error": { + "need_password": "", + "needs_activation": "", + "send_email": "" + }, + "needs_migration": "", + "unauthorized": "" + }, + "logout": { + "error": { + "inexistent_token": "", + "not_logged": "" + }, + "successful": "" + } + }, + "admin": { + "api_settings": { + "error": { + "load": "" + } + }, + "first_admin": { + "error": { + "already_exists": "", + "invalid_email": "", + "needs_email": "", + "needs_name": "", + "password_length": "", + "password_missing": "" + }, + "success": "" + }, + "invite_user": { + "error": { + "already_active": "" + }, + "success": "" + } + }, + "content": { + "destroy": { + "success": "" + }, + "load": { + "error": { + "not_found": "" + } + } + }, + "e": { + "g": { + " Notifications ": "" + }, + " smtp": { + "yourmailhost": { + "com": "" + } + } + } + }, + "feature": { + "add_content": { + "success": "" + }, + "import": { + "error": { + "disabled": "" + } + }, + "load": { + "error": { + "cant_find": "" + } + }, + "remove_content": { + "success": "" + } + }, + "image": { + "create": { + "error": { + "not_found": "" + } + }, + "destroy": { + "success": "" + }, + "load": { + "error": { + "not_found": "" + } + } + }, + "layer": { + "contributor": { + "add": { + "error": { + "already_exists": "", + "dont_exists": "", + "email": "" + }, + "success": "" + }, + "remove": { + "error": { + "invalid_id": "" + }, + "success": "" + } + }, + "create": { + "missing": "", + "success": "" + }, + "destroy": { + "success": "" + }, + "load": { + "error": "Error loading layer.", + "not_found": "" + }, + "update": { + "success": "", + "tilelayer": { + "error": "" + } + } + }, + "map": { + "destroy": { + "success": "" + }, + "load": { + "error": { + "not_found": "" + } + } + }, + "token": { + "accept_invitation": { + "error": { + "invalid_token": "", + "user_activation": "" + }, + "success": "" + }, + "activate_account": { + "error": { + "invalid": "", + "saving": "", + "user": "" + }, + "success": "" + }, + "email_change": { + "error": { + "generic": "" + }, + "success": "" + }, + "error": { + "cant_save": "", + "invalid": "" + }, + "load": { + "error": { + "expired": "", + "not_found": "" + } + }, + "migration": { + "error": { + "generic": "" + }, + "success": "" + }, + "new_password": { + "error": { + "generic": "" + }, + "success": "" + } + }, + "username": "username", + "your site title": "your site title", + "your yby client URL": "your yby client URL", + "your yby server URL": "your yby server URL" +} \ No newline at end of file diff --git a/package.json b/package.json index 94c6e0a..315ea69 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,8 @@ "scripts": { "watch": "NODE_PATH=./app/controllers NODE_ENV=development ./node_modules/.bin/nodemon web.js", "start": "NODE_PATH=./app/controllers node web.js", - "test": "make test" + "test": "make test", + "i18n": "i18next app/ -o locales/ -r -l en,es,pt,pt-BR" }, "dependencies": { "dotenv": "latest", From 6ac14f45373cec65da34f92f98d8bbb3ccd3e573 Mon Sep 17 00:00:00 2001 From: Vitor George Date: Wed, 30 Apr 2014 12:55:11 -0300 Subject: [PATCH 04/10] user controller i18n --- app/controllers/users.js | 56 ++++++++++++------------ locales/en/translation.json | 79 ++++++++++++++++++++++++++++++++-- locales/es/translation.json | 76 ++++++++++++++++++++++++++++++-- locales/pt-BR/translation.json | 76 ++++++++++++++++++++++++++++++-- locales/pt/translation.json | 76 ++++++++++++++++++++++++++++++-- 5 files changed, 323 insertions(+), 40 deletions(-) diff --git a/app/controllers/users.js b/app/controllers/users.js index bc4d05b..a586b0d 100644 --- a/app/controllers/users.js +++ b/app/controllers/users.js @@ -27,7 +27,7 @@ exports.user = function (req, res, next, id) { User .load(query, function (err, user) { if (err) return next(err) - if (!user) return next(new Error('Failed to load User ' + id)) + if (!user) return next(new Error(t('user.load.error') + id)) req.profile = user next() }); @@ -45,18 +45,18 @@ exports.create = function (req, res) { // Checks existence of all fields before sending to mongoose if (!user.name) - preValidationErrors.push('Please enter your name.'); + preValidationErrors.push(t('user.create.error.missing_name')); if (!user.email) - preValidationErrors.push('Please enter your e-mail address.'); + preValidationErrors.push(t('user.create.error.email.missing')); else if (!validator.isEmail(user.email)) - preValidationErrors.push('Invalid e-mail address.'); + preValidationErrors.push(t('user.create.error.email.invalid')); if (!user.password) - preValidationErrors.push('Please type a password.'); + preValidationErrors.push(t('user.create.error.password.missing')); else if (user.password.length < 6) - preValidationErrors.push('Password should have at least 6 characters.'); + preValidationErrors.push(t('user.create.error.password.length')); // Avoid e-mail confirmation at development environment // if (process.env.NODE_ENV == 'development') { @@ -71,7 +71,7 @@ exports.create = function (req, res) { // Don't send email if user is active if (!user.needsEmailConfirmation) { - return res.json(messages.success(req.i18n.t('User profile created successfully.'))) + return res.json(messages.success(req.i18n.t('user.create.success.without_token'))) } else { mailer.confirmEmail({ mailSender: req.app.mailer, @@ -82,7 +82,7 @@ exports.create = function (req, res) { if (err) return res.json({ messages: messages.mongooseErrors(req.i18n, err)}); else - return res.json(messages.success(req.i18n('User profile created successfully. An activation link was sent.'))); + return res.json(messages.success(req.i18n.t('user.create.success.with_token'))); }) } }) @@ -101,18 +101,18 @@ exports.update = function (req, res) { // User is changing password if (req.body.userPwd) { if (!user.authenticate(req.body.userPwd)) { - return res.json(400, messages.error('Senha atual inválida.')); + return res.json(400, messages.error(t('user.update.password.error.wrong'))); } else if (req.body.newPwd.length < 6) { - return res.json(400, messages.error('A nova senha deve ter no mínimo 6 caracteres.')); + return res.json(400, messages.error(t('user.update.password.error.length'))); } else { if (req.body.newPwd == req.body.validatePwd){ user.password = req.body.newPwd; user.save(function(err){ if (err) res.json(400, messages.errors(err)); - else res.json(messages.success('Senha alterada com sucesso.')); + else res.json(messages.success(t('user.update.password.success'))); }); } else { - return res.json(400, messages.error("As senhas não coincidem.")); + return res.json(400, messages.error(t('user.update.password.error.dont_match'))); } } @@ -121,28 +121,28 @@ exports.update = function (req, res) { // Check if is a diffent e-mail if (req.body.email == user.email) { - return res.json(400, messages.error('Este já é o e-mail associado com seu perfil.')); + return res.json(400, messages.error(t('user.update.email.error.already_associated'))); } // Check if is valid if (!validator.isEmail(req.body.email)) { - return res.json(400, messages.error('E-mail inválido.')); + return res.json(400, messages.error(t('user.update.email.error.invalid'))); } // Send confirmation, if e-mail is not already used User.findOne({email: req.body.email}, function(err, anotherUser){ if (!req.body.callback_url){ - return res.json(400, messages.error("Invalid request (missing callback URL).")); + return res.json(400, messages.error(t('user.update.email.error.missing_callback'))); } else if (!anotherUser) { mailer.changeEmail(user, req.body.email, req.body.callback_url, function(err){ if (err) { - return res.json(400, messages.error("Erro ao enviar e-mail de alteração de endereço.")); + return res.json(400, messages.error(t('user.update.email.error.mailer'))); } else { - return res.json(messages.success('Um e-mail foi enviado para confirmação do novo endereço.')); + return res.json(messages.success(t('user.update.email.success'))); } }); } else { - return res.json(400, messages.error("Este endereço de e-mail já está cadastrado.")); + return res.json(400, messages.error(t('user.update.email.error.already_used'))); } }) @@ -154,7 +154,7 @@ exports.update = function (req, res) { user.username = req.body.username; user.save(function(err){ if (err) res.json(400, messages.errors(err)); - else res.json(messages.success('Perfil do usuário atualizado com sucesso.')); + else res.json(messages.success(t('user.update.success'))); }); } @@ -243,7 +243,7 @@ exports.resetPasswordToken = function (req, res) { }, function(err,user){ if (err) res.render('users/forgot_password', { - title: 'Recuperar senha', + title: t('user.reset_pwd.mail.title'), message: req.flash('error') }); else { @@ -256,12 +256,12 @@ exports.resetPasswordToken = function (req, res) { if (err) return res.json(messages.errors(err)); else - return res.json(messages.success('Um link de alteração de senha foi enviado para seu e-mail.')); + return res.json(messages.success(t('user.reset_pwd.token.success'))); }); } else { - req.flash('error', 'Usuário não encontrado.'); + req.flash('error', t('user.reset_pwd.form.error.user.not_found')); res.render('users/forgot_password', { - title: 'Recuperar senha', + title: t('user.reset_pwd.form.title'), message: req.flash('error') }); } @@ -289,15 +289,15 @@ exports.migrate = function (req, res) { errors = []; if (!email) { - errors.push('Informe um e-mail.'); + errors.push(t('user.migrate.form.errors.email.missing')); } if (!password) { - errors.push('Informe uma nova senha'); + errors.push(t('user.migrate.form.errors.password.missing')); } if ((password) && (password.length < 6)) { - errors.push('A nova senha deve ter ao menos 6 caracteres.'); + errors.push(t('user.migrate.form.errors.password.length')); } if (errors.length > 0) { @@ -314,13 +314,13 @@ exports.migrate = function (req, res) { }); } else if (!user) { res.render('users/migrate', { - errors: ['Usuário não encontrado ou migração já realizada.'], + errors: [t('user.migrate.form.errors.user.not_found')], email: email }); } else { mailer.migrateAccount(user, password, function(err){ res.render('users/migrate', { - info: ['Um link de confirmação de migração foi enviado ao seu e-mail.'], + info: [t('user.migrate.form.success')], email: email }); }) diff --git a/locales/en/translation.json b/locales/en/translation.json index ed5314d..6230e94 100644 --- a/locales/en/translation.json +++ b/locales/en/translation.json @@ -40,9 +40,6 @@ "There are no users!": "", "Update": "", "Use SSL": "", - "User profile created successfully": { - "": "" - }, "Users": "", "a brief site description": "", "access_token": { @@ -248,6 +245,82 @@ "success": "Password changed successfully." } }, + "user": { + "create": { + "error": { + "email": { + "invalid": "Invalid e-mail address.", + "missing": "Please type an e-mail address." + }, + "missing_name": "Please enter your name.", + "password": { + "length": "Password should have at least 6 characters.", + "missing": "Please type a password." + } + }, + "success": { + "with_token": "User profile created successfully. An activation link was sent.", + "without_token": "User profile created successfully." + } + }, + "load": { + "error": "Failed to load user with id " + }, + "migrate": { + "form": { + "errors": { + "email": { + "missing": "Please inform an e-mail." + }, + "password": { + "length": "Password should have at least 6 characters.", + "missing": "Please type a password." + }, + "user": { + "not_found": "User not found or migration already done." + } + }, + "success": "A activation was sent to your e-mail." + } + }, + "reset_pwd": { + "form": { + "error": { + "user": { + "not_found": "User not found." + } + }, + "title": "Recover password" + }, + "mail": { + "title": "Recover password" + }, + "token": { + "success": "Password change token sent successfully." + } + }, + "update": { + "email": { + "error": { + "already_associated": "E-mail already associated to account.", + "already_used": "This e-mail address is already used.", + "invalid": "Invalid e-mail address.", + "mailer": "Error while sending e-mail confirmation.", + "missing_callback": "Missing callback." + }, + "success": "An e-mail was sent to confirm address change." + }, + "password": { + "error": { + "dont_match": "Passwords don't match.", + "length": "Password should be at least 6 characters long.", + "wrong": "Wrong password." + }, + "success": "Password changed successfully." + }, + "success": "Profile updated successfully." + } + }, "username": "", "your site title": "", "your yby client URL": "", diff --git a/locales/es/translation.json b/locales/es/translation.json index b5fac26..05ce6f5 100644 --- a/locales/es/translation.json +++ b/locales/es/translation.json @@ -40,9 +40,6 @@ "There are no users!": "", "Update": "Update", "Use SSL": "Use SSL", - "User profile created successfully": { - "": "" - }, "Users": "Users", "a brief site description": "a brief site description", "access_token": { @@ -248,6 +245,79 @@ "success": "" } }, + "user": { + "create": { + "error": { + "email": { + "invalid": "", + "missing": "" + }, + "missing_name": "", + "password": { + "length": "", + "missing": "" + } + }, + "success": "" + }, + "load": { + "error": "" + }, + "migrate": { + "form": { + "errors": { + "email": { + "missing": "" + }, + "password": { + "length": "", + "missing": "" + }, + "user": { + "not_found": "" + } + }, + "success": "" + } + }, + "reset_pwd": { + "form": { + "error": { + "user": { + "not_found": "" + } + }, + "title": "" + }, + "mail": { + "title": "" + }, + "token": { + "success": "" + } + }, + "update": { + "email": { + "error": { + "already_associated": "", + "already_used": "", + "invalid": "", + "mailer": "", + "missing_callback": "" + }, + "success": "" + }, + "password": { + "error": { + "dont_match": "", + "length": "", + "wrong": "" + }, + "success": "" + }, + "success": "Profile updated successfully." + } + }, "username": "username", "your site title": "your site title", "your yby client URL": "your yby client URL", diff --git a/locales/pt-BR/translation.json b/locales/pt-BR/translation.json index 92a2e2e..c9e3dee 100644 --- a/locales/pt-BR/translation.json +++ b/locales/pt-BR/translation.json @@ -40,9 +40,6 @@ "There are no users!": "", "Update": "Update", "Use SSL": "Use SSL", - "User profile created successfully": { - "": "" - }, "Users": "Users", "a brief site description": "a brief site description", "access_token": { @@ -248,6 +245,79 @@ "success": "" } }, + "user": { + "create": { + "error": { + "email": { + "invalid": "", + "missing": "" + }, + "missing_name": "", + "password": { + "length": "", + "missing": "" + } + }, + "success": "" + }, + "load": { + "error": "" + }, + "migrate": { + "form": { + "errors": { + "email": { + "missing": "" + }, + "password": { + "length": "", + "missing": "" + }, + "user": { + "not_found": "" + } + }, + "success": "" + } + }, + "reset_pwd": { + "form": { + "error": { + "user": { + "not_found": "" + } + }, + "title": "" + }, + "mail": { + "title": "" + }, + "token": { + "success": "" + } + }, + "update": { + "email": { + "error": { + "already_associated": "", + "already_used": "", + "invalid": "", + "mailer": "", + "missing_callback": "" + }, + "success": "" + }, + "password": { + "error": { + "dont_match": "", + "length": "", + "wrong": "" + }, + "success": "" + }, + "success": "Profile updated successfully." + } + }, "username": "username", "your site title": "your site title", "your yby client URL": "your yby client URL", diff --git a/locales/pt/translation.json b/locales/pt/translation.json index b5fac26..05ce6f5 100644 --- a/locales/pt/translation.json +++ b/locales/pt/translation.json @@ -40,9 +40,6 @@ "There are no users!": "", "Update": "Update", "Use SSL": "Use SSL", - "User profile created successfully": { - "": "" - }, "Users": "Users", "a brief site description": "a brief site description", "access_token": { @@ -248,6 +245,79 @@ "success": "" } }, + "user": { + "create": { + "error": { + "email": { + "invalid": "", + "missing": "" + }, + "missing_name": "", + "password": { + "length": "", + "missing": "" + } + }, + "success": "" + }, + "load": { + "error": "" + }, + "migrate": { + "form": { + "errors": { + "email": { + "missing": "" + }, + "password": { + "length": "", + "missing": "" + }, + "user": { + "not_found": "" + } + }, + "success": "" + } + }, + "reset_pwd": { + "form": { + "error": { + "user": { + "not_found": "" + } + }, + "title": "" + }, + "mail": { + "title": "" + }, + "token": { + "success": "" + } + }, + "update": { + "email": { + "error": { + "already_associated": "", + "already_used": "", + "invalid": "", + "mailer": "", + "missing_callback": "" + }, + "success": "" + }, + "password": { + "error": { + "dont_match": "", + "length": "", + "wrong": "" + }, + "success": "" + }, + "success": "Profile updated successfully." + } + }, "username": "username", "your site title": "your site title", "your yby client URL": "your yby client URL", From 0062d152dc4358f2e8fd3c9cd7dd40c908d5aa58 Mon Sep 17 00:00:00 2001 From: Vitor George Date: Fri, 2 May 2014 18:03:08 -0300 Subject: [PATCH 05/10] Translation do pt-BR --- app/views/admin/first_admin.jade | 18 +- app/views/admin/login.jade | 12 +- app/views/admin/menu.jade | 12 +- app/views/admin/settings/index.jade | 24 +- app/views/admin/settings/mailer.jade | 24 +- app/views/admin/users/new.jade | 16 +- app/views/admin/users/roles.jade | 13 +- app/views/includes/header.jade | 6 +- app/views/layouts/admin-area.jade | 2 +- app/views/layouts/default.jade | 2 +- locales/en/translation.json | 141 +++++++----- locales/es/translation.json | 320 ++++++++++++++------------ locales/pt-BR/translation.json | 324 +++++++++++++++------------ locales/pt/translation.json | 324 +++++++++++++++------------ 14 files changed, 669 insertions(+), 569 deletions(-) diff --git a/app/views/admin/first_admin.jade b/app/views/admin/first_admin.jade index 938d23d..78b4cec 100644 --- a/app/views/admin/first_admin.jade +++ b/app/views/admin/first_admin.jade @@ -7,9 +7,9 @@ html section#login .login-content - h1= t('Administrative area') + h1= t('views.admin.first_admin.administrative_area') include ../includes/messages - p= t("Create first admin user")+':' + p= t('views.admin.first_admin.create_first_admin_user') .login-form form.form-horizontal(action="/admin/first_admin", method="post", role="form") input(type='hidden', name='_csrf', value="#{csrf_token}") @@ -17,19 +17,19 @@ html p.col-sm-offset-2.error= message .form-group - label.col-sm-2.control-label(for="name")=t('Name') + label.col-sm-2.control-label(for="name")=t('views.admin.first_admin.name') .col-sm-10 - input#email.form-control(type="name", placeholder=t('Name'), name="name") + input#email.form-control(type="name", placeholder=t('views.admin.first_admin.name'), name="name") .form-group - label.col-sm-2.control-label(for="email")=t('E-mail') + label.col-sm-2.control-label(for="email")=t('views.admin.first_admin.email') .col-sm-10 - input#email.form-control(type="email", placeholder=t('E-mail'), name="email") + input#email.form-control(type="email", placeholder=t('views.admin.first_admin.email'), name="email") .form-group - label.col-sm-2.control-label(for="password")=t('Password') + label.col-sm-2.control-label(for="password")=t('views.admin.first_admin.password') .col-sm-10 - input#password.form-control(type="password", placeholder=t('Password'), name="password") + input#password.form-control(type="password", placeholder=t('views.admin.first_admin.password'), name="password") - input.btn.btn-primary(type='submit' value=t('Create admin')) + input.btn.btn-primary(type='submit' value=t('views.admin.first_admin.create_admin')) diff --git a/app/views/admin/login.jade b/app/views/admin/login.jade index 53e26c5..385303e 100644 --- a/app/views/admin/login.jade +++ b/app/views/admin/login.jade @@ -7,7 +7,7 @@ html section#login .login-content - h1=t('Administrative area') + h1=t('views.admin.login.administrative_area') include ../includes/messages .login-form form.form-horizontal(action="/admin/session", method="post", role="form") @@ -16,13 +16,13 @@ html p.col-sm-offset-2.error= message .form-group - label.col-sm-2.control-label(for="email")=t('E-mail') + label.col-sm-2.control-label(for="email")=t('views.admin.login.email') .col-sm-10 - input#email.form-control(type="email", placeholder=t('Email'), name="email") + input#email.form-control(type="email", placeholder=t('views.admin.login.email'), name="email") .form-group - label.col-sm-2.control-label(for="password")=t('Password') + label.col-sm-2.control-label(for="password")=t('views.admin.login.password') .col-sm-10 - input#password.form-control(type="password", placeholder=t('"Password"'), name="password") + input#password.form-control(type="password", placeholder=t('views.admin.login.password'), name="password") - input.btn.btn-primary(type='submit' value=t("Log in")) + input.btn.btn-primary(type='submit' value=t("views.admin.login.login")) diff --git a/app/views/admin/menu.jade b/app/views/admin/menu.jade index 96740b1..b3cc57c 100644 --- a/app/views/admin/menu.jade +++ b/app/views/admin/menu.jade @@ -1,16 +1,16 @@ ul li - a(href="/admin/settings")=t('Settings') + a(href="/admin/settings")=t('views.admin.menu.settings') ul li - a(href="/admin/settings")=t('General') + a(href="/admin/settings")=t('views.admin.menu.general') li - a(href="/admin/settings/mail")=t('Mailer') + a(href="/admin/settings/mail")=t('views.admin.menu.mailer') li - a(href="/admin/users")=t('Users') + a(href="/admin/users")=t('views.admin.menu.manage_users') ul li - a(href="/admin/users/invite")=t('Invite new') + a(href="/admin/users/invite")=t('views.admin.menu.users.invite') li - a(href="/admin/users/roles")=t('Manage roles') \ No newline at end of file + a(href="/admin/users/roles")=t('views.admin.menu.users.roles') \ No newline at end of file diff --git a/app/views/admin/settings/index.jade b/app/views/admin/settings/index.jade index f8e3cc8..1f0f4d5 100755 --- a/app/views/admin/settings/index.jade +++ b/app/views/admin/settings/index.jade @@ -2,38 +2,38 @@ extends ../../layouts/admin-area block content section#dashboard - h3=t('General settings') + h3=t('views.admin.settings.index.general_settings') form(action="/admin/settings" method="post" role="form") table.form tr td.label - label(for="settings.title")=t('Site title') + label(for="settings.title")=t('views.admin.settings.index.site_title') td.input - input(name="settings[title]" value=settings.title type="text" placeholder=t("your site title")) + input(name="settings[title]" value=settings.title type="text") tr td.label - label(for="settings.description")=t('Site description') + label(for="settings.description")=t('views.admin.settings.index.site_description') td.input - textarea(name="settings[description]" rows="5" placeholder=t("a brief site description"))=settings.description + textarea(name="settings[description]" rows="5"))=settings.description tr td.label - label(for="settings.serverUrl")=t('Server URL') + label(for="settings.serverUrl")=t('views.admin.settings.index.server_url') td.input - input(name="settings[serverUrl]" value=settings.serverUrl type="text" placeholder=t("your yby server URL")) + input(name="settings[serverUrl]" value=settings.serverUrl type="text")) tr td.label - label(for="settings.clientUrl")=t('Client URL') + label(for="settings.clientUrl")=t('views.admin.settings.index.client_url') td.input - input(name="settings[clientUrl]" value=settings.clientUrl type="text" placeholder=t("your yby client URL")) + input(name="settings[clientUrl]" value=settings.clientUrl type="text")) tr td.label - label(for="settings.onlyInvitedUsers")=t('Only invited users can register') + label(for="settings.onlyInvitedUsers")=t('views.admin.settings.index.only_invited_can_register') td.input input(type="checkbox" name="settings[onlyInvitedUsers]" checked=settings.onlyInvitedUsers) tr td.label - label(for="settings.allowImports")=t('Allow geo-files import') + label(for="settings.allowImports")=t('views.admin.settings.index.allow_geofiles_import') td.input input(type="checkbox" name="settings[allowImports]" checked=settings.allowImports) - input.btn.btn-primary(type='submit' value=t("Update")) \ No newline at end of file + input.btn.btn-primary(type='submit' value=t("views.admin.settings.index.update")) \ No newline at end of file diff --git a/app/views/admin/settings/mailer.jade b/app/views/admin/settings/mailer.jade index a1da3c2..b88cfb3 100644 --- a/app/views/admin/settings/mailer.jade +++ b/app/views/admin/settings/mailer.jade @@ -4,40 +4,40 @@ block content section#dashboard - mailer = settings.mailer - h3=t('Mailer configuration') + h3=t('views.admin.settings.mailer.mailer_settings') form(action="/admin/settings/mail" method="post" role="form") table.formsender tr td.label - label(for="mailer.from")=t('"From" address') + label(for="mailer.from")=t('views.admin.settings.mailer.from_address') td.input - input(type="text" name="mailer[from]" value=mailer.from placeholder=t("e.g. Notifications ")) + input(type="text" name="mailer[from]" value=mailer.from) tr td.label - label(for="mailer[host]")=t('SMTP Host') + label(for="mailer[host]")=t('views.admin.settings.mailer.smtp_host') td.input - input(name="mailer[host]" value=mailer.host type="text" placeholder=t("e.g. smtp.yourmailhost.com"))=mailer.host + input(name="mailer[host]" value=mailer.host type="text")=mailer.host tr td.label - label(for="mailer.secureConnection")=t('Use SSL') + label(for="mailer.secureConnection")=t('views.admin.settings.mailer.use_ssl') td.input input(type="checkbox" name="mailer[secureConnection]" checked=mailer.secureConnection) tr td.label - label(for="mailer.post")=t('Port') + label(for="mailer.port")=t('views.admin.settings.mailer.smtp_port') td.input - input(type="text" name="mailer[port]" value=mailer.port placeholder=t('SMTP port')) + input(type="text" name="mailer[port]" value=mailer.port) tr td.label - label(for="mailer.auth.user")=t('SMTP User') + label(for="mailer.auth.user")=t('views.admin.settings.mailer.smtp_user') td.input - input(type="text" name="mailer[auth][user]" value=mailer.auth.user placeholder=t('username')) + input(type="text" name="mailer[auth][user]" value=mailer.auth.user) tr td.label - label(for="mailer.pass")=t('Password (will be stored as plain text)') + label(for="mailer.pass")=t('views.admin.settings.mailer.password') td.input input(type="password" name="mailer[auth][pass]" value=mailer.auth.pass) - input.btn.btn-primary(type='submit' value="Update") \ No newline at end of file + input.btn.btn-primary(type='submit' value=t('views.admin.settings.mailer.update')) \ No newline at end of file diff --git a/app/views/admin/users/new.jade b/app/views/admin/users/new.jade index 3de31d8..7c1d038 100755 --- a/app/views/admin/users/new.jade +++ b/app/views/admin/users/new.jade @@ -2,26 +2,26 @@ extends ../../layouts/admin-area block content section#dashboard - h3=t('Invite a user') + h3=t('views.admin.users.new.invite_a_user') include ../../includes/messages.jade form(action="/admin/users/invite" method="post" role="form") table.form tr td.label - label(for="user[name]")=t('Name') + label(for="user[name]")=t('views.admin.users.new.name') td.input input(name="user[name]" type="text") tr td.label - label(for="user[email]")=t('E-mail') + label(for="user[email]")=t('views.admin.users.new.email') td.input input(name="user[email]" type="text") tr td.label - label(for="user[role]")=t('Role') + label(for="user[role]")=t('views.admin.users.new.role') td.input select(name="user[role]") - option(value='collaborator')=t('Colaborator') - option(value='editor')=t('Editor') - option(value='admin')=t('Administrador') - input.btn.btn-primary(type='submit' value=t('Send invitation')) \ No newline at end of file + option(value='collaborator')=t('views.admin.users.new.colaborator') + option(value='editor')=t('views.admin.users.new.editor') + option(value='admin')=t('views.admin.users.new.admin') + input.btn.btn-primary(type='submit' value=t('views.admin.users.new.send_invitation')) \ No newline at end of file diff --git a/app/views/admin/users/roles.jade b/app/views/admin/users/roles.jade index a8d7d43..c81531f 100644 --- a/app/views/admin/users/roles.jade +++ b/app/views/admin/users/roles.jade @@ -2,20 +2,19 @@ extends ../../layouts/admin-area block content section#dashboard - h3=t('Mange user roles') - - console.log(errors); + h3=t('views.admin.users.roles.manage_user_roles') include ../../includes/messages.jade - if (!users) - p=t('There are no users!') + p=t('views.admin.users.roles.there_are_no_users') - else table thead tr - th=t('Name') - th=t('E-mail') - th=t('Permissão') + th=t('views.admin.users.roles.name') + th=t('views.admin.users.roles.email') + th=t('views.admin.users.roles.role') tbody - each user in users tr @@ -27,4 +26,4 @@ block content select(name='role') - each role in ['collaborator', 'editor', 'admin'] option(value=role, selected=user.role == role)=t(role) - input.btn.btn-primary(type='submit' value=t('Change')) \ No newline at end of file + input.btn.btn-primary(type='submit' value=t('views.admin.users.roles.change')) \ No newline at end of file diff --git a/app/views/includes/header.jade b/app/views/includes/header.jade index 7a0f041..80582d0 100644 --- a/app/views/includes/header.jade +++ b/app/views/includes/header.jade @@ -3,17 +3,17 @@ header#mast-header .container .six.columns h1 - a(class="brand" href="/admin" target="_self")=t('Administrative area') + a(class="brand" href="/admin" target="_self")=t('views.includes.header.admin_area_link') .six.columns ul#mast-nav - if (req.isAuthenticated()) li - a(href="/admin/logout", title="Logout" target="_self") + a(href="/admin/logout", title=t('views.includes.header.logout') target="_self") span.lsf  | Logout - else li a.login(href="/admin/login" target="_self") span.lsf  - | Login \ No newline at end of file + t('views.includes.header.login') \ No newline at end of file diff --git a/app/views/layouts/admin-area.jade b/app/views/layouts/admin-area.jade index c2de33e..c38174e 100644 --- a/app/views/layouts/admin-area.jade +++ b/app/views/layouts/admin-area.jade @@ -9,7 +9,7 @@ html header.admin-head .container .twelve.columns - h1=t('Administration') + h1=t('views.layouts.admin_area.administration') .container .four.columns nav#admin-nav.row diff --git a/app/views/layouts/default.jade b/app/views/layouts/default.jade index 7ba204d..386fbc4 100644 --- a/app/views/layouts/default.jade +++ b/app/views/layouts/default.jade @@ -1,5 +1,5 @@ doctype html -html(ng-app="mapasColetivos") +html(ng-app="yby") include ../includes/head body include ../includes/header diff --git a/locales/en/translation.json b/locales/en/translation.json index 6230e94..56d2553 100644 --- a/locales/en/translation.json +++ b/locales/en/translation.json @@ -1,47 +1,4 @@ { - "\"From\" address": "", - "\"Password\"": "", - "Administrador": "", - "Administration": "", - "Administrative area": "", - "Allow geo-files import": "", - "Change": "", - "Client URL": "", - "Colaborator": "", - "Create admin": "", - "Create first admin user": "", - "E-mail": "", - "Editor": "", - "Email": "", - "General": "", - "General settings": "", - "Invite a user": "", - "Invite new": "", - "Log in": "", - "Mailer": "", - "Mailer configuration": "", - "Manage roles": "", - "Mange user roles": "", - "Name": "", - "Only invited users can register": "", - "Password": "", - "Password (will be stored as plain text)": "", - "Permissão": "", - "Port": "", - "Role": "", - "SMTP Host": "", - "SMTP User": "", - "SMTP port": "", - "Send invitation": "", - "Server URL": "", - "Settings": "", - "Site description": "", - "Site title": "", - "There are no users!": "", - "Update": "", - "Use SSL": "", - "Users": "", - "a brief site description": "", "access_token": { "authsocial": { "error": { @@ -110,18 +67,6 @@ } } }, - "e": { - "g": { - " Notifications ": "" - }, - " smtp": { - "yourmailhost": { - "com": "" - } - } - } - }, "feature": { "add_content": { "success": "Content added successfully." @@ -321,8 +266,86 @@ "success": "Profile updated successfully." } }, - "username": "", - "your site title": "", - "your yby client URL": "", - "your yby server URL": "" + "views": { + "admin": { + "first_admin": { + "administrative_area": "Administrative Area", + "create_admin": "Create Admin", + "create_first_admin_user": "Create first admin user:", + "email": "E-mail", + "name": "Name", + "password": "Password" + }, + "login": { + "administrative_area": "Administrative Area", + "email": "E-mail", + "login": "Login", + "password": "Password" + }, + "menu": { + "general": "General", + "mailer": "Mailer", + "manage_users": "Manage users", + "settings": "Settings", + "users": { + "invite": "Invites", + "roles": "Roles" + } + }, + "settings": { + "index": { + "allow_geofiles_import": "Allow Geofiles import", + "client_url": "Client URL", + "general_settings": "General Settings", + "only_invited_can_register": "Only invited can register", + "server_url": "Server URL", + "site_description": "Site Description", + "site_title": "Site Title", + "update": "Update" + }, + "mailer": { + "from_address": "Sender e-mail address", + "mailer_settings": "Mailer Settings", + "password": "SMTP Password", + "smtp_host": "SMTP Host", + "smtp_port": "SMTP Port", + "smtp_user": "SMTP User", + "update": "Update", + "use_ssl": "Use SSL" + } + }, + "users": { + "new": { + "admin": "Admin", + "colaborator": "Colaborator", + "editor": "Editor", + "email": "E-mail", + "invite_a_user": "Invite a user:", + "name": "Name", + "role": "Role", + "send_invitation": "Send invitation" + }, + "roles": { + "change": "Change", + "email": "E-mail", + "manage_user_roles": "Manage User Roles", + "name": "Name", + "role": "Role", + "there_are_no_users": "There are no users." + } + } + }, + "includes": { + "header": { + "admin_area_link": "Go to Admin Area", + "login": "Login", + "logout": "Logout" + } + }, + "layouts": { + "admin_area": { + "administration": "Administration" + } + } + } } \ No newline at end of file diff --git a/locales/es/translation.json b/locales/es/translation.json index 05ce6f5..56d2553 100644 --- a/locales/es/translation.json +++ b/locales/es/translation.json @@ -1,157 +1,102 @@ { - "\"From\" address": "", - "\"Password\"": "\"Password\"", - "Administrador": "Administrador", - "Administration": "Administration", - "Administrative area": "Administrative area", - "Allow geo-files import": "Allow geo-files import", - "Change": "Change", - "Client URL": "Client URL", - "Colaborator": "Colaborator", - "Create admin": "Create admin", - "Create first admin user": "", - "E-mail": "E-mail", - "Editor": "Editor", - "Email": "Email", - "General": "General", - "General settings": "General settings", - "Invite a user": "Invite a user", - "Invite new": "Invite new", - "Log in": "Log in", - "Mailer": "Mailer", - "Mailer configuration": "Mailer configuration", - "Manage roles": "Manage roles", - "Mange user roles": "Mange user roles", - "Name": "Name", - "Only invited users can register": "Only invited users can register", - "Password": "Password", - "Password (will be stored as plain text)": "Password (will be stored as plain text)", - "Permissão": "Permissão", - "Port": "Port", - "Role": "Role", - "SMTP Host": "SMTP Host", - "SMTP User": "SMTP User", - "SMTP port": "SMTP port", - "Send invitation": "Send invitation", - "Server URL": "Server URL", - "Settings": "Settings", - "Site description": "Site description", - "Site title": "Site title", - "There are no users!": "", - "Update": "Update", - "Use SSL": "Use SSL", - "Users": "Users", - "a brief site description": "a brief site description", "access_token": { "authsocial": { "error": { - "load_user": "", - "save_user": "" + "load_user": "Error loading user.", + "save_user": "Error while saving user." } }, "facebook": { "error": { - "missing_token": "" + "missing_token": "Missing Facebook authorization token." } }, "google": { "error": { - "missing_token": "" + "missing_token": "Missing Google authorization token." } }, "local": { "error": { - "need_password": "", - "needs_activation": "", - "send_email": "" + "need_password": "Your need a password to acccess your profile. Check your e-mail to continue.", + "needs_activation": "Profile not active, an activation email was sent.", + "send_email": "There was an error while sending a password token to your e-mail." }, - "needs_migration": "", - "unauthorized": "" + "needs_migration": "Your account wasn't migrated yet, please visit this page.", + "unauthorized": "Unauthorized." }, "logout": { "error": { - "inexistent_token": "", - "not_logged": "" + "inexistent_token": "Can't find access token.", + "not_logged": "You are not logged in." }, - "successful": "" + "successful": "Logout successful." } }, "admin": { "api_settings": { "error": { - "load": "" + "load": "Could not retrive server info." } }, "first_admin": { "error": { - "already_exists": "", - "invalid_email": "", - "needs_email": "", - "needs_name": "", - "password_length": "", - "password_missing": "" + "already_exists": "An admin already exists.", + "invalid_email": "Invalid e-mail address.", + "needs_email": "Please enter a e-mail address.", + "needs_name": "Please enter a name.", + "password_length": "Password should have at least 6 characters.", + "password_missing": "Please type a password." }, - "success": "" + "success": "Admin created successfully." }, "invite_user": { "error": { - "already_active": "" + "already_active": "User is already active." }, - "success": "" + "success": "User invited successfully." } }, "content": { "destroy": { - "success": "" + "success": "Content removed successfully." }, "load": { "error": { - "not_found": "" - } - } - }, - "e": { - "g": { - " Notifications ": "" - }, - " smtp": { - "yourmailhost": { - "com": "" - } + "not_found": "Content not found." } } }, "feature": { "add_content": { - "success": "" + "success": "Content added successfully." }, "import": { "error": { - "disabled": "" + "disabled": "Geo files import is disabled." } }, "load": { "error": { - "cant_find": "" + "cant_find": "Can't find feature." } }, "remove_content": { - "success": "" + "success": "Content removed successfully." } }, "image": { "create": { "error": { - "not_found": "" + "not_found": "Image file not found" } }, "destroy": { - "success": "" + "success": "Image removed successfully." }, "load": { "error": { - "not_found": "" + "not_found": "Image not found." } } }, @@ -159,167 +104,248 @@ "contributor": { "add": { "error": { - "already_exists": "", - "dont_exists": "", - "email": "" + "already_exists": "User is already layer creator.", + "dont_exists": "Can't find user with this e-mail.", + "email": "Error while sending e-mail to contributor." }, - "success": "" + "success": "Contributor added successfully." }, "remove": { "error": { - "invalid_id": "" + "invalid_id": "Invalid contributor id." }, - "success": "" + "success": "Contributor removed successfully." } }, "create": { - "missing": "", - "success": "" + "missing": "Layer type missing.", + "success": "Layer created successfully." }, "destroy": { - "success": "" + "success": "Layer removed successfully." }, "load": { "error": "Error loading layer.", - "not_found": "" + "not_found": "Layer not found." }, "update": { - "success": "", + "success": "Layer updated successfully.", "tilelayer": { - "error": "" + "error": "Can't update TileLayer" } } }, "map": { "destroy": { - "success": "" + "success": "Map removed successfully." }, "load": { "error": { - "not_found": "" + "not_found": "Map not found." } } }, "token": { "accept_invitation": { "error": { - "invalid_token": "", - "user_activation": "" + "invalid_token": "Invalid token.", + "user_activation": "Can't actived this user." }, - "success": "" + "success": "Profile activated successfully." }, "activate_account": { "error": { - "invalid": "", - "saving": "", - "user": "" + "invalid": "Invalid token.", + "saving": "Error while saving token.", + "user": "Can't activate this user." }, - "success": "" + "success": "Profile activated successfully, please wait redirection." }, "email_change": { "error": { - "generic": "" + "generic": "Error while changing user e-mail." }, - "success": "" + "success": "E-mail changed successfully." }, "error": { - "cant_save": "", - "invalid": "" + "cant_save": "Can't save token.", + "invalid": "Invalid token." }, "load": { "error": { - "expired": "", - "not_found": "" + "expired": "This token expired.", + "not_found": "Token not found." } }, "migration": { "error": { - "generic": "" + "generic": "Error while migrating account." }, - "success": "" + "success": "Account migrated successfully." }, "new_password": { "error": { - "generic": "" + "generic": "Error while changing password." }, - "success": "" + "success": "Password changed successfully." } }, "user": { "create": { "error": { "email": { - "invalid": "", - "missing": "" + "invalid": "Invalid e-mail address.", + "missing": "Please type an e-mail address." }, - "missing_name": "", + "missing_name": "Please enter your name.", "password": { - "length": "", - "missing": "" + "length": "Password should have at least 6 characters.", + "missing": "Please type a password." } }, - "success": "" + "success": { + "with_token": "User profile created successfully. An activation link was sent.", + "without_token": "User profile created successfully." + } }, "load": { - "error": "" + "error": "Failed to load user with id " }, "migrate": { "form": { "errors": { "email": { - "missing": "" + "missing": "Please inform an e-mail." }, "password": { - "length": "", - "missing": "" + "length": "Password should have at least 6 characters.", + "missing": "Please type a password." }, "user": { - "not_found": "" + "not_found": "User not found or migration already done." } }, - "success": "" + "success": "A activation was sent to your e-mail." } }, "reset_pwd": { "form": { "error": { "user": { - "not_found": "" + "not_found": "User not found." } }, - "title": "" + "title": "Recover password" }, "mail": { - "title": "" + "title": "Recover password" }, "token": { - "success": "" + "success": "Password change token sent successfully." } }, "update": { "email": { "error": { - "already_associated": "", - "already_used": "", - "invalid": "", - "mailer": "", - "missing_callback": "" + "already_associated": "E-mail already associated to account.", + "already_used": "This e-mail address is already used.", + "invalid": "Invalid e-mail address.", + "mailer": "Error while sending e-mail confirmation.", + "missing_callback": "Missing callback." }, - "success": "" + "success": "An e-mail was sent to confirm address change." }, "password": { "error": { - "dont_match": "", - "length": "", - "wrong": "" + "dont_match": "Passwords don't match.", + "length": "Password should be at least 6 characters long.", + "wrong": "Wrong password." }, - "success": "" + "success": "Password changed successfully." }, "success": "Profile updated successfully." } }, - "username": "username", - "your site title": "your site title", - "your yby client URL": "your yby client URL", - "your yby server URL": "your yby server URL" + "views": { + "admin": { + "first_admin": { + "administrative_area": "Administrative Area", + "create_admin": "Create Admin", + "create_first_admin_user": "Create first admin user:", + "email": "E-mail", + "name": "Name", + "password": "Password" + }, + "login": { + "administrative_area": "Administrative Area", + "email": "E-mail", + "login": "Login", + "password": "Password" + }, + "menu": { + "general": "General", + "mailer": "Mailer", + "manage_users": "Manage users", + "settings": "Settings", + "users": { + "invite": "Invites", + "roles": "Roles" + } + }, + "settings": { + "index": { + "allow_geofiles_import": "Allow Geofiles import", + "client_url": "Client URL", + "general_settings": "General Settings", + "only_invited_can_register": "Only invited can register", + "server_url": "Server URL", + "site_description": "Site Description", + "site_title": "Site Title", + "update": "Update" + }, + "mailer": { + "from_address": "Sender e-mail address", + "mailer_settings": "Mailer Settings", + "password": "SMTP Password", + "smtp_host": "SMTP Host", + "smtp_port": "SMTP Port", + "smtp_user": "SMTP User", + "update": "Update", + "use_ssl": "Use SSL" + } + }, + "users": { + "new": { + "admin": "Admin", + "colaborator": "Colaborator", + "editor": "Editor", + "email": "E-mail", + "invite_a_user": "Invite a user:", + "name": "Name", + "role": "Role", + "send_invitation": "Send invitation" + }, + "roles": { + "change": "Change", + "email": "E-mail", + "manage_user_roles": "Manage User Roles", + "name": "Name", + "role": "Role", + "there_are_no_users": "There are no users." + } + } + }, + "includes": { + "header": { + "admin_area_link": "Go to Admin Area", + "login": "Login", + "logout": "Logout" + } + }, + "layouts": { + "admin_area": { + "administration": "Administration" + } + } + } } \ No newline at end of file diff --git a/locales/pt-BR/translation.json b/locales/pt-BR/translation.json index c9e3dee..3a52de0 100644 --- a/locales/pt-BR/translation.json +++ b/locales/pt-BR/translation.json @@ -1,157 +1,102 @@ { - "\"From\" address": "", - "\"Password\"": "\"Password\"", - "Administrador": "Administrador", - "Administration": "Administration", - "Administrative area": "Área administrativa", - "Allow geo-files import": "Allow geo-files import", - "Change": "Change", - "Client URL": "Client URL", - "Colaborator": "Colaborator", - "Create admin": "Criar administrador", - "Create first admin user": "", - "E-mail": "E-mail", - "Editor": "Editor", - "Email": "Email", - "General": "General", - "General settings": "Configurações gerais", - "Invite a user": "Invite a user", - "Invite new": "Invite new", - "Log in": "Log in", - "Mailer": "Mailer", - "Mailer configuration": "Mailer configuration", - "Manage roles": "Manage roles", - "Mange user roles": "Mange user roles", - "Name": "Name", - "Only invited users can register": "Only invited users can register", - "Password": "Password", - "Password (will be stored as plain text)": "Password (will be stored as plain text)", - "Permissão": "Permissão", - "Port": "Port", - "Role": "Role", - "SMTP Host": "SMTP Host", - "SMTP User": "SMTP User", - "SMTP port": "SMTP port", - "Send invitation": "Send invitation", - "Server URL": "Server URL", - "Settings": "Settings", - "Site description": "Site description", - "Site title": "Site title", - "There are no users!": "", - "Update": "Update", - "Use SSL": "Use SSL", - "Users": "Users", - "a brief site description": "a brief site description", "access_token": { "authsocial": { "error": { - "load_user": "", - "save_user": "" + "load_user": "Erro carregando usuário.", + "save_user": "Erro salvando usuário." } }, "facebook": { "error": { - "missing_token": "" + "missing_token": "Token de autorização do Facebook não encontrado." } }, "google": { "error": { - "missing_token": "" + "missing_token": "Token de autorização do Google não encontrado." } }, "local": { "error": { - "need_password": "", - "needs_activation": "", - "send_email": "" + "need_password": "Você precisa de uma senha para acessar seu perfil. Verifique seu e-mail.", + "needs_activation": "Perfil de usuário inativo, um e-mail de ativação foi enviado.", + "send_email": "Houve um erro enviando um token de senha para seu e-mail." }, - "needs_migration": "", - "unauthorized": "" + "needs_migration": "Sua conta não foi migrada ainda, por favor visite esta página.", + "unauthorized": "Não autorizado." }, "logout": { "error": { - "inexistent_token": "", - "not_logged": "" + "inexistent_token": "Token de acesso não encontrado.", + "not_logged": "Você não está logado." }, - "successful": "" + "successful": "Logout bem sucedido." } }, "admin": { "api_settings": { "error": { - "load": "" + "load": "Não foi possível buscar informação do servidor." } }, "first_admin": { "error": { - "already_exists": "", - "invalid_email": "", - "needs_email": "", - "needs_name": "", - "password_length": "", - "password_missing": "" + "already_exists": "Um administrador já existe.", + "invalid_email": "Endereço de e-mail inválido.", + "needs_email": "Entre com um endereço de e-mail.", + "needs_name": "Entre com um nome.", + "password_length": "A senha deve ter no mínimo 6 caracteres.", + "password_missing": "Entre com uma senha." }, - "success": "" + "success": "Admin criado com sucesso." }, "invite_user": { "error": { - "already_active": "" + "already_active": "O usuário já está ativo." }, - "success": "" + "success": "Convite foi com sucesso." } }, "content": { "destroy": { - "success": "" + "success": "Conteúdo removido com sucesso." }, "load": { "error": { - "not_found": "" - } - } - }, - "e": { - "g": { - " Notifications ": "" - }, - " smtp": { - "yourmailhost": { - "com": "" - } + "not_found": "Conteúdo não encontrado." } } }, "feature": { "add_content": { - "success": "" + "success": "Conteúdo adicionado com sucesso." }, "import": { "error": { - "disabled": "" + "disabled": "Importação de arquivos não disponível." } }, "load": { "error": { - "cant_find": "" + "cant_find": "Local não encontrado." } }, "remove_content": { - "success": "" + "success": "Conteúdo removido com sucesso." } }, "image": { "create": { "error": { - "not_found": "" + "not_found": "Arquivo de imagem não encontrado." } }, "destroy": { - "success": "" + "success": "Imagem removida com sucesso." }, "load": { "error": { - "not_found": "" + "not_found": "Imagem não encontrada." } } }, @@ -159,167 +104,248 @@ "contributor": { "add": { "error": { - "already_exists": "", - "dont_exists": "", - "email": "" + "already_exists": "Usuário já é contribuidor da camada.", + "dont_exists": "Não existe usuário cadastrado com este e-mail.", + "email": "Erro enviando e-mail para este usuário." }, - "success": "" + "success": "Contribuidor adicionado com sucesso." }, "remove": { "error": { - "invalid_id": "" + "invalid_id": "Id de contribuidor inválido." }, - "success": "" + "success": "Contribuidor adicionado com sucesso." } }, "create": { - "missing": "", - "success": "" + "missing": "Tipo de camada não encontrado.", + "success": "Camada criada com sucesso." }, "destroy": { - "success": "" + "success": "Camada removida com sucesso." }, "load": { - "error": "Error loading layer.", - "not_found": "" + "error": "Erro carregando camada.", + "not_found": "Camada não encontrada." }, "update": { - "success": "", + "success": "Camada atualizada com sucesso.", "tilelayer": { - "error": "" + "error": "Erro ao atualizar TileLayer." } } }, "map": { "destroy": { - "success": "" + "success": "Mapa removido com sucesso." }, "load": { "error": { - "not_found": "" + "not_found": "Mapa não encontrado." } } }, "token": { "accept_invitation": { "error": { - "invalid_token": "", - "user_activation": "" + "invalid_token": "Token inválido.", + "user_activation": "Erro ao ativar usuário." }, - "success": "" + "success": "Perfil ativado com sucesso." }, "activate_account": { "error": { - "invalid": "", - "saving": "", - "user": "" + "invalid": "Token inválido.", + "saving": "Erro salvando token.", + "user": "Não foi possível ativar usuário." }, - "success": "" + "success": "Perfil atualizado com sucesso, aguarde redirecionamento." }, "email_change": { "error": { - "generic": "" + "generic": "Erro ao alterar e-mail do usuário." }, - "success": "" + "success": "E-mail alterado com sucesso." }, "error": { - "cant_save": "", - "invalid": "" + "cant_save": "Erro ao salvar token.", + "invalid": "Token inválido." }, "load": { "error": { - "expired": "", - "not_found": "" + "expired": "Token expirado.", + "not_found": "Token não encontrado." } }, "migration": { "error": { - "generic": "" + "generic": "Um erro ocorreu na migração." }, - "success": "" + "success": "Conta migrada com sucesso." }, "new_password": { "error": { - "generic": "" + "generic": "Erro alterando senha." }, - "success": "" + "success": "Senha alterada com sucesso." } }, "user": { "create": { "error": { "email": { - "invalid": "", - "missing": "" + "invalid": "Endereço de e-mail inválido.", + "missing": "Entre com um endereço de e-mail." }, - "missing_name": "", + "missing_name": "Digite seu nome.", "password": { - "length": "", - "missing": "" + "length": "A senha deve ter no mínimo 6 caracteres.", + "missing": "Entre com uma senha." } }, - "success": "" + "success": { + "with_token": "Perfil de usuário criado com sucesso. Um link de ativação foi enviado.", + "without_token": "Perfil de usuário criado com sucesso." + } }, "load": { - "error": "" + "error": "Erro ao carregar usuário com id " }, "migrate": { "form": { "errors": { "email": { - "missing": "" + "missing": "Digite um e-mail." }, "password": { - "length": "", - "missing": "" + "length": "A senha deve ter no mínimo 6 caracteres.", + "missing": "Entre com uma senha." }, "user": { - "not_found": "" + "not_found": "Usuário não encontrado." } }, - "success": "" + "success": "Um e-mail de ativação foi enviado ao seu e-mail." } }, "reset_pwd": { "form": { "error": { "user": { - "not_found": "" + "not_found": "Usuário não encontrado." } }, - "title": "" + "title": "Recuperar senha" }, "mail": { - "title": "" + "title": "Recuperar senha" }, "token": { - "success": "" + "success": "Token de alteração de senha enviado." } }, "update": { "email": { "error": { - "already_associated": "", - "already_used": "", - "invalid": "", - "mailer": "", - "missing_callback": "" + "already_associated": "E-mail já associado a outra conta.", + "already_used": "E-mail já utilizado.", + "invalid": "Endereço de e-mail inválido.", + "mailer": "Error enviando confirmação de e-mail.", + "missing_callback": "Callback não encontrado." }, - "success": "" + "success": "E-mail de confirmação de endereco enviado." }, "password": { "error": { - "dont_match": "", - "length": "", - "wrong": "" + "dont_match": "Senhas não coincidem.", + "length": "A senha deve ter no mínimo 6 caracteres.", + "wrong": "Senha incorreta." }, - "success": "" + "success": "Senha alterada com sucesso." }, - "success": "Profile updated successfully." + "success": "Perfil atualizado com sucesso." } }, - "username": "username", - "your site title": "your site title", - "your yby client URL": "your yby client URL", - "your yby server URL": "your yby server URL" + "views": { + "admin": { + "first_admin": { + "administrative_area": "Área administrativa", + "create_admin": "Criar admin", + "create_first_admin_user": "Criar o primeiro usuário administrador:", + "email": "E-mail", + "name": "Nome", + "password": "Senha" + }, + "login": { + "administrative_area": "Área administrativa", + "email": "E-mail", + "login": "Entrar", + "password": "Senha" + }, + "menu": { + "general": "Geral", + "mailer": "Envio de e-mail", + "manage_users": "Gerenciar usuários", + "settings": "Configurações", + "users": { + "invite": "Convites", + "roles": "Permissões" + } + }, + "settings": { + "index": { + "allow_geofiles_import": "Permitir importação de arquivo geo", + "client_url": "URL do cliente", + "general_settings": "Configurações gerais", + "only_invited_can_register": "Somente convidados podem registrar-se", + "server_url": "URL do servidor", + "site_description": "Descricão do site", + "site_title": "Título do site", + "update": "Atualizar" + }, + "mailer": { + "from_address": "Endereço do remetente", + "mailer_settings": "Configurações de envio de e-mail", + "password": "Senha do SMTP", + "smtp_host": "Host do SMTP", + "smtp_port": "Porta do SMTP", + "smtp_user": "Usuário do SMTP", + "update": "Atualizar", + "use_ssl": "Usar SSL" + } + }, + "users": { + "new": { + "admin": "Administrador", + "colaborator": "Colaborador", + "editor": "Editor", + "email": "E-mail", + "invite_a_user": "Convidar um usuário:", + "name": "Nome", + "role": "Perfil", + "send_invitation": "Enviar convite" + }, + "roles": { + "change": "Alterar", + "email": "E-mail", + "manage_user_roles": "Gerenciar perfis de usuário", + "name": "Nome", + "role": "Perfil", + "there_are_no_users": "Não há usuários." + } + } + }, + "includes": { + "header": { + "admin_area_link": "Ir para área adminstrativa", + "login": "Entrar", + "logout": "Sair" + } + }, + "layouts": { + "admin_area": { + "administration": "Administração" + } + } + } } \ No newline at end of file diff --git a/locales/pt/translation.json b/locales/pt/translation.json index 05ce6f5..3a52de0 100644 --- a/locales/pt/translation.json +++ b/locales/pt/translation.json @@ -1,157 +1,102 @@ { - "\"From\" address": "", - "\"Password\"": "\"Password\"", - "Administrador": "Administrador", - "Administration": "Administration", - "Administrative area": "Administrative area", - "Allow geo-files import": "Allow geo-files import", - "Change": "Change", - "Client URL": "Client URL", - "Colaborator": "Colaborator", - "Create admin": "Create admin", - "Create first admin user": "", - "E-mail": "E-mail", - "Editor": "Editor", - "Email": "Email", - "General": "General", - "General settings": "General settings", - "Invite a user": "Invite a user", - "Invite new": "Invite new", - "Log in": "Log in", - "Mailer": "Mailer", - "Mailer configuration": "Mailer configuration", - "Manage roles": "Manage roles", - "Mange user roles": "Mange user roles", - "Name": "Name", - "Only invited users can register": "Only invited users can register", - "Password": "Password", - "Password (will be stored as plain text)": "Password (will be stored as plain text)", - "Permissão": "Permissão", - "Port": "Port", - "Role": "Role", - "SMTP Host": "SMTP Host", - "SMTP User": "SMTP User", - "SMTP port": "SMTP port", - "Send invitation": "Send invitation", - "Server URL": "Server URL", - "Settings": "Settings", - "Site description": "Site description", - "Site title": "Site title", - "There are no users!": "", - "Update": "Update", - "Use SSL": "Use SSL", - "Users": "Users", - "a brief site description": "a brief site description", "access_token": { "authsocial": { "error": { - "load_user": "", - "save_user": "" + "load_user": "Erro carregando usuário.", + "save_user": "Erro salvando usuário." } }, "facebook": { "error": { - "missing_token": "" + "missing_token": "Token de autorização do Facebook não encontrado." } }, "google": { "error": { - "missing_token": "" + "missing_token": "Token de autorização do Google não encontrado." } }, "local": { "error": { - "need_password": "", - "needs_activation": "", - "send_email": "" + "need_password": "Você precisa de uma senha para acessar seu perfil. Verifique seu e-mail.", + "needs_activation": "Perfil de usuário inativo, um e-mail de ativação foi enviado.", + "send_email": "Houve um erro enviando um token de senha para seu e-mail." }, - "needs_migration": "", - "unauthorized": "" + "needs_migration": "Sua conta não foi migrada ainda, por favor visite esta página.", + "unauthorized": "Não autorizado." }, "logout": { "error": { - "inexistent_token": "", - "not_logged": "" + "inexistent_token": "Token de acesso não encontrado.", + "not_logged": "Você não está logado." }, - "successful": "" + "successful": "Logout bem sucedido." } }, "admin": { "api_settings": { "error": { - "load": "" + "load": "Não foi possível buscar informação do servidor." } }, "first_admin": { "error": { - "already_exists": "", - "invalid_email": "", - "needs_email": "", - "needs_name": "", - "password_length": "", - "password_missing": "" + "already_exists": "Um administrador já existe.", + "invalid_email": "Endereço de e-mail inválido.", + "needs_email": "Entre com um endereço de e-mail.", + "needs_name": "Entre com um nome.", + "password_length": "A senha deve ter no mínimo 6 caracteres.", + "password_missing": "Entre com uma senha." }, - "success": "" + "success": "Admin criado com sucesso." }, "invite_user": { "error": { - "already_active": "" + "already_active": "O usuário já está ativo." }, - "success": "" + "success": "Convite foi com sucesso." } }, "content": { "destroy": { - "success": "" + "success": "Conteúdo removido com sucesso." }, "load": { "error": { - "not_found": "" - } - } - }, - "e": { - "g": { - " Notifications ": "" - }, - " smtp": { - "yourmailhost": { - "com": "" - } + "not_found": "Conteúdo não encontrado." } } }, "feature": { "add_content": { - "success": "" + "success": "Conteúdo adicionado com sucesso." }, "import": { "error": { - "disabled": "" + "disabled": "Importação de arquivos não disponível." } }, "load": { "error": { - "cant_find": "" + "cant_find": "Local não encontrado." } }, "remove_content": { - "success": "" + "success": "Conteúdo removido com sucesso." } }, "image": { "create": { "error": { - "not_found": "" + "not_found": "Arquivo de imagem não encontrado." } }, "destroy": { - "success": "" + "success": "Imagem removida com sucesso." }, "load": { "error": { - "not_found": "" + "not_found": "Imagem não encontrada." } } }, @@ -159,167 +104,248 @@ "contributor": { "add": { "error": { - "already_exists": "", - "dont_exists": "", - "email": "" + "already_exists": "Usuário já é contribuidor da camada.", + "dont_exists": "Não existe usuário cadastrado com este e-mail.", + "email": "Erro enviando e-mail para este usuário." }, - "success": "" + "success": "Contribuidor adicionado com sucesso." }, "remove": { "error": { - "invalid_id": "" + "invalid_id": "Id de contribuidor inválido." }, - "success": "" + "success": "Contribuidor adicionado com sucesso." } }, "create": { - "missing": "", - "success": "" + "missing": "Tipo de camada não encontrado.", + "success": "Camada criada com sucesso." }, "destroy": { - "success": "" + "success": "Camada removida com sucesso." }, "load": { - "error": "Error loading layer.", - "not_found": "" + "error": "Erro carregando camada.", + "not_found": "Camada não encontrada." }, "update": { - "success": "", + "success": "Camada atualizada com sucesso.", "tilelayer": { - "error": "" + "error": "Erro ao atualizar TileLayer." } } }, "map": { "destroy": { - "success": "" + "success": "Mapa removido com sucesso." }, "load": { "error": { - "not_found": "" + "not_found": "Mapa não encontrado." } } }, "token": { "accept_invitation": { "error": { - "invalid_token": "", - "user_activation": "" + "invalid_token": "Token inválido.", + "user_activation": "Erro ao ativar usuário." }, - "success": "" + "success": "Perfil ativado com sucesso." }, "activate_account": { "error": { - "invalid": "", - "saving": "", - "user": "" + "invalid": "Token inválido.", + "saving": "Erro salvando token.", + "user": "Não foi possível ativar usuário." }, - "success": "" + "success": "Perfil atualizado com sucesso, aguarde redirecionamento." }, "email_change": { "error": { - "generic": "" + "generic": "Erro ao alterar e-mail do usuário." }, - "success": "" + "success": "E-mail alterado com sucesso." }, "error": { - "cant_save": "", - "invalid": "" + "cant_save": "Erro ao salvar token.", + "invalid": "Token inválido." }, "load": { "error": { - "expired": "", - "not_found": "" + "expired": "Token expirado.", + "not_found": "Token não encontrado." } }, "migration": { "error": { - "generic": "" + "generic": "Um erro ocorreu na migração." }, - "success": "" + "success": "Conta migrada com sucesso." }, "new_password": { "error": { - "generic": "" + "generic": "Erro alterando senha." }, - "success": "" + "success": "Senha alterada com sucesso." } }, "user": { "create": { "error": { "email": { - "invalid": "", - "missing": "" + "invalid": "Endereço de e-mail inválido.", + "missing": "Entre com um endereço de e-mail." }, - "missing_name": "", + "missing_name": "Digite seu nome.", "password": { - "length": "", - "missing": "" + "length": "A senha deve ter no mínimo 6 caracteres.", + "missing": "Entre com uma senha." } }, - "success": "" + "success": { + "with_token": "Perfil de usuário criado com sucesso. Um link de ativação foi enviado.", + "without_token": "Perfil de usuário criado com sucesso." + } }, "load": { - "error": "" + "error": "Erro ao carregar usuário com id " }, "migrate": { "form": { "errors": { "email": { - "missing": "" + "missing": "Digite um e-mail." }, "password": { - "length": "", - "missing": "" + "length": "A senha deve ter no mínimo 6 caracteres.", + "missing": "Entre com uma senha." }, "user": { - "not_found": "" + "not_found": "Usuário não encontrado." } }, - "success": "" + "success": "Um e-mail de ativação foi enviado ao seu e-mail." } }, "reset_pwd": { "form": { "error": { "user": { - "not_found": "" + "not_found": "Usuário não encontrado." } }, - "title": "" + "title": "Recuperar senha" }, "mail": { - "title": "" + "title": "Recuperar senha" }, "token": { - "success": "" + "success": "Token de alteração de senha enviado." } }, "update": { "email": { "error": { - "already_associated": "", - "already_used": "", - "invalid": "", - "mailer": "", - "missing_callback": "" + "already_associated": "E-mail já associado a outra conta.", + "already_used": "E-mail já utilizado.", + "invalid": "Endereço de e-mail inválido.", + "mailer": "Error enviando confirmação de e-mail.", + "missing_callback": "Callback não encontrado." }, - "success": "" + "success": "E-mail de confirmação de endereco enviado." }, "password": { "error": { - "dont_match": "", - "length": "", - "wrong": "" + "dont_match": "Senhas não coincidem.", + "length": "A senha deve ter no mínimo 6 caracteres.", + "wrong": "Senha incorreta." }, - "success": "" + "success": "Senha alterada com sucesso." }, - "success": "Profile updated successfully." + "success": "Perfil atualizado com sucesso." } }, - "username": "username", - "your site title": "your site title", - "your yby client URL": "your yby client URL", - "your yby server URL": "your yby server URL" + "views": { + "admin": { + "first_admin": { + "administrative_area": "Área administrativa", + "create_admin": "Criar admin", + "create_first_admin_user": "Criar o primeiro usuário administrador:", + "email": "E-mail", + "name": "Nome", + "password": "Senha" + }, + "login": { + "administrative_area": "Área administrativa", + "email": "E-mail", + "login": "Entrar", + "password": "Senha" + }, + "menu": { + "general": "Geral", + "mailer": "Envio de e-mail", + "manage_users": "Gerenciar usuários", + "settings": "Configurações", + "users": { + "invite": "Convites", + "roles": "Permissões" + } + }, + "settings": { + "index": { + "allow_geofiles_import": "Permitir importação de arquivo geo", + "client_url": "URL do cliente", + "general_settings": "Configurações gerais", + "only_invited_can_register": "Somente convidados podem registrar-se", + "server_url": "URL do servidor", + "site_description": "Descricão do site", + "site_title": "Título do site", + "update": "Atualizar" + }, + "mailer": { + "from_address": "Endereço do remetente", + "mailer_settings": "Configurações de envio de e-mail", + "password": "Senha do SMTP", + "smtp_host": "Host do SMTP", + "smtp_port": "Porta do SMTP", + "smtp_user": "Usuário do SMTP", + "update": "Atualizar", + "use_ssl": "Usar SSL" + } + }, + "users": { + "new": { + "admin": "Administrador", + "colaborator": "Colaborador", + "editor": "Editor", + "email": "E-mail", + "invite_a_user": "Convidar um usuário:", + "name": "Nome", + "role": "Perfil", + "send_invitation": "Enviar convite" + }, + "roles": { + "change": "Alterar", + "email": "E-mail", + "manage_user_roles": "Gerenciar perfis de usuário", + "name": "Nome", + "role": "Perfil", + "there_are_no_users": "Não há usuários." + } + } + }, + "includes": { + "header": { + "admin_area_link": "Ir para área adminstrativa", + "login": "Entrar", + "logout": "Sair" + } + }, + "layouts": { + "admin_area": { + "administration": "Administração" + } + } + } } \ No newline at end of file From 012c55c69332cc49e09276e38a6d202af8d98bc7 Mon Sep 17 00:00:00 2001 From: Vitor George Date: Mon, 5 May 2014 14:04:22 -0300 Subject: [PATCH 06/10] fix i18n errors --- app/controllers/admin.js | 9 +- app/controllers/token.js | 52 +-- app/views/admin/settings/index.jade | 14 +- app/views/admin/users/roles.jade | 5 +- app/views/tokens/accept_invitation.jade | 8 +- locales/en/translation.json | 415 ++++-------------------- locales/es-ES/translation.json | 366 +++++++++++++++++++++ locales/es/translation.json | 287 ++++++++-------- locales/pt-BR/translation.json | 17 +- locales/pt/translation.json | 15 + package.json | 5 +- 11 files changed, 671 insertions(+), 522 deletions(-) create mode 100644 locales/es-ES/translation.json diff --git a/app/controllers/admin.js b/app/controllers/admin.js index dde0c06..b86f8dd 100644 --- a/app/controllers/admin.js +++ b/app/controllers/admin.js @@ -172,6 +172,7 @@ exports.update = function(req, res, next) { settings.general = req.body.settings; settings.general.onlyInvitedUsers = req.body.settings.onlyInvitedUsers ? true : false; + settings.general.language = req.body.settings.language; settings.general.allowImports = req.body.settings.allowImports ? true : false; settings.save(function(err){ @@ -262,7 +263,7 @@ exports.invite = function(req, res, next) { console.log(err); next(err); } - else return res.render('admin/users/new', {messages: messages.success(t('admin.invite_user.success'))}); + else return res.render('admin/users/new', {messages: messages.success(req.i18n.t('admin.invite_user.success'))}); }); } } @@ -284,8 +285,12 @@ exports.changeRole = function(req, res, next) { if (err || !user) res.render('500'); else { user.role = req.body.role; + console.log(user); user.save(function(err){ - if (err) res.render('500'); + if (err) { + console.log(err); + res.render('500'); + } else { User.find({}, function(err, users){ if (err) res.render('500'); diff --git a/app/controllers/token.js b/app/controllers/token.js index c780369..ede72ec 100644 --- a/app/controllers/token.js +++ b/app/controllers/token.js @@ -18,13 +18,13 @@ exports.load = function(req, res, next, id){ if (err) return next(err); if (!token){ return res.render('tokens/index', { - errors: [t('token.load.error.not_found')], + errors: [req.i18n.t('token.load.error.not_found')], autoRedirect: false }); } if (token.expiresAt < Date.now()) { return res.render('tokens/index', { - errors: [t('token.load.error.expired')], + errors: [req.i18n.t('token.load.error.expired')], callbackUrl: token.callbackUrl, autoRedirect: false }); @@ -44,12 +44,12 @@ exports.activateAccount = function(req, res){ // invalid route for token if (token.type != 'activateAccount') { - return res.render('tokens/index', {errors: [t('token.activate_account.error.invalid')]}); + return res.render('tokens/index', {errors: [req.i18n.t('token.activate_account.error.invalid')]}); } else { mongoose.model('User').findById(token.user, function(err, user){ if (err) { return res.render('tokens/index', { - errors: [t('token.activate_account.error.user')], + errors: [req.i18n.t('token.activate_account.error.user')], callbackUrl: token.callbackUrl, autoRedirect: false }); @@ -61,7 +61,7 @@ exports.activateAccount = function(req, res){ user.save(function(err){ if (err) return res.render('tokens/index', { - errors: [t('token.activate_account.error.user')], + errors: [req.i18n.t('token.activate_account.error.user')], callbackUrl: token.callbackUrl, autoRedirect: false }); @@ -72,13 +72,13 @@ exports.activateAccount = function(req, res){ console.log(err); if (err) return res.render('tokens/index', { - errors: [t('token.activate_account.error.saving')], + errors: [req.i18n.t('token.activate_account.error.saving')], callbackUrl: token.callbackUrl, autoRedirect: false }) else return res.render('tokens/index', { - success: [t('token.activate_account.success')], + success: [req.i18n.t('token.activate_account.success')], callbackUrl: token.callbackUrl, autoRedirect: true }); @@ -99,7 +99,7 @@ exports.acceptInvitationForm = function(req, res){ // invalid route for token if (token.type != 'acceptInvitation') { - return res.render('tokens/index', {errors: [t('token.accept_invitation.error.invalid_token')]}); + return res.render('tokens/index', {errors: [req.i18n.t('token.accept_invitation.error.invalid_token')]}); } else { return res.render('tokens/accept_invitation', { token: token @@ -115,12 +115,12 @@ exports.acceptInvitation = function(req, res){ // invalid route for token if (token.type != 'acceptInvitation') { - return res.render('tokens/index', {errors: [t('token.error.invalid')]}); + return res.render('tokens/index', {errors: [req.i18n.t('token.error.invalid')]}); } else { mongoose.model('User').findOne({email: token.data.user.email}, function(err, user){ if (err) { return res.render('tokens/index', { - errors: [t('token.accept_invitation.error.user_activation')], + errors: [req.i18n.t('token.accept_invitation.error.user_activation')], callbackUrl: token.callbackUrl, autoRedirect: false }); @@ -137,7 +137,7 @@ exports.acceptInvitation = function(req, res){ if (err) { console.log(err); return res.render('tokens/index', { - errors: [t('token.accept_invitation.error.user_activation')], + errors: [req.i18n.t('token.accept_invitation.error.user_activation')], callbackUrl: token.callbackUrl, autoRedirect: false }); @@ -149,13 +149,13 @@ exports.acceptInvitation = function(req, res){ console.log(err); if (err) return res.render('tokens/index', { - errors: [t('token.error.cant_save')], + errors: [req.i18n.t('token.error.cant_save')], callbackUrl: token.callbackUrl, autoRedirect: false }) else return res.render('tokens/index', { - success: [t('token.accept_invitation.success')], + success: [req.i18n.t('token.accept_invitation.success')], callbackUrl: token.callbackUrl, autoRedirect: true }); @@ -178,7 +178,7 @@ exports.newPasswordForm = function(req, res){ // invalid route for token if ((token.type != 'password_reset') && (token.type != 'password_needed')) { - return res.render('tokens/index', {errors: [t('token.error.invalid')]}); + return res.render('tokens/index', {errors: [req.i18n.t('token.error.invalid')]}); } else { res.render('users/new_password', {user: req.user, token: token}) } @@ -194,21 +194,21 @@ exports.newPassword = function(req, res){ // invalid route for token if ((token.type != 'password_reset') && (token.type != 'password_needed')) { - return res.render('tokens/index', {errors: [t('token.error.invalid')]}); + return res.render('tokens/index', {errors: [req.i18n.t('token.error.invalid')]}); } else { mongoose.model('User').findById(token.user, function(err, user){ if (err) { - return res.render('tokens/index', {errors: [t('token.new_password.error.generic')]}); + return res.render('tokens/index', {errors: [req.i18n.t('token.new_password.error.generic')]}); } user.password = req.body.password; user.save(function(err){ if (err) - return res.render('tokens/index', {errors: [t('token.new_password.error.generic')]}); + return res.render('tokens/index', {errors: [req.i18n.t('token.new_password.error.generic')]}); else { return res.render('tokens/index', { - info: [t('token.new_password.success')], + info: [req.i18n.t('token.new_password.success')], callbackUrl: token.callbackUrl, autoRedirect: true }); @@ -229,11 +229,11 @@ exports.migrateAccount = function(req, res){ // invalid route for token if (token.type != 'migrate_account') { - return res.render('tokens/index', {errors: [t('token.error.invalid')]}); + return res.render('tokens/index', {errors: [req.i18n.t('token.error.invalid')]}); } else { mongoose.model('User').findById(token.user, function(err, user){ if (err) { - return res.render('tokens/index', {errors: [t('token.migration.error.generic')]}); + return res.render('tokens/index', {errors: [req.i18n.t('token.migration.error.generic')]}); } user.password = token.data.password; @@ -242,9 +242,9 @@ exports.migrateAccount = function(req, res){ user.save(function(err){ if (err) - return res.render('tokens/index', {errors: [t('token.migration.error.generic')]}); + return res.render('tokens/index', {errors: [req.i18n.t('token.migration.error.generic')]}); else { - req.flash('info', t('token.migration.success')) + req.flash('info', req.i18n.t('token.migration.success')) } return res.redirect('/login'); @@ -267,12 +267,12 @@ exports.emailChange = function(req, res){ // invalid route for token if (token.type != 'email_change') { - return res.render('tokens/index', {errors: [t('token.error.invalid')]}); + return res.render('tokens/index', {errors: [req.i18n.t('token.error.invalid')]}); } else { mongoose.model('User').findById(token.user, function(err, user){ if (err) { return res.render('tokens/index', { - errors: [t('token.email_change.error.generic')] + errors: [req.i18n.t('token.email_change.error.generic')] }); } @@ -282,11 +282,11 @@ exports.emailChange = function(req, res){ // TODO render login form if (err) return res.render('tokens/index', { - errors: [t('token.email_change.error.generic')] + errors: [req.i18n.t('token.email_change.error.generic')] }); else { return res.render('tokens/index', { - info: [t('token.email_change.success')], + info: [req.i18n.t('token.email_change.success')], callbackUrl: token.callbackUrl, autoRedirect: true }); diff --git a/app/views/admin/settings/index.jade b/app/views/admin/settings/index.jade index 1f0f4d5..48da576 100755 --- a/app/views/admin/settings/index.jade +++ b/app/views/admin/settings/index.jade @@ -5,6 +5,14 @@ block content h3=t('views.admin.settings.index.general_settings') form(action="/admin/settings" method="post" role="form") table.form + tr + td.label + label(for="settings.language")=t('views.admin.settings.index.site_language') + td.input + select(name='settings[language]') + option(value='en', selected=settings.language == 'en')=t('views.admin.settings.index.english') + option(value='es', selected=settings.language == 'es')=t('views.admin.settings.index.spanish') + option(value='pt-BR', selected=settings.language == 'pt-BR')=t('views.admin.settings.index.brazilian_portuguese') tr td.label label(for="settings.title")=t('views.admin.settings.index.site_title') @@ -14,17 +22,17 @@ block content td.label label(for="settings.description")=t('views.admin.settings.index.site_description') td.input - textarea(name="settings[description]" rows="5"))=settings.description + textarea(name="settings[description]" rows="5")=settings.description tr td.label label(for="settings.serverUrl")=t('views.admin.settings.index.server_url') td.input - input(name="settings[serverUrl]" value=settings.serverUrl type="text")) + input(name="settings[serverUrl]" value=settings.serverUrl type="text") tr td.label label(for="settings.clientUrl")=t('views.admin.settings.index.client_url') td.input - input(name="settings[clientUrl]" value=settings.clientUrl type="text")) + input(name="settings[clientUrl]" value=settings.clientUrl type="text") tr td.label label(for="settings.onlyInvitedUsers")=t('views.admin.settings.index.only_invited_can_register') diff --git a/app/views/admin/users/roles.jade b/app/views/admin/users/roles.jade index c81531f..9411f69 100644 --- a/app/views/admin/users/roles.jade +++ b/app/views/admin/users/roles.jade @@ -24,6 +24,7 @@ block content form.form-horizontal(action="/admin/users/role", method="post", role="form") input(type='hidden', name='user_id', value="#{user._id}") select(name='role') - - each role in ['collaborator', 'editor', 'admin'] - option(value=role, selected=user.role == role)=t(role) + option(value='collaborator', selected=user.role == 'collaborator')=t('views.admin.users.roles.collaborator') + option(value='editor', selected=user.role == 'editor')=t('views.admin.users.roles.editor') + option(value='admin', selected=user.role == 'admin')=t('views.admin.users.roles.admin') input.btn.btn-primary(type='submit' value=t('views.admin.users.roles.change')) \ No newline at end of file diff --git a/app/views/tokens/accept_invitation.jade b/app/views/tokens/accept_invitation.jade index c269c5b..605384d 100644 --- a/app/views/tokens/accept_invitation.jade +++ b/app/views/tokens/accept_invitation.jade @@ -5,17 +5,17 @@ block main block content section#login .login-content - h1=title + h1=t('views.tokens.accept_invitation.confirm_signup') include ../includes/messages .login-form form.form-horizontal(action="/accept_invitation/#{token._id}", method="post", role="form") p.col-sm-offset-2.error= message .form-group - label.col-sm-2.control-label(for="password") Defina uma senha para criar sua conta + label.col-sm-2.control-label(for="password")=t('views.tokens.accept_invitation.define_password') .col-sm-10 - input#password.form-control(type="password", placeholder="Digite uma senha", name="password") + input#password.form-control(type="password", placeholder=t('views.tokens.accept_invitation.type_a_password'), name="password") .form-group .col-sm-offset-2.col-sm-10 - button.btn.btn-primary(type='submit') Enviar \ No newline at end of file + button.btn.btn-primary(type='submit')=t('views.tokens.accept_invitation.send') \ No newline at end of file diff --git a/locales/en/translation.json b/locales/en/translation.json index 56d2553..827d617 100644 --- a/locales/en/translation.json +++ b/locales/en/translation.json @@ -1,351 +1,74 @@ { - "access_token": { - "authsocial": { - "error": { - "load_user": "Error loading user.", - "save_user": "Error while saving user." - } - }, - "facebook": { - "error": { - "missing_token": "Missing Facebook authorization token." - } - }, - "google": { - "error": { - "missing_token": "Missing Google authorization token." - } - }, - "local": { - "error": { - "need_password": "Your need a password to acccess your profile. Check your e-mail to continue.", - "needs_activation": "Profile not active, an activation email was sent.", - "send_email": "There was an error while sending a password token to your e-mail." - }, - "needs_migration": "Your account wasn't migrated yet, please visit this page.", - "unauthorized": "Unauthorized." - }, - "logout": { - "error": { - "inexistent_token": "Can't find access token.", - "not_logged": "You are not logged in." - }, - "successful": "Logout successful." - } - }, - "admin": { - "api_settings": { - "error": { - "load": "Could not retrive server info." - } - }, - "first_admin": { - "error": { - "already_exists": "An admin already exists.", - "invalid_email": "Invalid e-mail address.", - "needs_email": "Please enter a e-mail address.", - "needs_name": "Please enter a name.", - "password_length": "Password should have at least 6 characters.", - "password_missing": "Please type a password." - }, - "success": "Admin created successfully." - }, - "invite_user": { - "error": { - "already_active": "User is already active." - }, - "success": "User invited successfully." - } - }, - "content": { - "destroy": { - "success": "Content removed successfully." - }, - "load": { - "error": { - "not_found": "Content not found." - } - } - }, - "feature": { - "add_content": { - "success": "Content added successfully." - }, - "import": { - "error": { - "disabled": "Geo files import is disabled." - } - }, - "load": { - "error": { - "cant_find": "Can't find feature." - } - }, - "remove_content": { - "success": "Content removed successfully." - } - }, - "image": { - "create": { - "error": { - "not_found": "Image file not found" - } - }, - "destroy": { - "success": "Image removed successfully." - }, - "load": { - "error": { - "not_found": "Image not found." - } - } - }, - "layer": { - "contributor": { - "add": { - "error": { - "already_exists": "User is already layer creator.", - "dont_exists": "Can't find user with this e-mail.", - "email": "Error while sending e-mail to contributor." - }, - "success": "Contributor added successfully." - }, - "remove": { - "error": { - "invalid_id": "Invalid contributor id." - }, - "success": "Contributor removed successfully." - } - }, - "create": { - "missing": "Layer type missing.", - "success": "Layer created successfully." - }, - "destroy": { - "success": "Layer removed successfully." - }, - "load": { - "error": "Error loading layer.", - "not_found": "Layer not found." - }, - "update": { - "success": "Layer updated successfully.", - "tilelayer": { - "error": "Can't update TileLayer" - } - } - }, - "map": { - "destroy": { - "success": "Map removed successfully." - }, - "load": { - "error": { - "not_found": "Map not found." - } - } - }, - "token": { - "accept_invitation": { - "error": { - "invalid_token": "Invalid token.", - "user_activation": "Can't actived this user." - }, - "success": "Profile activated successfully." - }, - "activate_account": { - "error": { - "invalid": "Invalid token.", - "saving": "Error while saving token.", - "user": "Can't activate this user." - }, - "success": "Profile activated successfully, please wait redirection." - }, - "email_change": { - "error": { - "generic": "Error while changing user e-mail." - }, - "success": "E-mail changed successfully." - }, - "error": { - "cant_save": "Can't save token.", - "invalid": "Invalid token." - }, - "load": { - "error": { - "expired": "This token expired.", - "not_found": "Token not found." - } - }, - "migration": { - "error": { - "generic": "Error while migrating account." - }, - "success": "Account migrated successfully." - }, - "new_password": { - "error": { - "generic": "Error while changing password." - }, - "success": "Password changed successfully." - } - }, - "user": { - "create": { - "error": { - "email": { - "invalid": "Invalid e-mail address.", - "missing": "Please type an e-mail address." - }, - "missing_name": "Please enter your name.", - "password": { - "length": "Password should have at least 6 characters.", - "missing": "Please type a password." - } - }, - "success": { - "with_token": "User profile created successfully. An activation link was sent.", - "without_token": "User profile created successfully." - } - }, - "load": { - "error": "Failed to load user with id " - }, - "migrate": { - "form": { - "errors": { - "email": { - "missing": "Please inform an e-mail." - }, - "password": { - "length": "Password should have at least 6 characters.", - "missing": "Please type a password." - }, - "user": { - "not_found": "User not found or migration already done." - } - }, - "success": "A activation was sent to your e-mail." - } - }, - "reset_pwd": { - "form": { - "error": { - "user": { - "not_found": "User not found." - } - }, - "title": "Recover password" - }, - "mail": { - "title": "Recover password" - }, - "token": { - "success": "Password change token sent successfully." - } - }, - "update": { - "email": { - "error": { - "already_associated": "E-mail already associated to account.", - "already_used": "This e-mail address is already used.", - "invalid": "Invalid e-mail address.", - "mailer": "Error while sending e-mail confirmation.", - "missing_callback": "Missing callback." - }, - "success": "An e-mail was sent to confirm address change." - }, - "password": { - "error": { - "dont_match": "Passwords don't match.", - "length": "Password should be at least 6 characters long.", - "wrong": "Wrong password." - }, - "success": "Password changed successfully." - }, - "success": "Profile updated successfully." - } - }, - "views": { - "admin": { - "first_admin": { - "administrative_area": "Administrative Area", - "create_admin": "Create Admin", - "create_first_admin_user": "Create first admin user:", - "email": "E-mail", - "name": "Name", - "password": "Password" - }, - "login": { - "administrative_area": "Administrative Area", - "email": "E-mail", - "login": "Login", - "password": "Password" - }, - "menu": { - "general": "General", - "mailer": "Mailer", - "manage_users": "Manage users", - "settings": "Settings", - "users": { - "invite": "Invites", - "roles": "Roles" - } - }, - "settings": { - "index": { - "allow_geofiles_import": "Allow Geofiles import", - "client_url": "Client URL", - "general_settings": "General Settings", - "only_invited_can_register": "Only invited can register", - "server_url": "Server URL", - "site_description": "Site Description", - "site_title": "Site Title", - "update": "Update" - }, - "mailer": { - "from_address": "Sender e-mail address", - "mailer_settings": "Mailer Settings", - "password": "SMTP Password", - "smtp_host": "SMTP Host", - "smtp_port": "SMTP Port", - "smtp_user": "SMTP User", - "update": "Update", - "use_ssl": "Use SSL" + "Administrative area": "Administrative area", + "Name": "Name", + "You": "You", + "E-mail": "E-mail", + "Password": "Password", + "Create admin": "Create admin", + "Email": "Email", + "\"Password\"": "\"Password\"", + "Log in": "Log in", + "Settings": "Settings", + "General": "General", + "Mailer": "Mailer", + "Users": "Users", + "Invite new": "Invite new", + "Manage roles": "Manage roles", + "Welcome to admin area": "Welcome to admin area", + "General settings": "General settings", + "Site title": "Site title", + "your site title": "your site title", + "Site description": "Site description", + "a brief site description": "a brief site description", + "Server URL": "Server URL", + "your yby server URL": "your yby server URL", + "Client URL": "Client URL", + "your yby client URL": "your yby client URL", + "Only invited users can register": "Only invited users can register", + "Allow geo files import": "Allow geo files import", + "Update": "Update", + "Allow geo-files import": "Allow geo-files import", + "\"From\" address": "\"From\" address", + "e": { + "g": { + " Notifications ": "e.g. Notifications " + }, + " smtp": { + "yourmailhost": { + "com": "e.g. smtp.yourmailhost.com" + } + } } - }, - "users": { - "new": { - "admin": "Admin", - "colaborator": "Colaborator", - "editor": "Editor", - "email": "E-mail", - "invite_a_user": "Invite a user:", - "name": "Name", - "role": "Role", - "send_invitation": "Send invitation" - }, - "roles": { - "change": "Change", - "email": "E-mail", - "manage_user_roles": "Manage User Roles", - "name": "Name", - "role": "Role", - "there_are_no_users": "There are no users." - } - } - }, - "includes": { - "header": { - "admin_area_link": "Go to Admin Area", - "login": "Login", - "logout": "Logout" - } }, - "layouts": { - "admin_area": { - "administration": "Administration" - } + "SMTP Host": "SMTP Host", + "SMTP User": "SMTP User", + "username": "username", + "Password (will be stored as plain text)": "Password (will be stored as plain text)", + "Invite a user": "Invite a user", + "Role": "Role", + "Colaborator": "Colaborator", + "Editor": "Editor", + "Administrador": "Administrador", + "Send invitation": "Send invitation", + "Mange user roles": "Mange user roles", + "Permissão": "Permissão", + "collaborator": "collaborator", + "editor": "editor", + "admin": "admin", + "Change": "Change", + "Use SSL": "Use SSL", + "Port": "Port", + "SMTP port": "SMTP port", + "Mailer configuration": "Mailer configuration", + "Administration": "Administration", + "English": "English", + "Brazilian Portuguese": "Brazilian Portuguese", + "Spanish": "Spanish", + "System language": "System language", + "app": { + "english": "English", + "spanish": "Spanish", + "brazilian_portuguese": "Portuguese (BR)" } - } } \ No newline at end of file diff --git a/locales/es-ES/translation.json b/locales/es-ES/translation.json new file mode 100644 index 0000000..4f4c7a0 --- /dev/null +++ b/locales/es-ES/translation.json @@ -0,0 +1,366 @@ +{ + "access_token": { + "authsocial": { + "error": { + "load_user": "Erro al cargar perfil de usuario.", + "save_user": "Erro al grabar perfil de usuario." + } + }, + "facebook": { + "error": { + "missing_token": "Token de autorização do Facebook não encontrado." + } + }, + "google": { + "error": { + "missing_token": "Token de autorização do Google não encontrado." + } + }, + "local": { + "error": { + "need_password": "Você precisa de uma senha para acessar seu perfil. Verifique seu e-mail.", + "needs_activation": "Perfil de usuário inativo, um e-mail de ativação foi enviado.", + "send_email": "Houve um erro enviando um token de senha para seu e-mail." + }, + "needs_migration": "Sua conta não foi migrada ainda, por favor visite esta página.", + "unauthorized": "Não autorizado." + }, + "logout": { + "error": { + "inexistent_token": "Token de acesso não encontrado.", + "not_logged": "Você não está logado." + }, + "successful": "Logout bem sucedido." + } + }, + "admin": { + "api_settings": { + "error": { + "load": "Não foi possível buscar informação do servidor." + } + }, + "first_admin": { + "error": { + "already_exists": "Um administrador já existe.", + "invalid_email": "Endereço de e-mail inválido.", + "needs_email": "Entre com um endereço de e-mail.", + "needs_name": "Entre com um nome.", + "password_length": "A senha deve ter no mínimo 6 caracteres.", + "password_missing": "Entre com uma senha." + }, + "success": "Admin criado com sucesso." + }, + "invite_user": { + "error": { + "already_active": "O usuário já está ativo." + }, + "success": "Convite foi com sucesso." + } + }, + "content": { + "destroy": { + "success": "Conteúdo removido com sucesso." + }, + "load": { + "error": { + "not_found": "Conteúdo não encontrado." + } + } + }, + "feature": { + "add_content": { + "success": "Conteúdo adicionado com sucesso." + }, + "import": { + "error": { + "disabled": "Importação de arquivos não disponível." + } + }, + "load": { + "error": { + "cant_find": "Local não encontrado." + } + }, + "remove_content": { + "success": "Conteúdo removido com sucesso." + } + }, + "image": { + "create": { + "error": { + "not_found": "Arquivo de imagem não encontrado." + } + }, + "destroy": { + "success": "Imagem removida com sucesso." + }, + "load": { + "error": { + "not_found": "Imagem não encontrada." + } + } + }, + "layer": { + "contributor": { + "add": { + "error": { + "already_exists": "Usuário já é contribuidor da camada.", + "dont_exists": "Não existe usuário cadastrado com este e-mail.", + "email": "Erro enviando e-mail para este usuário." + }, + "success": "Contribuidor adicionado com sucesso." + }, + "remove": { + "error": { + "invalid_id": "Id de contribuidor inválido." + }, + "success": "Contribuidor adicionado com sucesso." + } + }, + "create": { + "missing": "Tipo de camada não encontrado.", + "success": "Camada criada com sucesso." + }, + "destroy": { + "success": "Camada removida com sucesso." + }, + "load": { + "error": "Erro carregando camada.", + "not_found": "Camada não encontrada." + }, + "update": { + "success": "Camada atualizada com sucesso.", + "tilelayer": { + "error": "Erro ao atualizar TileLayer." + } + } + }, + "map": { + "destroy": { + "success": "Mapa removido com sucesso." + }, + "load": { + "error": { + "not_found": "Mapa não encontrado." + } + } + }, + "token": { + "accept_invitation": { + "error": { + "invalid_token": "Token inválido.", + "user_activation": "Erro ao ativar usuário." + }, + "success": "Perfil ativado com sucesso." + }, + "activate_account": { + "error": { + "invalid": "Token inválido.", + "saving": "Erro salvando token.", + "user": "Não foi possível ativar usuário." + }, + "success": "Perfil atualizado com sucesso, aguarde redirecionamento." + }, + "email_change": { + "error": { + "generic": "Erro ao alterar e-mail do usuário." + }, + "success": "E-mail alterado com sucesso." + }, + "error": { + "cant_save": "Erro ao salvar token.", + "invalid": "Token inválido." + }, + "load": { + "error": { + "expired": "Token expirado.", + "not_found": "Token não encontrado." + } + }, + "migration": { + "error": { + "generic": "Um erro ocorreu na migração." + }, + "success": "Conta migrada com sucesso." + }, + "new_password": { + "error": { + "generic": "Erro alterando senha." + }, + "success": "Senha alterada com sucesso." + } + }, + "user": { + "create": { + "error": { + "email": { + "invalid": "Endereço de e-mail inválido.", + "missing": "Entre com um endereço de e-mail." + }, + "missing_name": "Digite seu nome.", + "password": { + "length": "A senha deve ter no mínimo 6 caracteres.", + "missing": "Entre com uma senha." + } + }, + "success": { + "with_token": "Perfil de usuário criado com sucesso. Um link de ativação foi enviado.", + "without_token": "Perfil de usuário criado com sucesso." + } + }, + "load": { + "error": "Erro ao carregar usuário com id " + }, + "migrate": { + "form": { + "errors": { + "email": { + "missing": "Digite um e-mail." + }, + "password": { + "length": "A senha deve ter no mínimo 6 caracteres.", + "missing": "Entre com uma senha." + }, + "user": { + "not_found": "Usuário não encontrado." + } + }, + "success": "Um e-mail de ativação foi enviado ao seu e-mail." + } + }, + "reset_pwd": { + "form": { + "error": { + "user": { + "not_found": "Usuário não encontrado." + } + }, + "title": "Recuperar senha" + }, + "mail": { + "title": "Recuperar senha" + }, + "token": { + "success": "Token de alteração de senha enviado." + } + }, + "update": { + "email": { + "error": { + "already_associated": "E-mail já associado a outra conta.", + "already_used": "E-mail já utilizado.", + "invalid": "Endereço de e-mail inválido.", + "mailer": "Error enviando confirmação de e-mail.", + "missing_callback": "Callback não encontrado." + }, + "success": "E-mail de confirmação de endereco enviado." + }, + "password": { + "error": { + "dont_match": "Senhas não coincidem.", + "length": "A senha deve ter no mínimo 6 caracteres.", + "wrong": "Senha incorreta." + }, + "success": "Senha alterada com sucesso." + }, + "success": "Perfil atualizado com sucesso." + } + }, + "views": { + "admin": { + "first_admin": { + "administrative_area": "Área administrativa", + "create_admin": "Criar admin", + "create_first_admin_user": "Criar o primeiro usuário administrador:", + "email": "E-mail", + "name": "Nome", + "password": "Senha" + }, + "login": { + "administrative_area": "Área administrativa", + "email": "E-mail", + "login": "Entrar", + "password": "Senha" + }, + "menu": { + "general": "Geral", + "mailer": "Envio de e-mail", + "manage_users": "Gerenciar usuários", + "settings": "Configurações", + "users": { + "invite": "Convites", + "roles": "Permissões" + } + }, + "settings": { + "index": { + "allow_geofiles_import": "Permitir importação de arquivo geo", + "brazilian_portuguese": "", + "client_url": "URL do cliente", + "english": "", + "general_settings": "Configurações gerais", + "only_invited_can_register": "Somente convidados podem registrar-se", + "server_url": "URL do servidor", + "site_description": "Descricão do site", + "site_language": "", + "site_title": "Título do site", + "spanish": "", + "update": "Atualizar" + }, + "mailer": { + "from_address": "Endereço do remetente", + "mailer_settings": "Configurações de envio de e-mail", + "password": "Senha do SMTP", + "smtp_host": "Host do SMTP", + "smtp_port": "Porta do SMTP", + "smtp_user": "Usuário do SMTP", + "update": "Atualizar", + "use_ssl": "Usar SSL" + } + }, + "users": { + "new": { + "admin": "Administrador", + "colaborator": "Colaborador", + "editor": "Editor", + "email": "E-mail", + "invite_a_user": "Convidar um usuário:", + "name": "Nome", + "role": "Perfil", + "send_invitation": "Enviar convite" + }, + "roles": { + "admin": "views.admin.users.roles.admin", + "change": "Alterar", + "collaborator": "views.admin.users.roles.collaborator", + "editor": "views.admin.users.roles.editor", + "email": "E-mail", + "manage_user_roles": "Gerenciar perfis de usuário", + "name": "Nome", + "role": "Perfil", + "there_are_no_users": "Não há usuários." + } + } + }, + "includes": { + "header": { + "admin_area_link": "Ir para área adminstrativa", + "login": "Entrar", + "logout": "Sair" + } + }, + "layouts": { + "admin_area": { + "administration": "Administração" + } + }, + "tokens": { + "accept_invitation": { + "confirm_signup": "", + "define_password": "views.tokens.accept_invitation.define_password", + "send": "", + "type_a_password": "views.tokens.accept_invitation.type_a_password" + } + } + } +} \ No newline at end of file diff --git a/locales/es/translation.json b/locales/es/translation.json index 56d2553..4f4c7a0 100644 --- a/locales/es/translation.json +++ b/locales/es/translation.json @@ -2,101 +2,101 @@ "access_token": { "authsocial": { "error": { - "load_user": "Error loading user.", - "save_user": "Error while saving user." + "load_user": "Erro al cargar perfil de usuario.", + "save_user": "Erro al grabar perfil de usuario." } }, "facebook": { "error": { - "missing_token": "Missing Facebook authorization token." + "missing_token": "Token de autorização do Facebook não encontrado." } }, "google": { "error": { - "missing_token": "Missing Google authorization token." + "missing_token": "Token de autorização do Google não encontrado." } }, "local": { "error": { - "need_password": "Your need a password to acccess your profile. Check your e-mail to continue.", - "needs_activation": "Profile not active, an activation email was sent.", - "send_email": "There was an error while sending a password token to your e-mail." + "need_password": "Você precisa de uma senha para acessar seu perfil. Verifique seu e-mail.", + "needs_activation": "Perfil de usuário inativo, um e-mail de ativação foi enviado.", + "send_email": "Houve um erro enviando um token de senha para seu e-mail." }, - "needs_migration": "Your account wasn't migrated yet, please visit this page.", - "unauthorized": "Unauthorized." + "needs_migration": "Sua conta não foi migrada ainda, por favor visite esta página.", + "unauthorized": "Não autorizado." }, "logout": { "error": { - "inexistent_token": "Can't find access token.", - "not_logged": "You are not logged in." + "inexistent_token": "Token de acesso não encontrado.", + "not_logged": "Você não está logado." }, - "successful": "Logout successful." + "successful": "Logout bem sucedido." } }, "admin": { "api_settings": { "error": { - "load": "Could not retrive server info." + "load": "Não foi possível buscar informação do servidor." } }, "first_admin": { "error": { - "already_exists": "An admin already exists.", - "invalid_email": "Invalid e-mail address.", - "needs_email": "Please enter a e-mail address.", - "needs_name": "Please enter a name.", - "password_length": "Password should have at least 6 characters.", - "password_missing": "Please type a password." + "already_exists": "Um administrador já existe.", + "invalid_email": "Endereço de e-mail inválido.", + "needs_email": "Entre com um endereço de e-mail.", + "needs_name": "Entre com um nome.", + "password_length": "A senha deve ter no mínimo 6 caracteres.", + "password_missing": "Entre com uma senha." }, - "success": "Admin created successfully." + "success": "Admin criado com sucesso." }, "invite_user": { "error": { - "already_active": "User is already active." + "already_active": "O usuário já está ativo." }, - "success": "User invited successfully." + "success": "Convite foi com sucesso." } }, "content": { "destroy": { - "success": "Content removed successfully." + "success": "Conteúdo removido com sucesso." }, "load": { "error": { - "not_found": "Content not found." + "not_found": "Conteúdo não encontrado." } } }, "feature": { "add_content": { - "success": "Content added successfully." + "success": "Conteúdo adicionado com sucesso." }, "import": { "error": { - "disabled": "Geo files import is disabled." + "disabled": "Importação de arquivos não disponível." } }, "load": { "error": { - "cant_find": "Can't find feature." + "cant_find": "Local não encontrado." } }, "remove_content": { - "success": "Content removed successfully." + "success": "Conteúdo removido com sucesso." } }, "image": { "create": { "error": { - "not_found": "Image file not found" + "not_found": "Arquivo de imagem não encontrado." } }, "destroy": { - "success": "Image removed successfully." + "success": "Imagem removida com sucesso." }, "load": { "error": { - "not_found": "Image not found." + "not_found": "Imagem não encontrada." } } }, @@ -104,247 +104,262 @@ "contributor": { "add": { "error": { - "already_exists": "User is already layer creator.", - "dont_exists": "Can't find user with this e-mail.", - "email": "Error while sending e-mail to contributor." + "already_exists": "Usuário já é contribuidor da camada.", + "dont_exists": "Não existe usuário cadastrado com este e-mail.", + "email": "Erro enviando e-mail para este usuário." }, - "success": "Contributor added successfully." + "success": "Contribuidor adicionado com sucesso." }, "remove": { "error": { - "invalid_id": "Invalid contributor id." + "invalid_id": "Id de contribuidor inválido." }, - "success": "Contributor removed successfully." + "success": "Contribuidor adicionado com sucesso." } }, "create": { - "missing": "Layer type missing.", - "success": "Layer created successfully." + "missing": "Tipo de camada não encontrado.", + "success": "Camada criada com sucesso." }, "destroy": { - "success": "Layer removed successfully." + "success": "Camada removida com sucesso." }, "load": { - "error": "Error loading layer.", - "not_found": "Layer not found." + "error": "Erro carregando camada.", + "not_found": "Camada não encontrada." }, "update": { - "success": "Layer updated successfully.", + "success": "Camada atualizada com sucesso.", "tilelayer": { - "error": "Can't update TileLayer" + "error": "Erro ao atualizar TileLayer." } } }, "map": { "destroy": { - "success": "Map removed successfully." + "success": "Mapa removido com sucesso." }, "load": { "error": { - "not_found": "Map not found." + "not_found": "Mapa não encontrado." } } }, "token": { "accept_invitation": { "error": { - "invalid_token": "Invalid token.", - "user_activation": "Can't actived this user." + "invalid_token": "Token inválido.", + "user_activation": "Erro ao ativar usuário." }, - "success": "Profile activated successfully." + "success": "Perfil ativado com sucesso." }, "activate_account": { "error": { - "invalid": "Invalid token.", - "saving": "Error while saving token.", - "user": "Can't activate this user." + "invalid": "Token inválido.", + "saving": "Erro salvando token.", + "user": "Não foi possível ativar usuário." }, - "success": "Profile activated successfully, please wait redirection." + "success": "Perfil atualizado com sucesso, aguarde redirecionamento." }, "email_change": { "error": { - "generic": "Error while changing user e-mail." + "generic": "Erro ao alterar e-mail do usuário." }, - "success": "E-mail changed successfully." + "success": "E-mail alterado com sucesso." }, "error": { - "cant_save": "Can't save token.", - "invalid": "Invalid token." + "cant_save": "Erro ao salvar token.", + "invalid": "Token inválido." }, "load": { "error": { - "expired": "This token expired.", - "not_found": "Token not found." + "expired": "Token expirado.", + "not_found": "Token não encontrado." } }, "migration": { "error": { - "generic": "Error while migrating account." + "generic": "Um erro ocorreu na migração." }, - "success": "Account migrated successfully." + "success": "Conta migrada com sucesso." }, "new_password": { "error": { - "generic": "Error while changing password." + "generic": "Erro alterando senha." }, - "success": "Password changed successfully." + "success": "Senha alterada com sucesso." } }, "user": { "create": { "error": { "email": { - "invalid": "Invalid e-mail address.", - "missing": "Please type an e-mail address." + "invalid": "Endereço de e-mail inválido.", + "missing": "Entre com um endereço de e-mail." }, - "missing_name": "Please enter your name.", + "missing_name": "Digite seu nome.", "password": { - "length": "Password should have at least 6 characters.", - "missing": "Please type a password." + "length": "A senha deve ter no mínimo 6 caracteres.", + "missing": "Entre com uma senha." } }, "success": { - "with_token": "User profile created successfully. An activation link was sent.", - "without_token": "User profile created successfully." + "with_token": "Perfil de usuário criado com sucesso. Um link de ativação foi enviado.", + "without_token": "Perfil de usuário criado com sucesso." } }, "load": { - "error": "Failed to load user with id " + "error": "Erro ao carregar usuário com id " }, "migrate": { "form": { "errors": { "email": { - "missing": "Please inform an e-mail." + "missing": "Digite um e-mail." }, "password": { - "length": "Password should have at least 6 characters.", - "missing": "Please type a password." + "length": "A senha deve ter no mínimo 6 caracteres.", + "missing": "Entre com uma senha." }, "user": { - "not_found": "User not found or migration already done." + "not_found": "Usuário não encontrado." } }, - "success": "A activation was sent to your e-mail." + "success": "Um e-mail de ativação foi enviado ao seu e-mail." } }, "reset_pwd": { "form": { "error": { "user": { - "not_found": "User not found." + "not_found": "Usuário não encontrado." } }, - "title": "Recover password" + "title": "Recuperar senha" }, "mail": { - "title": "Recover password" + "title": "Recuperar senha" }, "token": { - "success": "Password change token sent successfully." + "success": "Token de alteração de senha enviado." } }, "update": { "email": { "error": { - "already_associated": "E-mail already associated to account.", - "already_used": "This e-mail address is already used.", - "invalid": "Invalid e-mail address.", - "mailer": "Error while sending e-mail confirmation.", - "missing_callback": "Missing callback." + "already_associated": "E-mail já associado a outra conta.", + "already_used": "E-mail já utilizado.", + "invalid": "Endereço de e-mail inválido.", + "mailer": "Error enviando confirmação de e-mail.", + "missing_callback": "Callback não encontrado." }, - "success": "An e-mail was sent to confirm address change." + "success": "E-mail de confirmação de endereco enviado." }, "password": { "error": { - "dont_match": "Passwords don't match.", - "length": "Password should be at least 6 characters long.", - "wrong": "Wrong password." + "dont_match": "Senhas não coincidem.", + "length": "A senha deve ter no mínimo 6 caracteres.", + "wrong": "Senha incorreta." }, - "success": "Password changed successfully." + "success": "Senha alterada com sucesso." }, - "success": "Profile updated successfully." + "success": "Perfil atualizado com sucesso." } }, "views": { "admin": { "first_admin": { - "administrative_area": "Administrative Area", - "create_admin": "Create Admin", - "create_first_admin_user": "Create first admin user:", + "administrative_area": "Área administrativa", + "create_admin": "Criar admin", + "create_first_admin_user": "Criar o primeiro usuário administrador:", "email": "E-mail", - "name": "Name", - "password": "Password" + "name": "Nome", + "password": "Senha" }, "login": { - "administrative_area": "Administrative Area", + "administrative_area": "Área administrativa", "email": "E-mail", - "login": "Login", - "password": "Password" + "login": "Entrar", + "password": "Senha" }, "menu": { - "general": "General", - "mailer": "Mailer", - "manage_users": "Manage users", - "settings": "Settings", + "general": "Geral", + "mailer": "Envio de e-mail", + "manage_users": "Gerenciar usuários", + "settings": "Configurações", "users": { - "invite": "Invites", - "roles": "Roles" + "invite": "Convites", + "roles": "Permissões" } }, "settings": { "index": { - "allow_geofiles_import": "Allow Geofiles import", - "client_url": "Client URL", - "general_settings": "General Settings", - "only_invited_can_register": "Only invited can register", - "server_url": "Server URL", - "site_description": "Site Description", - "site_title": "Site Title", - "update": "Update" + "allow_geofiles_import": "Permitir importação de arquivo geo", + "brazilian_portuguese": "", + "client_url": "URL do cliente", + "english": "", + "general_settings": "Configurações gerais", + "only_invited_can_register": "Somente convidados podem registrar-se", + "server_url": "URL do servidor", + "site_description": "Descricão do site", + "site_language": "", + "site_title": "Título do site", + "spanish": "", + "update": "Atualizar" }, "mailer": { - "from_address": "Sender e-mail address", - "mailer_settings": "Mailer Settings", - "password": "SMTP Password", - "smtp_host": "SMTP Host", - "smtp_port": "SMTP Port", - "smtp_user": "SMTP User", - "update": "Update", - "use_ssl": "Use SSL" + "from_address": "Endereço do remetente", + "mailer_settings": "Configurações de envio de e-mail", + "password": "Senha do SMTP", + "smtp_host": "Host do SMTP", + "smtp_port": "Porta do SMTP", + "smtp_user": "Usuário do SMTP", + "update": "Atualizar", + "use_ssl": "Usar SSL" } }, "users": { "new": { - "admin": "Admin", - "colaborator": "Colaborator", + "admin": "Administrador", + "colaborator": "Colaborador", "editor": "Editor", "email": "E-mail", - "invite_a_user": "Invite a user:", - "name": "Name", - "role": "Role", - "send_invitation": "Send invitation" + "invite_a_user": "Convidar um usuário:", + "name": "Nome", + "role": "Perfil", + "send_invitation": "Enviar convite" }, "roles": { - "change": "Change", + "admin": "views.admin.users.roles.admin", + "change": "Alterar", + "collaborator": "views.admin.users.roles.collaborator", + "editor": "views.admin.users.roles.editor", "email": "E-mail", - "manage_user_roles": "Manage User Roles", - "name": "Name", - "role": "Role", - "there_are_no_users": "There are no users." + "manage_user_roles": "Gerenciar perfis de usuário", + "name": "Nome", + "role": "Perfil", + "there_are_no_users": "Não há usuários." } } }, "includes": { "header": { - "admin_area_link": "Go to Admin Area", - "login": "Login", - "logout": "Logout" + "admin_area_link": "Ir para área adminstrativa", + "login": "Entrar", + "logout": "Sair" } }, "layouts": { "admin_area": { - "administration": "Administration" + "administration": "Administração" + } + }, + "tokens": { + "accept_invitation": { + "confirm_signup": "", + "define_password": "views.tokens.accept_invitation.define_password", + "send": "", + "type_a_password": "views.tokens.accept_invitation.type_a_password" } } } diff --git a/locales/pt-BR/translation.json b/locales/pt-BR/translation.json index 3a52de0..9b77936 100644 --- a/locales/pt-BR/translation.json +++ b/locales/pt-BR/translation.json @@ -295,12 +295,16 @@ "settings": { "index": { "allow_geofiles_import": "Permitir importação de arquivo geo", + "brazilian_portuguese": "Português Brasileiro", "client_url": "URL do cliente", + "english": "Inglês", "general_settings": "Configurações gerais", "only_invited_can_register": "Somente convidados podem registrar-se", "server_url": "URL do servidor", - "site_description": "Descricão do site", + "site_description": "Descrição do site", + "site_language": "Idioma padrão", "site_title": "Título do site", + "spanish": "Espanhol", "update": "Atualizar" }, "mailer": { @@ -326,7 +330,10 @@ "send_invitation": "Enviar convite" }, "roles": { + "admin": "Administrador", "change": "Alterar", + "collaborator": "Colaborador", + "editor": "Editor", "email": "E-mail", "manage_user_roles": "Gerenciar perfis de usuário", "name": "Nome", @@ -346,6 +353,14 @@ "admin_area": { "administration": "Administração" } + }, + "tokens": { + "accept_invitation": { + "confirm_signup": "Confirme sua inscrição", + "define_password": "Defina uma senha:", + "send": "Enviar", + "type_a_password": "Digite uma senha" + } } } } \ No newline at end of file diff --git a/locales/pt/translation.json b/locales/pt/translation.json index 3a52de0..c4c55b9 100644 --- a/locales/pt/translation.json +++ b/locales/pt/translation.json @@ -295,12 +295,16 @@ "settings": { "index": { "allow_geofiles_import": "Permitir importação de arquivo geo", + "brazilian_portuguese": "", "client_url": "URL do cliente", + "english": "", "general_settings": "Configurações gerais", "only_invited_can_register": "Somente convidados podem registrar-se", "server_url": "URL do servidor", "site_description": "Descricão do site", + "site_language": "", "site_title": "Título do site", + "spanish": "", "update": "Atualizar" }, "mailer": { @@ -326,7 +330,10 @@ "send_invitation": "Enviar convite" }, "roles": { + "admin": "views.admin.users.roles.admin", "change": "Alterar", + "collaborator": "views.admin.users.roles.collaborator", + "editor": "views.admin.users.roles.editor", "email": "E-mail", "manage_user_roles": "Gerenciar perfis de usuário", "name": "Nome", @@ -346,6 +353,14 @@ "admin_area": { "administration": "Administração" } + }, + "tokens": { + "accept_invitation": { + "confirm_signup": "", + "define_password": "views.tokens.accept_invitation.define_password", + "send": "", + "type_a_password": "views.tokens.accept_invitation.type_a_password" + } } } } \ No newline at end of file diff --git a/package.json b/package.json index 315ea69..13bb4ff 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "watch": "NODE_PATH=./app/controllers NODE_ENV=development ./node_modules/.bin/nodemon web.js", "start": "NODE_PATH=./app/controllers node web.js", "test": "make test", - "i18n": "i18next app/ -o locales/ -r -l en,es,pt,pt-BR" + "i18n": "./node_modules/.bin/i18next app/ -o locales/ -r -l en,es,es-ES,pt,pt-BR" }, "dependencies": { "dotenv": "latest", @@ -61,7 +61,8 @@ "mocha": "latest", "should": "latest", "supertest": "latest", - "factory-lady": "latest" + "factory-lady": "latest", + "i18next-parser": "latest" }, "keywords": [ "mapas", From 2d20db1c702fb2bfdb6311fed9c8569d9d3dbb8d Mon Sep 17 00:00:00 2001 From: Vitor George Date: Tue, 6 May 2014 20:06:09 -0300 Subject: [PATCH 07/10] spanish translation, e-mail translation --- .gitignore | 2 + app/controllers/admin.js | 9 +- app/views/admin/login.jade | 2 +- app/views/mailer/user/invite.jade | 9 +- lib/mailer.js | 28 +-- locales/es-ES/translation.json | 283 ++++++++++++++---------------- locales/es/translation.json | 283 ++++++++++++++---------------- locales/pt-BR/translation.json | 35 ++-- locales/pt/translation.json | 35 ++-- package.json | 2 +- 10 files changed, 306 insertions(+), 382 deletions(-) diff --git a/.gitignore b/.gitignore index b358d8b..06f139e 100644 --- a/.gitignore +++ b/.gitignore @@ -29,3 +29,5 @@ config/config.js import/* backup/* + +translation_old.json \ No newline at end of file diff --git a/app/controllers/admin.js b/app/controllers/admin.js index b86f8dd..93d4295 100644 --- a/app/controllers/admin.js +++ b/app/controllers/admin.js @@ -38,7 +38,7 @@ exports.firstAdmin = function(req, res) { // If an admin user already exists, redirects to login if (admin) { - req.flash('error', t('admin.first_admin.error.already_exists')); + req.flash('error', req.i18n.t('admin.first_admin.error.already_exists')); res.redirect('/admin/login'); } else { var user = new User(req.body); @@ -70,7 +70,7 @@ exports.firstAdmin = function(req, res) { res.render('admin/first_admin', {messages: messages.mongooseErrors(req.i18n, err)}); } else { - req.flash('info', t('admin.first_admin.success')); + req.flash('info', req.i18n.t('admin.first_admin.success')); res.redirect('/admin/login'); } }); @@ -244,7 +244,7 @@ exports.invite = function(req, res, next) { if (err) res.render('500'); else { if (user && !user.needsEmailConfirmation) { - res.render('admin/users/new', {message: t('admin.invite_user.error.already_active')}); + res.render('admin/users/new', {message: req.i18n.t('admin.invite_user.error.already_active')}); } else { var @@ -255,7 +255,8 @@ exports.invite = function(req, res, next) { email: req.body.user.email, role: req.body.user.role }, - callbackUrl: req.app.locals.settings.general.clientUrl + '/login' + callbackUrl: req.app.locals.settings.general.clientUrl + '/login', + t: req.i18n.t } mailer.invite(options, function(err) { diff --git a/app/views/admin/login.jade b/app/views/admin/login.jade index 385303e..7360ac7 100644 --- a/app/views/admin/login.jade +++ b/app/views/admin/login.jade @@ -9,7 +9,7 @@ html .login-content h1=t('views.admin.login.administrative_area') include ../includes/messages - .login-form + .login-form form.form-horizontal(action="/admin/session", method="post", role="form") input(type='hidden', name='_csrf', value="#{csrf_token}") diff --git a/app/views/mailer/user/invite.jade b/app/views/mailer/user/invite.jade index 3f15a6e..478308c 100644 --- a/app/views/mailer/user/invite.jade +++ b/app/views/mailer/user/invite.jade @@ -1,9 +1,8 @@ -p Olá, #{locals.token.data.user.name} +p=locals.t('views.mailer.user.invite.salute', {defaultValue: 'Hi, __username__,', username: locals.token.data.user.name}) -p Você foi convidado a participar do InfoAmazonia Rios! +p=locals.t('views.mailer.user.invite.intro', {defaultValue: 'You were invited to map.'}) p - a(href='#{settings.general.serverUrl}/accept_invitation/#{locals.token._id}') Para começar a criar mapas, clique aqui e criar sua conta. + a(href='#{settings.general.serverUrl}/accept_invitation/#{locals.token._id}')=locals.t('views.mailer.user.invite.link', {defaultValue: 'Click here to start.'}) -p - | Até logo! \ No newline at end of file +p=locals.t('views.mailer.user.invite.thanks', {defaultValue: 'Thank you!'}) \ No newline at end of file diff --git a/lib/mailer.js b/lib/mailer.js index 23d16b7..2bb1203 100644 --- a/lib/mailer.js +++ b/lib/mailer.js @@ -52,8 +52,6 @@ var Mailer = { callbackUrl: options.callbackUrl, expiresAt: moment().add('day', 1).toDate() }); - - console.log(options); token.save(function(err){ if (err) @@ -143,7 +141,6 @@ var Mailer = { } else { jade.renderFile(tplPath + '/account/migrate_account.jade', { user: user, token: token, appUrl: config.appUrl }, function(err, file) { if (err) { - console.log(err); callback(err); } else { var @@ -178,30 +175,6 @@ var Mailer = { creator: options.creator, contributor: options.contributor }, callback); - - - // jade.renderFile(tplPath + '/contributions/inform_contributor_permission.jade', { - // if (err) { - // console.log(err); - // callback(err); - // } else { - // var - // options = _.extend(mailConfig, { - // subject: 'Permissão para edição de camada', - // to: contributor.email, - // html: file - // }); - - // transport.sendMail(options, function(err, response){ - // if (err) { - // callback(err); - // } else { - // console.log("Message sent: " + response.message); - // callback(); - // } - // }); - // } - // }); }, invite: function(options, callback) { @@ -225,6 +198,7 @@ var Mailer = { subject: 'Você foi convidado a mapear', to: options.user.email, user: options.user, + t: options.t, token: token }, callback); } diff --git a/locales/es-ES/translation.json b/locales/es-ES/translation.json index 4f4c7a0..ba7c38e 100644 --- a/locales/es-ES/translation.json +++ b/locales/es-ES/translation.json @@ -8,95 +8,72 @@ }, "facebook": { "error": { - "missing_token": "Token de autorização do Facebook não encontrado." + "missing_token": "Token de autorización de Facebook no encontrado." } }, "google": { "error": { - "missing_token": "Token de autorização do Google não encontrado." + "missing_token": "Token de autorización de Google no encontrado." } }, "local": { "error": { - "need_password": "Você precisa de uma senha para acessar seu perfil. Verifique seu e-mail.", - "needs_activation": "Perfil de usuário inativo, um e-mail de ativação foi enviado.", - "send_email": "Houve um erro enviando um token de senha para seu e-mail." + "need_password": "Necesitas de una contraseña para activar su perfil. Verifique su correo.", + "needs_activation": "Perfil de usuario inacrivo, un correo de activación fue enviado.", + "send_email": "Hubo un error al enviar un token de contraseña a su correo." }, - "needs_migration": "Sua conta não foi migrada ainda, por favor visite esta página.", - "unauthorized": "Não autorizado." + "needs_migration": "Su cuenta todavia no fue migrada, por favor visite este enlace.", + "unauthorized": "No autorizado." }, "logout": { "error": { - "inexistent_token": "Token de acesso não encontrado.", - "not_logged": "Você não está logado." + "inexistent_token": "Token de acesso no encontrado.", + "not_logged": "No estás logado." }, - "successful": "Logout bem sucedido." - } - }, - "admin": { - "api_settings": { - "error": { - "load": "Não foi possível buscar informação do servidor." - } - }, - "first_admin": { - "error": { - "already_exists": "Um administrador já existe.", - "invalid_email": "Endereço de e-mail inválido.", - "needs_email": "Entre com um endereço de e-mail.", - "needs_name": "Entre com um nome.", - "password_length": "A senha deve ter no mínimo 6 caracteres.", - "password_missing": "Entre com uma senha." - }, - "success": "Admin criado com sucesso." - }, - "invite_user": { - "error": { - "already_active": "O usuário já está ativo." - }, - "success": "Convite foi com sucesso." + "successful": "Salida bien sucedida." } }, + "admin": "admin", "content": { "destroy": { - "success": "Conteúdo removido com sucesso." + "success": "Contenido removido con suceso." }, "load": { "error": { - "not_found": "Conteúdo não encontrado." + "not_found": "Contenido no encontrado." } } }, "feature": { "add_content": { - "success": "Conteúdo adicionado com sucesso." + "success": "Contenido añadido con suceso." }, "import": { "error": { - "disabled": "Importação de arquivos não disponível." + "disabled": "Importación de archivos no disponible." } }, "load": { "error": { - "cant_find": "Local não encontrado." + "cant_find": "Local no encontrado." } }, "remove_content": { - "success": "Conteúdo removido com sucesso." + "success": "Contenido removido con suceso." } }, "image": { "create": { "error": { - "not_found": "Arquivo de imagem não encontrado." + "not_found": "Archivo de imagen no encuentrado." } }, "destroy": { - "success": "Imagem removida com sucesso." + "success": "Imagen removida con suceso." }, "load": { "error": { - "not_found": "Imagem não encontrada." + "not_found": "Imagen no encuentrada." } } }, @@ -104,44 +81,44 @@ "contributor": { "add": { "error": { - "already_exists": "Usuário já é contribuidor da camada.", - "dont_exists": "Não existe usuário cadastrado com este e-mail.", - "email": "Erro enviando e-mail para este usuário." + "already_exists": "El usuario ja contribuidor de la capa.", + "dont_exists": "No existe perfil de usuario con este correo.", + "email": "Hubo un error al enviar un correo a este perfil." }, - "success": "Contribuidor adicionado com sucesso." + "success": "Contribuidor añadido con suceso." }, "remove": { "error": { "invalid_id": "Id de contribuidor inválido." }, - "success": "Contribuidor adicionado com sucesso." + "success": "Contribuidor añadido con suceso." } }, "create": { - "missing": "Tipo de camada não encontrado.", - "success": "Camada criada com sucesso." + "missing": "Tipo de capa no encuentrada.", + "success": "Capa creada con suceso." }, "destroy": { - "success": "Camada removida com sucesso." + "success": "Capa removida con suceso." }, "load": { - "error": "Erro carregando camada.", - "not_found": "Camada não encontrada." + "error": "Error al cargar capa.", + "not_found": "Capa no encuentrada." }, "update": { - "success": "Camada atualizada com sucesso.", + "success": "Capa actualizada con suceso.", "tilelayer": { - "error": "Erro ao atualizar TileLayer." + "error": "Error al actualizar TileLayer." } } }, "map": { "destroy": { - "success": "Mapa removido com sucesso." + "success": "Mapa removido con suceso." }, "load": { "error": { - "not_found": "Mapa não encontrado." + "not_found": "Mapa no encuentrado." } } }, @@ -149,23 +126,23 @@ "accept_invitation": { "error": { "invalid_token": "Token inválido.", - "user_activation": "Erro ao ativar usuário." + "user_activation": "Error al activar usuario." }, - "success": "Perfil ativado com sucesso." + "success": "Perfil activado con suceso." }, "activate_account": { "error": { "invalid": "Token inválido.", - "saving": "Erro salvando token.", - "user": "Não foi possível ativar usuário." + "saving": "Erro grabando token.", + "user": "No fue posible activar perfil de usuario." }, - "success": "Perfil atualizado com sucesso, aguarde redirecionamento." + "success": "Perfil atualizado con suceso, aguarde redireccionamiento." }, "email_change": { "error": { - "generic": "Erro ao alterar e-mail do usuário." + "generic": "Error al alterar correo del usuario." }, - "success": "E-mail alterado com sucesso." + "success": "Correo alterado con suceso." }, "error": { "cant_save": "Erro ao salvar token.", @@ -174,147 +151,147 @@ "load": { "error": { "expired": "Token expirado.", - "not_found": "Token não encontrado." + "not_found": "Token no encuentrado." } }, "migration": { "error": { - "generic": "Um erro ocorreu na migração." + "generic": "Hubo un error en la migración." }, - "success": "Conta migrada com sucesso." + "success": "Conta migrada con suceso." }, "new_password": { "error": { "generic": "Erro alterando senha." }, - "success": "Senha alterada com sucesso." + "success": "Contraseña cambiada con suceso." } }, "user": { "create": { "error": { "email": { - "invalid": "Endereço de e-mail inválido.", - "missing": "Entre com um endereço de e-mail." + "invalid": "Dirección de correo inválido.", + "missing": "Debes indicar una dirección de correo." }, - "missing_name": "Digite seu nome.", + "missing_name": "Debes indicar un nombre.", "password": { - "length": "A senha deve ter no mínimo 6 caracteres.", - "missing": "Entre com uma senha." + "length": "La contraseña debe contenter un mínimo de 6 caracteres.", + "missing": "Debes indicar una contraseña." } }, "success": { - "with_token": "Perfil de usuário criado com sucesso. Um link de ativação foi enviado.", - "without_token": "Perfil de usuário criado com sucesso." + "with_token": "Perfil de usuario creado con suceso. Un correo de activación fue enviado.", + "without_token": "Perfil de usuario creado con suceso." } }, "load": { - "error": "Erro ao carregar usuário com id " + "error": "Error al cargar usuario con el id " }, "migrate": { "form": { "errors": { "email": { - "missing": "Digite um e-mail." + "missing": "Debes indicar una dirección de correo." }, "password": { - "length": "A senha deve ter no mínimo 6 caracteres.", - "missing": "Entre com uma senha." + "length": "La contraseña debe contenter un mínimo de 6 caracteres.", + "missing": "Dever indicar una contraseña." }, "user": { - "not_found": "Usuário não encontrado." + "not_found": "Usuario no encuentrado." } }, - "success": "Um e-mail de ativação foi enviado ao seu e-mail." + "success": "Un correo de activación fue enviado a tu correo." } }, "reset_pwd": { "form": { "error": { "user": { - "not_found": "Usuário não encontrado." + "not_found": "Usuario no encuentrado." } }, - "title": "Recuperar senha" + "title": "Recuperar contraseña" }, "mail": { - "title": "Recuperar senha" + "title": "Recuperar contraseña" }, "token": { - "success": "Token de alteração de senha enviado." + "success": "Token de cambio de contraseña enviado." } }, "update": { "email": { "error": { - "already_associated": "E-mail já associado a outra conta.", - "already_used": "E-mail já utilizado.", - "invalid": "Endereço de e-mail inválido.", - "mailer": "Error enviando confirmação de e-mail.", - "missing_callback": "Callback não encontrado." + "already_associated": "Este correo ya es associado a otro perfil.", + "already_used": "Este correo ya es utilizado.", + "invalid": "Dirección de correo inválido.", + "mailer": "Error al enviar confirmación de correo.", + "missing_callback": "Función de callback no encuentrada." }, - "success": "E-mail de confirmação de endereco enviado." + "success": "Confirmación de dirección de correo enviada." }, "password": { "error": { - "dont_match": "Senhas não coincidem.", - "length": "A senha deve ter no mínimo 6 caracteres.", - "wrong": "Senha incorreta." + "dont_match": "Contraseñas no coinciden.", + "length": "La contraseña debe contenter un mínimo de 6 caracteres.", + "wrong": "Contraseña incorrecta." }, - "success": "Senha alterada com sucesso." + "success": "Contraseña cambiada con suceso." }, - "success": "Perfil atualizado com sucesso." + "success": "Perfil actualizado con suceso." } }, "views": { "admin": { "first_admin": { - "administrative_area": "Área administrativa", - "create_admin": "Criar admin", - "create_first_admin_user": "Criar o primeiro usuário administrador:", - "email": "E-mail", - "name": "Nome", - "password": "Senha" + "administrative_area": "Area administrativa", + "create_admin": "Crear usuario admin", + "create_first_admin_user": "Crear el primero usuario administrador:", + "email": "Correo", + "name": "Nombre", + "password": "Contraseña" }, "login": { - "administrative_area": "Área administrativa", - "email": "E-mail", + "administrative_area": "Area administrativa", + "email": "Correo", "login": "Entrar", - "password": "Senha" + "password": "Contraseña" }, "menu": { - "general": "Geral", - "mailer": "Envio de e-mail", - "manage_users": "Gerenciar usuários", - "settings": "Configurações", + "general": "General", + "mailer": "Envio de correo", + "manage_users": "Gerenciar usuarios", + "settings": "Configuraciones", "users": { - "invite": "Convites", - "roles": "Permissões" + "invite": "Inviaciones", + "roles": "Permissiones" } }, "settings": { "index": { - "allow_geofiles_import": "Permitir importação de arquivo geo", - "brazilian_portuguese": "", - "client_url": "URL do cliente", - "english": "", - "general_settings": "Configurações gerais", - "only_invited_can_register": "Somente convidados podem registrar-se", - "server_url": "URL do servidor", - "site_description": "Descricão do site", - "site_language": "", - "site_title": "Título do site", - "spanish": "", - "update": "Atualizar" + "allow_geofiles_import": "Permitir importacion de archivos geo", + "brazilian_portuguese": "Portugués Brasileño", + "client_url": "URL del cliente", + "english": "Inglés", + "general_settings": "Configuraciones generales", + "only_invited_can_register": "Solamente invitados puedem registrarse", + "server_url": "URL del servidor", + "site_description": "Descripción del sitio", + "site_language": "Idioma del sitio", + "site_title": "Título del sitio", + "spanish": "Español", + "update": "Actualizar" }, "mailer": { - "from_address": "Endereço do remetente", - "mailer_settings": "Configurações de envio de e-mail", - "password": "Senha do SMTP", - "smtp_host": "Host do SMTP", - "smtp_port": "Porta do SMTP", - "smtp_user": "Usuário do SMTP", - "update": "Atualizar", + "from_address": "Dirección del remetente", + "mailer_settings": "Configuraciones de envio de correo", + "password": "Contraseña del SMTP", + "smtp_host": "Host del SMTP", + "smtp_port": "Porta del SMTP", + "smtp_user": "Usuario del SMTP", + "update": "Actualizar", "use_ssl": "Usar SSL" } }, @@ -323,43 +300,53 @@ "admin": "Administrador", "colaborator": "Colaborador", "editor": "Editor", - "email": "E-mail", - "invite_a_user": "Convidar um usuário:", - "name": "Nome", + "email": "Correo", + "invite_a_user": "Convidar un usuario:", + "name": "Nombre", "role": "Perfil", - "send_invitation": "Enviar convite" + "send_invitation": "Enviar invitación" }, "roles": { - "admin": "views.admin.users.roles.admin", + "admin": "Administrador", "change": "Alterar", - "collaborator": "views.admin.users.roles.collaborator", - "editor": "views.admin.users.roles.editor", - "email": "E-mail", - "manage_user_roles": "Gerenciar perfis de usuário", - "name": "Nome", + "collaborator": "Colaborador", + "editor": "Editor", + "email": "Correo", + "manage_user_roles": "Gerenciar perfiles de usuario", + "name": "Nombre", "role": "Perfil", - "there_are_no_users": "Não há usuários." + "there_are_no_users": "No hay usuarios." } } }, "includes": { "header": { - "admin_area_link": "Ir para área adminstrativa", + "admin_area_link": "Ir para la area adminstrativa", "login": "Entrar", - "logout": "Sair" + "logout": "Salir" } }, "layouts": { "admin_area": { - "administration": "Administração" + "administration": "Administración" + } + }, + "mailer": { + "user": { + "invite": { + "intro": "Has sido invitado a mapear.", + "link": "Siga el enlace para empiezar.", + "salute": "Hola, __username__,", + "thanks": "Gracias!" + } } }, "tokens": { "accept_invitation": { - "confirm_signup": "", - "define_password": "views.tokens.accept_invitation.define_password", - "send": "", - "type_a_password": "views.tokens.accept_invitation.type_a_password" + "confirm_signup": "Confirmar registro", + "define_password": "Definir contraseña", + "send": "Enviar", + "type_a_password": "Debes indicar una contraseña" } } } diff --git a/locales/es/translation.json b/locales/es/translation.json index 4f4c7a0..ba7c38e 100644 --- a/locales/es/translation.json +++ b/locales/es/translation.json @@ -8,95 +8,72 @@ }, "facebook": { "error": { - "missing_token": "Token de autorização do Facebook não encontrado." + "missing_token": "Token de autorización de Facebook no encontrado." } }, "google": { "error": { - "missing_token": "Token de autorização do Google não encontrado." + "missing_token": "Token de autorización de Google no encontrado." } }, "local": { "error": { - "need_password": "Você precisa de uma senha para acessar seu perfil. Verifique seu e-mail.", - "needs_activation": "Perfil de usuário inativo, um e-mail de ativação foi enviado.", - "send_email": "Houve um erro enviando um token de senha para seu e-mail." + "need_password": "Necesitas de una contraseña para activar su perfil. Verifique su correo.", + "needs_activation": "Perfil de usuario inacrivo, un correo de activación fue enviado.", + "send_email": "Hubo un error al enviar un token de contraseña a su correo." }, - "needs_migration": "Sua conta não foi migrada ainda, por favor visite esta página.", - "unauthorized": "Não autorizado." + "needs_migration": "Su cuenta todavia no fue migrada, por favor visite este enlace.", + "unauthorized": "No autorizado." }, "logout": { "error": { - "inexistent_token": "Token de acesso não encontrado.", - "not_logged": "Você não está logado." + "inexistent_token": "Token de acesso no encontrado.", + "not_logged": "No estás logado." }, - "successful": "Logout bem sucedido." - } - }, - "admin": { - "api_settings": { - "error": { - "load": "Não foi possível buscar informação do servidor." - } - }, - "first_admin": { - "error": { - "already_exists": "Um administrador já existe.", - "invalid_email": "Endereço de e-mail inválido.", - "needs_email": "Entre com um endereço de e-mail.", - "needs_name": "Entre com um nome.", - "password_length": "A senha deve ter no mínimo 6 caracteres.", - "password_missing": "Entre com uma senha." - }, - "success": "Admin criado com sucesso." - }, - "invite_user": { - "error": { - "already_active": "O usuário já está ativo." - }, - "success": "Convite foi com sucesso." + "successful": "Salida bien sucedida." } }, + "admin": "admin", "content": { "destroy": { - "success": "Conteúdo removido com sucesso." + "success": "Contenido removido con suceso." }, "load": { "error": { - "not_found": "Conteúdo não encontrado." + "not_found": "Contenido no encontrado." } } }, "feature": { "add_content": { - "success": "Conteúdo adicionado com sucesso." + "success": "Contenido añadido con suceso." }, "import": { "error": { - "disabled": "Importação de arquivos não disponível." + "disabled": "Importación de archivos no disponible." } }, "load": { "error": { - "cant_find": "Local não encontrado." + "cant_find": "Local no encontrado." } }, "remove_content": { - "success": "Conteúdo removido com sucesso." + "success": "Contenido removido con suceso." } }, "image": { "create": { "error": { - "not_found": "Arquivo de imagem não encontrado." + "not_found": "Archivo de imagen no encuentrado." } }, "destroy": { - "success": "Imagem removida com sucesso." + "success": "Imagen removida con suceso." }, "load": { "error": { - "not_found": "Imagem não encontrada." + "not_found": "Imagen no encuentrada." } } }, @@ -104,44 +81,44 @@ "contributor": { "add": { "error": { - "already_exists": "Usuário já é contribuidor da camada.", - "dont_exists": "Não existe usuário cadastrado com este e-mail.", - "email": "Erro enviando e-mail para este usuário." + "already_exists": "El usuario ja contribuidor de la capa.", + "dont_exists": "No existe perfil de usuario con este correo.", + "email": "Hubo un error al enviar un correo a este perfil." }, - "success": "Contribuidor adicionado com sucesso." + "success": "Contribuidor añadido con suceso." }, "remove": { "error": { "invalid_id": "Id de contribuidor inválido." }, - "success": "Contribuidor adicionado com sucesso." + "success": "Contribuidor añadido con suceso." } }, "create": { - "missing": "Tipo de camada não encontrado.", - "success": "Camada criada com sucesso." + "missing": "Tipo de capa no encuentrada.", + "success": "Capa creada con suceso." }, "destroy": { - "success": "Camada removida com sucesso." + "success": "Capa removida con suceso." }, "load": { - "error": "Erro carregando camada.", - "not_found": "Camada não encontrada." + "error": "Error al cargar capa.", + "not_found": "Capa no encuentrada." }, "update": { - "success": "Camada atualizada com sucesso.", + "success": "Capa actualizada con suceso.", "tilelayer": { - "error": "Erro ao atualizar TileLayer." + "error": "Error al actualizar TileLayer." } } }, "map": { "destroy": { - "success": "Mapa removido com sucesso." + "success": "Mapa removido con suceso." }, "load": { "error": { - "not_found": "Mapa não encontrado." + "not_found": "Mapa no encuentrado." } } }, @@ -149,23 +126,23 @@ "accept_invitation": { "error": { "invalid_token": "Token inválido.", - "user_activation": "Erro ao ativar usuário." + "user_activation": "Error al activar usuario." }, - "success": "Perfil ativado com sucesso." + "success": "Perfil activado con suceso." }, "activate_account": { "error": { "invalid": "Token inválido.", - "saving": "Erro salvando token.", - "user": "Não foi possível ativar usuário." + "saving": "Erro grabando token.", + "user": "No fue posible activar perfil de usuario." }, - "success": "Perfil atualizado com sucesso, aguarde redirecionamento." + "success": "Perfil atualizado con suceso, aguarde redireccionamiento." }, "email_change": { "error": { - "generic": "Erro ao alterar e-mail do usuário." + "generic": "Error al alterar correo del usuario." }, - "success": "E-mail alterado com sucesso." + "success": "Correo alterado con suceso." }, "error": { "cant_save": "Erro ao salvar token.", @@ -174,147 +151,147 @@ "load": { "error": { "expired": "Token expirado.", - "not_found": "Token não encontrado." + "not_found": "Token no encuentrado." } }, "migration": { "error": { - "generic": "Um erro ocorreu na migração." + "generic": "Hubo un error en la migración." }, - "success": "Conta migrada com sucesso." + "success": "Conta migrada con suceso." }, "new_password": { "error": { "generic": "Erro alterando senha." }, - "success": "Senha alterada com sucesso." + "success": "Contraseña cambiada con suceso." } }, "user": { "create": { "error": { "email": { - "invalid": "Endereço de e-mail inválido.", - "missing": "Entre com um endereço de e-mail." + "invalid": "Dirección de correo inválido.", + "missing": "Debes indicar una dirección de correo." }, - "missing_name": "Digite seu nome.", + "missing_name": "Debes indicar un nombre.", "password": { - "length": "A senha deve ter no mínimo 6 caracteres.", - "missing": "Entre com uma senha." + "length": "La contraseña debe contenter un mínimo de 6 caracteres.", + "missing": "Debes indicar una contraseña." } }, "success": { - "with_token": "Perfil de usuário criado com sucesso. Um link de ativação foi enviado.", - "without_token": "Perfil de usuário criado com sucesso." + "with_token": "Perfil de usuario creado con suceso. Un correo de activación fue enviado.", + "without_token": "Perfil de usuario creado con suceso." } }, "load": { - "error": "Erro ao carregar usuário com id " + "error": "Error al cargar usuario con el id " }, "migrate": { "form": { "errors": { "email": { - "missing": "Digite um e-mail." + "missing": "Debes indicar una dirección de correo." }, "password": { - "length": "A senha deve ter no mínimo 6 caracteres.", - "missing": "Entre com uma senha." + "length": "La contraseña debe contenter un mínimo de 6 caracteres.", + "missing": "Dever indicar una contraseña." }, "user": { - "not_found": "Usuário não encontrado." + "not_found": "Usuario no encuentrado." } }, - "success": "Um e-mail de ativação foi enviado ao seu e-mail." + "success": "Un correo de activación fue enviado a tu correo." } }, "reset_pwd": { "form": { "error": { "user": { - "not_found": "Usuário não encontrado." + "not_found": "Usuario no encuentrado." } }, - "title": "Recuperar senha" + "title": "Recuperar contraseña" }, "mail": { - "title": "Recuperar senha" + "title": "Recuperar contraseña" }, "token": { - "success": "Token de alteração de senha enviado." + "success": "Token de cambio de contraseña enviado." } }, "update": { "email": { "error": { - "already_associated": "E-mail já associado a outra conta.", - "already_used": "E-mail já utilizado.", - "invalid": "Endereço de e-mail inválido.", - "mailer": "Error enviando confirmação de e-mail.", - "missing_callback": "Callback não encontrado." + "already_associated": "Este correo ya es associado a otro perfil.", + "already_used": "Este correo ya es utilizado.", + "invalid": "Dirección de correo inválido.", + "mailer": "Error al enviar confirmación de correo.", + "missing_callback": "Función de callback no encuentrada." }, - "success": "E-mail de confirmação de endereco enviado." + "success": "Confirmación de dirección de correo enviada." }, "password": { "error": { - "dont_match": "Senhas não coincidem.", - "length": "A senha deve ter no mínimo 6 caracteres.", - "wrong": "Senha incorreta." + "dont_match": "Contraseñas no coinciden.", + "length": "La contraseña debe contenter un mínimo de 6 caracteres.", + "wrong": "Contraseña incorrecta." }, - "success": "Senha alterada com sucesso." + "success": "Contraseña cambiada con suceso." }, - "success": "Perfil atualizado com sucesso." + "success": "Perfil actualizado con suceso." } }, "views": { "admin": { "first_admin": { - "administrative_area": "Área administrativa", - "create_admin": "Criar admin", - "create_first_admin_user": "Criar o primeiro usuário administrador:", - "email": "E-mail", - "name": "Nome", - "password": "Senha" + "administrative_area": "Area administrativa", + "create_admin": "Crear usuario admin", + "create_first_admin_user": "Crear el primero usuario administrador:", + "email": "Correo", + "name": "Nombre", + "password": "Contraseña" }, "login": { - "administrative_area": "Área administrativa", - "email": "E-mail", + "administrative_area": "Area administrativa", + "email": "Correo", "login": "Entrar", - "password": "Senha" + "password": "Contraseña" }, "menu": { - "general": "Geral", - "mailer": "Envio de e-mail", - "manage_users": "Gerenciar usuários", - "settings": "Configurações", + "general": "General", + "mailer": "Envio de correo", + "manage_users": "Gerenciar usuarios", + "settings": "Configuraciones", "users": { - "invite": "Convites", - "roles": "Permissões" + "invite": "Inviaciones", + "roles": "Permissiones" } }, "settings": { "index": { - "allow_geofiles_import": "Permitir importação de arquivo geo", - "brazilian_portuguese": "", - "client_url": "URL do cliente", - "english": "", - "general_settings": "Configurações gerais", - "only_invited_can_register": "Somente convidados podem registrar-se", - "server_url": "URL do servidor", - "site_description": "Descricão do site", - "site_language": "", - "site_title": "Título do site", - "spanish": "", - "update": "Atualizar" + "allow_geofiles_import": "Permitir importacion de archivos geo", + "brazilian_portuguese": "Portugués Brasileño", + "client_url": "URL del cliente", + "english": "Inglés", + "general_settings": "Configuraciones generales", + "only_invited_can_register": "Solamente invitados puedem registrarse", + "server_url": "URL del servidor", + "site_description": "Descripción del sitio", + "site_language": "Idioma del sitio", + "site_title": "Título del sitio", + "spanish": "Español", + "update": "Actualizar" }, "mailer": { - "from_address": "Endereço do remetente", - "mailer_settings": "Configurações de envio de e-mail", - "password": "Senha do SMTP", - "smtp_host": "Host do SMTP", - "smtp_port": "Porta do SMTP", - "smtp_user": "Usuário do SMTP", - "update": "Atualizar", + "from_address": "Dirección del remetente", + "mailer_settings": "Configuraciones de envio de correo", + "password": "Contraseña del SMTP", + "smtp_host": "Host del SMTP", + "smtp_port": "Porta del SMTP", + "smtp_user": "Usuario del SMTP", + "update": "Actualizar", "use_ssl": "Usar SSL" } }, @@ -323,43 +300,53 @@ "admin": "Administrador", "colaborator": "Colaborador", "editor": "Editor", - "email": "E-mail", - "invite_a_user": "Convidar um usuário:", - "name": "Nome", + "email": "Correo", + "invite_a_user": "Convidar un usuario:", + "name": "Nombre", "role": "Perfil", - "send_invitation": "Enviar convite" + "send_invitation": "Enviar invitación" }, "roles": { - "admin": "views.admin.users.roles.admin", + "admin": "Administrador", "change": "Alterar", - "collaborator": "views.admin.users.roles.collaborator", - "editor": "views.admin.users.roles.editor", - "email": "E-mail", - "manage_user_roles": "Gerenciar perfis de usuário", - "name": "Nome", + "collaborator": "Colaborador", + "editor": "Editor", + "email": "Correo", + "manage_user_roles": "Gerenciar perfiles de usuario", + "name": "Nombre", "role": "Perfil", - "there_are_no_users": "Não há usuários." + "there_are_no_users": "No hay usuarios." } } }, "includes": { "header": { - "admin_area_link": "Ir para área adminstrativa", + "admin_area_link": "Ir para la area adminstrativa", "login": "Entrar", - "logout": "Sair" + "logout": "Salir" } }, "layouts": { "admin_area": { - "administration": "Administração" + "administration": "Administración" + } + }, + "mailer": { + "user": { + "invite": { + "intro": "Has sido invitado a mapear.", + "link": "Siga el enlace para empiezar.", + "salute": "Hola, __username__,", + "thanks": "Gracias!" + } } }, "tokens": { "accept_invitation": { - "confirm_signup": "", - "define_password": "views.tokens.accept_invitation.define_password", - "send": "", - "type_a_password": "views.tokens.accept_invitation.type_a_password" + "confirm_signup": "Confirmar registro", + "define_password": "Definir contraseña", + "send": "Enviar", + "type_a_password": "Debes indicar una contraseña" } } } diff --git a/locales/pt-BR/translation.json b/locales/pt-BR/translation.json index 9b77936..e710e9e 100644 --- a/locales/pt-BR/translation.json +++ b/locales/pt-BR/translation.json @@ -33,30 +33,7 @@ "successful": "Logout bem sucedido." } }, - "admin": { - "api_settings": { - "error": { - "load": "Não foi possível buscar informação do servidor." - } - }, - "first_admin": { - "error": { - "already_exists": "Um administrador já existe.", - "invalid_email": "Endereço de e-mail inválido.", - "needs_email": "Entre com um endereço de e-mail.", - "needs_name": "Entre com um nome.", - "password_length": "A senha deve ter no mínimo 6 caracteres.", - "password_missing": "Entre com uma senha." - }, - "success": "Admin criado com sucesso." - }, - "invite_user": { - "error": { - "already_active": "O usuário já está ativo." - }, - "success": "Convite foi com sucesso." - } - }, + "admin": "admin", "content": { "destroy": { "success": "Conteúdo removido com sucesso." @@ -354,6 +331,16 @@ "administration": "Administração" } }, + "mailer": { + "user": { + "invite": { + "intro": "Você foi convidado a mapear.", + "link": "Clique aqui para começar.", + "salute": "Olá, __username__,", + "thanks": "Obrigado!" + } + } + }, "tokens": { "accept_invitation": { "confirm_signup": "Confirme sua inscrição", diff --git a/locales/pt/translation.json b/locales/pt/translation.json index c4c55b9..56dd615 100644 --- a/locales/pt/translation.json +++ b/locales/pt/translation.json @@ -33,30 +33,7 @@ "successful": "Logout bem sucedido." } }, - "admin": { - "api_settings": { - "error": { - "load": "Não foi possível buscar informação do servidor." - } - }, - "first_admin": { - "error": { - "already_exists": "Um administrador já existe.", - "invalid_email": "Endereço de e-mail inválido.", - "needs_email": "Entre com um endereço de e-mail.", - "needs_name": "Entre com um nome.", - "password_length": "A senha deve ter no mínimo 6 caracteres.", - "password_missing": "Entre com uma senha." - }, - "success": "Admin criado com sucesso." - }, - "invite_user": { - "error": { - "already_active": "O usuário já está ativo." - }, - "success": "Convite foi com sucesso." - } - }, + "admin": "admin", "content": { "destroy": { "success": "Conteúdo removido com sucesso." @@ -354,6 +331,16 @@ "administration": "Administração" } }, + "mailer": { + "user": { + "invite": { + "intro": "You were invited to map.", + "link": "Click here to start.", + "salute": "Hi, __username__,", + "thanks": "Thank you!" + } + } + }, "tokens": { "accept_invitation": { "confirm_signup": "", diff --git a/package.json b/package.json index 13bb4ff..1707d04 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "watch": "NODE_PATH=./app/controllers NODE_ENV=development ./node_modules/.bin/nodemon web.js", "start": "NODE_PATH=./app/controllers node web.js", "test": "make test", - "i18n": "./node_modules/.bin/i18next app/ -o locales/ -r -l en,es,es-ES,pt,pt-BR" + "i18n": "./node_modules/.bin/i18next app/ -o locales/ -r -l en-US,es,es-ES,pt,pt-BR" }, "dependencies": { "dotenv": "latest", From 01fd0bd28488ed5fc119208a33c91b77b0f87103 Mon Sep 17 00:00:00 2001 From: Vitor George Date: Thu, 8 May 2014 00:01:33 -0300 Subject: [PATCH 08/10] improvements in mailer --- app/controllers/access_token.js | 34 +++++----- app/controllers/admin.js | 4 +- app/controllers/contents.js | 26 +++---- app/controllers/features.js | 30 ++++---- app/controllers/images.js | 10 +-- app/controllers/layers.js | 49 ++++++------- app/controllers/maps.js | 14 ++-- app/controllers/users.js | 68 ++++++++++--------- app/views/mailer/account/migrate_account.jade | 11 ++- .../inform_contributor_permission.jade | 8 +-- app/views/mailer/email/change.jade | 9 ++- app/views/mailer/email/confirm.jade | 7 +- app/views/mailer/password/recover.jade | 12 ++-- app/views/mailer/password/set.jade | 11 ++- lib/mailer.js | 25 +++---- lib/messages.js | 14 ++-- locales/es-ES/translation.json | 45 +++++++++++- locales/es/translation.json | 42 ++++++++++++ locales/pt-BR/translation.json | 47 ++++++++++++- locales/pt/translation.json | 45 +++++++++++- 20 files changed, 343 insertions(+), 168 deletions(-) diff --git a/app/controllers/access_token.js b/app/controllers/access_token.js index 6fc4763..7d70ba7 100644 --- a/app/controllers/access_token.js +++ b/app/controllers/access_token.js @@ -24,7 +24,7 @@ var generateAccessToken = function(user, res) { token.save(function(err) { if (err) { console.log(err); - return res.json(401, {messages: messages.mongooseErrors(req.i18n, err)}); + return res.json(401, messages.mongooseErrors(req.i18n.t, err, 'accessToken')); } var response = _.extend({ @@ -57,13 +57,13 @@ var authSocialUser = function(provider, profile, res) { User.load({email: userProfile.email}, function(err, user){ if (err) - return res.json(401, {messages: messages.error(req.i18n.t('access_token.authsocial.error.load_user'))}); + return res.json(401, messages.error(req.i18n.t('access_token.authsocial.error.load_user'))); if (!user) { user = new User(userProfile); user.save(function(err){ if (err) - return res.json(401, {messages: messages.error(req.i18n.t('access_token.authsocial.error.save_user'))}); + return res.json(401, messages.error(req.i18n.t('access_token.authsocial.error.save_user'))); generateAccessToken(user, res); }) } else { @@ -75,7 +75,7 @@ var authSocialUser = function(provider, profile, res) { if (user.isModified) { user.save(function(err){ - if (err) return res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); + if (err) return res.json(400, messages.mongooseErrors(req.i18n.t, err, 'user')); generateAccessToken(user, res); }) } else generateAccessToken(user, res); @@ -110,7 +110,7 @@ exports.google = function(req, res){ }); } } else { - return res.json(400, {messages: messages.error(req.i18n.t('access_token.google.error.missing_token'))}); + return res.json(400, messages.error(req.i18n.t('access_token.google.error.missing_token'))); } } @@ -142,7 +142,7 @@ exports.facebook = function(req, res, next) { }); } } else { - return res.json(400, {messages: messages.error(req.i18n.t('access_token.facebook.error.missing_token'))}); + return res.json(400, messages.error(req.i18n.t('access_token.facebook.error.missing_token'))); } @@ -154,37 +154,37 @@ exports.local = function(req, res, next) { // Unknown error if (err) { - return res.json(400, {messages: messages.mongooseError(req.i18n, err)}); + return res.json(400, messages.mongooseError(req.i18n, err)); // Error raised by passport } else if (info && info.message) { - res.json(400, { messages: messages.error(req.i18n.t(info.message))}); + res.json(400, messages.error(req.i18n.t(info.message))); // User not found. } else if (!user) { - return res.json(403, { messages: messages.error(req.i18n.t("access_token.local.unauthorized"))}); + return res.json(403, messages.error(req.i18n.t("access_token.local.unauthorized"))); } // User needs to finish migration. else if (user.status == 'to_migrate') { - return res.json(400, {messages: messages.error(req.i18n.t("access_token.local.needs_migration"))}); + return res.json(400, messages.error(req.i18n.t("access_token.local.needs_migration"))); // User doesn't have a password, because it logged before via Facebook or Google } else if (!user.hashed_password) { mailer.passwordNeeded(user, req.app.locals.settings.general.serverUrl, user.callback_url, function(err){ if (err) - return res.json(400, { messages: messages.error(req.i18n.t("access_token.local.error.send_email"))}); + return res.json(400, messages.error(req.i18n.t("access_token.local.error.send_email"))); else - return res.json(400, { messages: messages.error(req.i18n.t("access_token.local.error.need_password"))}); + return res.json(400, messages.error(req.i18n.t("access_token.local.error.need_password"))); }); // User needs to confirm his email } else if (user.needsEmailConfirmation) { mailer.confirmEmail(user, req.app.locals.settings.general.serverUrl, req.body.callback_url, function(err){ if (err) - return res.json(400, {messages: messages.error(req.i18n.t("access_token.local.error.send_email"))}); + return res.json(400, messages.error(req.i18n.t("access_token.local.error.send_email"))); else - return res.json(400, {messages: messages.error(req.i18n.t("access_token.local.error.needs_activation"))}); + return res.json(400, messages.error(req.i18n.t("access_token.local.error.needs_activation"))); }); // Login successful, proceed with token @@ -207,16 +207,16 @@ exports.logout = function(req, res, next) { var access_token = req.headers.authorization.split(' ')[1]; AccessToken.findOne({_id: access_token}, function(err, at){ if (err) return res.json(400, err); - if (!at) return res.json(400, {messages: messages.error(req.i18n.t("access_token.logout.error.inexistent_token"))}); + if (!at) return res.json(400, messages.error(req.i18n.t("access_token.logout.error.inexistent_token"))); at.expired = true; at.save(function(err){ if (err) return res.json(400, err); - else return res.json({messags: messages.success(req.i18n.t('access_token.logout.successful'))}); + else return res.json(messages.success(req.i18n.t('access_token.logout.successful'))); }); }); } else { - res.json(400, {messages: messages.error(req.i18n.t('access_token.logout.error.not_logged'))}); + res.json(400, messages.error(req.i18n.t('access_token.logout.error.not_logged'))); } diff --git a/app/controllers/admin.js b/app/controllers/admin.js index 93d4295..ffaebc5 100644 --- a/app/controllers/admin.js +++ b/app/controllers/admin.js @@ -67,7 +67,7 @@ exports.firstAdmin = function(req, res) { } else { user.save(function (err) { if (err) { - res.render('admin/first_admin', {messages: messages.mongooseErrors(req.i18n, err)}); + res.render('admin/first_admin', messages.mongooseErrors(req.i18n.t, err, 'user')); } else { req.flash('info', req.i18n.t('admin.first_admin.success')); @@ -264,7 +264,7 @@ exports.invite = function(req, res, next) { console.log(err); next(err); } - else return res.render('admin/users/new', {messages: messages.success(req.i18n.t('admin.invite_user.success'))}); + else return res.render('admin/users/new', messages.success(req.i18n.t('admin.invite_user.success'))); }); } } diff --git a/app/controllers/contents.js b/app/controllers/contents.js index 7cac3cd..2098dec 100644 --- a/app/controllers/contents.js +++ b/app/controllers/contents.js @@ -19,7 +19,7 @@ exports.load = function(req, res, next, id) { if (err) { return next(err) } else if (!content) { - return res.json(400, { messages: messages.error(req.i18n.t('content.load.error.not_found'))}); + return res.json(400, messages.error(req.i18n.t('content.load.error.not_found'))); } else { req.content = content; next(); @@ -52,9 +52,9 @@ exports.index = function(req, res){ } Content.list(options, function(err, contents) { - if (err) return res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); + if (err) return res.json(400, messages.mongooseErrors(req.i18n.t, err, 'content')); Content.count(options.criteria).exec(function (err, count) { - if (err) res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); + if (err) res.json(400, messages.mongooseErrors(req.i18n.t, err, 'content')); else res.json({options: options, contentsTotal: count, contents: contents}); }) }) @@ -77,18 +77,18 @@ exports.create = function (req, res) { content.creator = req.user; Layer.findById(req.body['layer'], function(err, layer){ - if (err) res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); + if (err) res.json(400, messages.mongooseErrors(req.i18n.t, err, 'layer')); else { layer.contents.addToSet(content); layer.save(function(err){ - if (err) res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); + if (err) res.json(400, messages.mongooseErrors(req.i18n.t, err, 'layer')); else { content.updateSirTrevor(req.body.sirTrevorData, function(err, ct){ - if (err) res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); + if (err) res.json(400, messages.mongooseErrors(req.i18n.t, err, 'content')); else content.save(function(err){ // console.log('salvou o content assim\n'+content); - if (err) res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); + if (err) res.json(400, messages.mongooseErrors(req.i18n.t, err, 'content')); else res.json(content); }); }); @@ -115,10 +115,10 @@ exports.update = function(req, res){ content = _.extend(content, req.body) content.updateSirTrevor(updatedSirTrevor, function(err, ct){ - if (err) res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); + if (err) res.json(400, messages.mongooseErrors(req.i18n.t, err, 'content')); else ct.save(function(err){ - if (err) res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); + if (err) res.json(400, messages.mongooseErrors(req.i18n.t, err, 'content')); else res.json(ct); }); }); @@ -143,17 +143,17 @@ exports.destroy = function(req, res){ content = req.content; mongoose.model('Layer').findById(content.layer._id, function(err, layer){ - if (err) res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); + if (err) res.json(400, messages.mongooseErrors(req.i18n.t, err, 'layer')); else { layer.contents.pull({_id: content._id}); layer.save(function(err){ - if (err) res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); + if (err) res.json(400, messages.mongooseErrors(req.i18n.t, err, 'layer')); else { content.remove(function(err){ - if (err) res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); - else res.json({messages: messages.success(req.i18n.t('content.destroy.success'))}); + if (err) res.json(400, messages.mongooseErrors(req.i18n.t, err, 'content')); + else res.json(messages.success(req.i18n.t('content.destroy.success'))); }) } }) diff --git a/app/controllers/features.js b/app/controllers/features.js index 08846b2..0762ec3 100644 --- a/app/controllers/features.js +++ b/app/controllers/features.js @@ -20,7 +20,7 @@ exports.load = function(req, res, next, id){ if (err) { return next(err) } else if (!feature) { - return res.json(400, {messages: messages.error(req.i18n.t('feature.load.error.cant_find'))}); + return res.json(400, messages.error(req.i18n.t('feature.load.error.cant_find'))); } else { req.feature = feature; next(); @@ -41,12 +41,12 @@ exports.index = function(req, res){ } Feature.list(options, function(err, features) { - if (err) return res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); + if (err) return res.json(400, messages.mongooseErrors(req.i18n.t, err, 'feature')); Feature.count().exec(function (err, count) { if (!err) { res.json({options: options, featuresTotal: count, features: features}); } else { - res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); + res.json(400, messages.mongooseErrors(req.i18n.t, err, 'feature')); } }) }) @@ -66,14 +66,14 @@ exports.create = function (req, res) { // save feature feature.save(function (err) { if (err) { - res.json(400, messages.mongooseErrors(req.i18n, err)); + res.json(400, messages.mongooseErrors(req.i18n.t, err, 'feature')); } else { var layer = feature.layer; layer.features.addToSet(feature); // save layer layer.save(function(err){ - if (err) res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); + if (err) res.json(400, messages.mongooseErrors(req.i18n.t, err, 'feature')); res.json(feature); }); } @@ -127,7 +127,7 @@ exports.update = function(req, res){ feature = _.extend(feature, req.body); feature.save(function(err) { - if (err) res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); + if (err) res.json(400, messages.mongooseErrors(req.i18n.t, err, 'feature')); else res.json(feature); }); } @@ -153,10 +153,10 @@ exports.addContent = function(req, res){ // save both content.save(function(err){ - if (err) res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); + if (err) res.json(400, messages.mongooseErrors(req.i18n.t, err, 'content')); feature.save(function(err){ - if (err) res.json(400,err) - else res.json({messages: messages.success(req.i18n.t('feature.add_content.success'))}); + if (err) res.json(400, messages.mongooseErrors(req.i18n.t, err, 'feature')) + else res.json(messages.success(req.i18n.t('feature.add_content.success'))); }); }); @@ -181,10 +181,10 @@ exports.removeContent = function(req, res){ // save both content.save(function(err){ - if (err) res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); + if (err) res.json(400, messages.mongooseErrors(req.i18n.t, err, 'content')); feature.save(function(err){ - if (err) res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); - else res.json({messages: messages.success(req.i18n.t('feature.remove_content.success'))}); + if (err) res.json(400, messages.mongooseErrors(req.i18n.t, err, 'feature')); + else res.json(messages.success(req.i18n.t('feature.remove_content.success'))); }); }); } @@ -218,12 +218,12 @@ exports.import = function(req, res) { } }); }, function(err) { - if(err) res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); + if(err) res.json(400, messages.mongooseErrors(req.i18n.t, err, 'feature')); else { // save layer layer.save(function(err){ if(err) { - if(err) res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); + if(err) res.json(400, messages.mongooseErrors(req.i18n.t, err, 'layer')); } else { res.json(layer.features); } @@ -231,6 +231,6 @@ exports.import = function(req, res) { } }); } else { - res.json({messages: messages.error(req.i18n.t('feature.import.error.disabled'))}); + res.json(messages.error(req.i18n.t('feature.import.error.disabled'))); } } diff --git a/app/controllers/images.js b/app/controllers/images.js index f385f22..51556e7 100644 --- a/app/controllers/images.js +++ b/app/controllers/images.js @@ -19,7 +19,7 @@ var exports.load = function (req, res, next, id) { Image.load(id, function (err, image) { if (err) return next(err) - if (!image) return res.json(400, { messages: messages.error(req.i18n.t('image.load.error.not_found'))}); + if (!image) return res.json(400, messages.error(req.i18n.t('image.load.error.not_found'))); req.image = image next() }); @@ -52,7 +52,7 @@ exports.showForm = function (req, res) { exports.create = function (req, res) { if (!req.files.attachment.file) - return res.json(400, {messages: messages.error(req.i18n.t('image.create.error.not_found'))}); + return res.json(400, messages.error(req.i18n.t('image.create.error.not_found'))); else { var image = new Image(); @@ -60,7 +60,7 @@ exports.create = function (req, res) { baseUrl = process.env.APP_URL + '/uploads/images/img_'; image.uploadImageAndSave(req.files.attachment.file, baseUrl, function(err){ - if (err) return res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); + if (err) return res.json(400, messages.mongooseErrors(req.i18n.t, err, 'image')); else res.json(image); }) } @@ -72,7 +72,7 @@ exports.create = function (req, res) { exports.destroy = function (req, res) { req.image.remove(function(err) { - if (err) res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); - else res.json({ messages: messages.success(req.i18n.t('image.destroy.success'))}); + if (err) res.json(400, messages.mongooseErrors(req.i18n.t, err, 'image')); + else res.json(messages.success(req.i18n.t('image.destroy.success'))); }); } \ No newline at end of file diff --git a/app/controllers/layers.js b/app/controllers/layers.js index 4da269c..b46faf3 100644 --- a/app/controllers/layers.js +++ b/app/controllers/layers.js @@ -22,9 +22,9 @@ exports.load = function(req, res, next, id){ console.log(req.locale); Layer.load(id, function (err, layer) { if (err) - return res.json(400, {messages: messages.error(req.i18n.t('layer.load.error'))}); + return res.json(400, messages.error(req.i18n.t('layer.load.error'))); else if (!layer) - return res.json(400, {messages: messages.error(req.i18n.t('layer.load.not_found'))}); + return res.json(400, messages.error(req.i18n.t('layer.load.not_found'))); else { req.layer = layer next() @@ -64,12 +64,12 @@ exports.index = function(req, res){ } Layer.list(options, function(err, layers) { - if (err) return res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); + if (err) return res.json(400, messages.mongooseErrors(req.i18n.t, err, 'layer')); Layer.count(options.criteria).exec(function (err, count) { if (!err) { res.json({options: options, layersTotal: count, layers: layers}); } else { - res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); + res.json(400, messages.mongooseErrors(req.i18n.t, err, 'layer')); } }); }); @@ -121,7 +121,7 @@ exports.create = function (req, res) { if (!type) { - return res.json(400, { messages: messages.error(req.i18n.t('layer.create.missing')) } ); + return res.json(400, messages.error(req.i18n.t('layer.create.missing'))); } else if (type == 'TileLayer') { @@ -147,7 +147,7 @@ exports.create = function (req, res) { layer.save(function (err) { if (!err) { - res.json({ layer: layer, messages: messages.success(req.i18n.t('layer.create.success'))}); + res.json({ layer: layer, messages: messages.success(req.i18n.t('layer.create.success')).messages}); } else { res.json(400, {messages: messages.mongooseError(req.i18n, err)}); } @@ -167,17 +167,17 @@ exports.update = function(req, res){ delete req.body['__v']; if (req.layer == 'TileLayer') { - return res.json(400, { messages: messages.error(req.i18n.t("layer.update.tilelayer.error") ) } ); + return res.json(400, messages.error(req.i18n.t("layer.update.tilelayer.error"))); } layer = _.extend(layer, req.body); layer.save(function(err) { if (!err) { - res.json({ layer: layer, messages: messages.success(req.i18n.t('layer.update.success'))}); + res.json({ layer: layer, messages: messages.success(req.i18n.t('layer.update.success')).messages}); } else { console.log(err); - res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); + res.json(400, messages.mongooseErrors(req.i18n.t, err, 'layer')); } }) } @@ -190,9 +190,9 @@ exports.destroy = function(req, res){ var layer = req.layer layer.remove(function(err){ if(err) { - res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); + res.json(400, messages.mongooseErrors(req.i18n.t, err, 'layer')); } else { - res.json({ messages: messages.success(req.i18n.t('layer.destroy.success'))}); + res.json(messages.success(req.i18n.t('layer.destroy.success'))); } }) } @@ -212,9 +212,9 @@ exports.addFeature = function (req, res) { } feature.save(function(err){ - res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); + res.json(400, messages.mongooseErrors(req.i18n.t, err, 'feature')); layer.save(function(err){ - if (err) res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); + if (err) res.json(400, messages.mongooseErrors(req.i18n.t, err, 'layer')); else res.json(feature); }) }) @@ -230,10 +230,10 @@ exports.removeFeature = function (req, res) { layer = req.layer; var saveLayer = function(err) { - if (err) res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); + if (err) res.json(400, messages.mongooseErrors(req.i18n.t, err, 'layer')); layer.features = _.filter(layer.features, function(f) { return !f._id.equals(feature._id); }); layer.save(function(err) { - if (err) res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); + if (err) res.json(400, messages.mongooseErrors(req.i18n.t, err, 'layer')); else res.json(feature); }); } @@ -253,18 +253,18 @@ exports.addContributor = function (req, res) { layer = req.layer; if (contributorEmail == req.user.email) { - res.json(400, { messages: messages.error(req.i18n.t("layer.contributor.add.error.already_exists"))}); + res.json(400, messages.error(req.i18n.t("layer.contributor.add.error.already_exists"))); } else { User.findOne({email: contributorEmail}, function(err, user){ if (err) { - res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); + res.json(400, messages.mongooseErrors(req.i18n.t, err, 'user')); } else if (!user) { - res.json(400, { messages: messages.error(req.i18n.t("layer.contributor.add.error.dont_exists"))}); + res.json(400, messages.error(req.i18n.t("layer.contributor.add.error.dont_exists"))); } else { layer.contributors.addToSet(user); layer.save(function(err){ if (err) - res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); + res.json(400, messages.mongooseErrors(req.i18n.t, err, 'layer')); else Layer .findById(layer._id) @@ -272,12 +272,13 @@ exports.addContributor = function (req, res) { .exec(function(err, updatedLayer){ mailer.informContributorPermission({ mailSender: req.app.mailer, + t: req.i18n.t, layer: layer, creator: req.user, contributor: user }, function(err){ - if (err) res.json(400, { messages: messages.error(req.i18n.t("layer.contributor.add.error.email"))}) - res.json({ layer: updatedLayer, messages: messages.success(req.i18n.t('layer.contributor.add.success'))}); + if (err) res.json(400, messages.error(req.i18n.t("layer.contributor.add.error.email"))) + else res.json({ layer: updatedLayer, messages: messages.success(req.i18n.t('layer.contributor.add.success')).messages}); }); }); }); @@ -300,17 +301,17 @@ exports.removeContributor = function (req, res) { layer.contributors.pull({_id: contributorId}); if (contributorCount == layer.contributors.lentgh) { - res.json(400, { messages: messages.error( req.i18n.t( "layer.contributor.remove.error.invalid_id") ) } ); + res.json(400, messages.error( req.i18n.t( "layer.contributor.remove.error.invalid_id"))); } else { layer.save(function(err){ if (err) { - res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); + res.json(400, messages.mongooseErrors(req.i18n.t, err, 'layer')); } else { Layer .findById(layer._id) .populate('contributors', 'name username email') .exec(function(err, updatedLayer){ - res.json({ layer: updatedLayer, messages: messages.success(req.i18n.t('layer.contributor.remove.success'))}); + res.json({ layer: updatedLayer, messages: messages.success(req.i18n.t('layer.contributor.remove.success')).messages}); }) } }) diff --git a/app/controllers/maps.js b/app/controllers/maps.js index 53bcd7e..0f3bcf4 100644 --- a/app/controllers/maps.js +++ b/app/controllers/maps.js @@ -16,7 +16,7 @@ var exports.load = function(req, res, next, id){ Map.load(id, function (err, map) { if (err) return next(err) - if (!map) return res.json(400, { messages: messages.error(req.i18n.t('map.load.error.not_found'))}); + if (!map) return res.json(400, messages.error(req.i18n.t('map.load.error.not_found'))); req.map = map next() }); @@ -48,9 +48,9 @@ exports.index = function(req, res){ } Map.list(options, function(err, maps) { - if (err) return res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); + if (err) return res.json(400, messages.mongooseErrors(req.i18n.t, err, 'map')); Map.count(options.criteria).exec(function (err, count) { - if (err) res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); + if (err) res.json(400, messages.mongooseErrors(req.i18n.t, err, 'map')); else res.json({options: options, mapsTotal: count, maps: maps}); }) }) @@ -77,7 +77,7 @@ exports.create = function (req, res) { // save map map.setLayersAndSave(req.body.layers, function (err) { - if (err) res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); + if (err) res.json(400, messages.mongooseErrors(req.i18n.t, err, 'map')); else res.json(map); }); } @@ -100,7 +100,7 @@ exports.update = function(req, res){ map = extend(map, req.body); map.setLayersAndSave(newLayerSet, function(err) { - if (err) res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); + if (err) res.json(400, messages.mongooseErrors(req.i18n.t, err, 'map')); else res.json(map); }) } @@ -112,7 +112,7 @@ exports.update = function(req, res){ exports.destroy = function(req, res){ var map = req.map map.remove(function(err){ - if (err) res.json(400, {messages: messages.mongooseErrors(req.i18n, err)}); - else res.json({ messages: messages.error(req.i18n.t('map.destroy.success'))}); + if (err) res.json(400, messages.mongooseErrors(req.i18n.t, err, 'map')); + else res.json(messages.error(req.i18n.t('map.destroy.success'))); }); } \ No newline at end of file diff --git a/app/controllers/users.js b/app/controllers/users.js index a586b0d..0ab9185 100644 --- a/app/controllers/users.js +++ b/app/controllers/users.js @@ -27,7 +27,7 @@ exports.user = function (req, res, next, id) { User .load(query, function (err, user) { if (err) return next(err) - if (!user) return next(new Error(t('user.load.error') + id)) + if (!user) return next(new Error(req.i18n.t('user.load.error') + id)) req.profile = user next() }); @@ -45,18 +45,18 @@ exports.create = function (req, res) { // Checks existence of all fields before sending to mongoose if (!user.name) - preValidationErrors.push(t('user.create.error.missing_name')); + preValidationErrors.push(req.i18n.t('user.create.error.missing_name')); if (!user.email) - preValidationErrors.push(t('user.create.error.email.missing')); + preValidationErrors.push(req.i18n.t('user.create.error.email.missing')); else if (!validator.isEmail(user.email)) - preValidationErrors.push(t('user.create.error.email.invalid')); + preValidationErrors.push(req.i18n.t('user.create.error.email.invalid')); if (!user.password) - preValidationErrors.push(t('user.create.error.password.missing')); + preValidationErrors.push(req.i18n.t('user.create.error.password.missing')); else if (user.password.length < 6) - preValidationErrors.push(t('user.create.error.password.length')); + preValidationErrors.push(req.i18n.t('user.create.error.password.length')); // Avoid e-mail confirmation at development environment // if (process.env.NODE_ENV == 'development') { @@ -67,7 +67,7 @@ exports.create = function (req, res) { return res.json(400, { messages: messages.errorsArray(req.i18n, preValidationErrors) }); } else { user.save(function (err) { - if (err) return res.json(400, { messages: messages.mongooseErrors(req.i18n, err)}); + if (err) return res.json(400, messages.mongooseErrors(req.i18n.t, err, 'user')); // Don't send email if user is active if (!user.needsEmailConfirmation) { @@ -78,9 +78,8 @@ exports.create = function (req, res) { user: user, callbackUrl: req.body.callback_url }, function(err){ - console.log(err); if (err) - return res.json({ messages: messages.mongooseErrors(req.i18n, err)}); + return res.json(messages.mongooseErrors(req.i18n.t, err)); else return res.json(messages.success(req.i18n.t('user.create.success.with_token'))); }) @@ -101,18 +100,18 @@ exports.update = function (req, res) { // User is changing password if (req.body.userPwd) { if (!user.authenticate(req.body.userPwd)) { - return res.json(400, messages.error(t('user.update.password.error.wrong'))); + return res.json(400, messages.error(req.i18n.t('user.update.password.error.wrong'))); } else if (req.body.newPwd.length < 6) { - return res.json(400, messages.error(t('user.update.password.error.length'))); + return res.json(400, messages.error(req.i18n.t('user.update.password.error.length'))); } else { if (req.body.newPwd == req.body.validatePwd){ user.password = req.body.newPwd; user.save(function(err){ if (err) res.json(400, messages.errors(err)); - else res.json(messages.success(t('user.update.password.success'))); + else res.json(messages.success(req.i18n.t('user.update.password.success'))); }); } else { - return res.json(400, messages.error(t('user.update.password.error.dont_match'))); + return res.json(400, messages.error(req.i18n.t('user.update.password.error.dont_match'))); } } @@ -121,28 +120,35 @@ exports.update = function (req, res) { // Check if is a diffent e-mail if (req.body.email == user.email) { - return res.json(400, messages.error(t('user.update.email.error.already_associated'))); + return res.json(400, messages.error(req.i18n.t('user.update.email.error.already_associated'))); } // Check if is valid if (!validator.isEmail(req.body.email)) { - return res.json(400, messages.error(t('user.update.email.error.invalid'))); + return res.json(400, messages.error(req.i18n.t('user.update.email.error.invalid'))); } // Send confirmation, if e-mail is not already used User.findOne({email: req.body.email}, function(err, anotherUser){ if (!req.body.callback_url){ - return res.json(400, messages.error(t('user.update.email.error.missing_callback'))); + return res.json(400, messages.error(req.i18n.t('user.update.email.error.missing_callback'))); } else if (!anotherUser) { - mailer.changeEmail(user, req.body.email, req.body.callback_url, function(err){ + // console.log(req.locale); + mailer.changeEmail({ + mailSender: req.app.mailer, + user: user, + newEmail: req.body.email, + callbackUrl: req.body.callback_url, + t: req.i18n.t + }, function(err){ if (err) { - return res.json(400, messages.error(t('user.update.email.error.mailer'))); + return res.json(400, messages.error(req.i18n.t('user.update.email.error.mailer'))); } else { - return res.json(messages.success(t('user.update.email.success'))); + return res.json(messages.success(req.i18n.t('user.update.email.success'))); } }); } else { - return res.json(400, messages.error(t('user.update.email.error.already_used'))); + return res.json(400, messages.error(req.i18n.t('user.update.email.error.already_used'))); } }) @@ -153,8 +159,8 @@ exports.update = function (req, res) { user.name = req.body.name; user.username = req.body.username; user.save(function(err){ - if (err) res.json(400, messages.errors(err)); - else res.json(messages.success(t('user.update.success'))); + if (err) res.json(400, messages.mongooseErrors(req.i18n.t, err, 'user')); + else res.json(messages.success(req.i18n.t('user.update.success'))); }); } @@ -243,7 +249,7 @@ exports.resetPasswordToken = function (req, res) { }, function(err,user){ if (err) res.render('users/forgot_password', { - title: t('user.reset_pwd.mail.title'), + title: req.i18n.t('user.reset_pwd.mail.title'), message: req.flash('error') }); else { @@ -256,12 +262,12 @@ exports.resetPasswordToken = function (req, res) { if (err) return res.json(messages.errors(err)); else - return res.json(messages.success(t('user.reset_pwd.token.success'))); + return res.json(messages.success(req.i18n.t('user.reset_pwd.token.success'))); }); } else { - req.flash('error', t('user.reset_pwd.form.error.user.not_found')); + req.flash('error', req.i18n.t('user.reset_pwd.form.error.user.not_found')); res.render('users/forgot_password', { - title: t('user.reset_pwd.form.title'), + title: req.i18n.t('user.reset_pwd.form.title'), message: req.flash('error') }); } @@ -289,15 +295,15 @@ exports.migrate = function (req, res) { errors = []; if (!email) { - errors.push(t('user.migrate.form.errors.email.missing')); + errors.push(req.i18n.t('user.migrate.form.errors.email.missing')); } if (!password) { - errors.push(t('user.migrate.form.errors.password.missing')); + errors.push(req.i18n.t('user.migrate.form.errors.password.missing')); } if ((password) && (password.length < 6)) { - errors.push(t('user.migrate.form.errors.password.length')); + errors.push(req.i18n.t('user.migrate.form.errors.password.length')); } if (errors.length > 0) { @@ -314,13 +320,13 @@ exports.migrate = function (req, res) { }); } else if (!user) { res.render('users/migrate', { - errors: [t('user.migrate.form.errors.user.not_found')], + errors: [req.i18n.t('user.migrate.form.errors.user.not_found')], email: email }); } else { mailer.migrateAccount(user, password, function(err){ res.render('users/migrate', { - info: [t('user.migrate.form.success')], + info: [req.i18n.t('user.migrate.form.success')], email: email }); }) diff --git a/app/views/mailer/account/migrate_account.jade b/app/views/mailer/account/migrate_account.jade index e523f43..e2d6e3f 100644 --- a/app/views/mailer/account/migrate_account.jade +++ b/app/views/mailer/account/migrate_account.jade @@ -1,9 +1,6 @@ -p Olá, #{locals.user.name} - -p - | Clique - a(href='#{settings.general.serverUrl}/migrate_account/#{locals.token._id}') aqui - | para migrar sua conta para o novo Mapas Coletivos. +p=locals.t('views.mailer.user.account.migrate.salute', {defaultValue: 'Hi, __username__,', username: locals.user.name}) p - | Bom mapeamento! \ No newline at end of file + a(href='#{settings.general.serverUrl}/migrate_account/#{locals.token._id}')=locals.t('views.mailer.user.account.migrate.link', {defaultValue: 'Proceed to migration'}) + +p=locals.t('views.mailer.user.account.migrate.bye', {defaultValue: 'Happy mapping!'}) \ No newline at end of file diff --git a/app/views/mailer/contributions/inform_contributor_permission.jade b/app/views/mailer/contributions/inform_contributor_permission.jade index 8cd83d1..94e1054 100644 --- a/app/views/mailer/contributions/inform_contributor_permission.jade +++ b/app/views/mailer/contributions/inform_contributor_permission.jade @@ -1,7 +1,7 @@ -p Olá, #{locals.contributor.name} +p=locals.t('views.mailer.contributions.new_contributor.salute', {defaultValue: 'Hi, __username__,', username: locals.contributor.name}) -p O usuário #{locals.creator.name} te adicionou como contribuidor da camada #{locals.layer.title}. +p=locals.t('views.mailer.contributions.new_contributor.intro', {defaultValue: 'Creator __creator__ invited you to contribute to layer __layer__,', creator: locals.creator.name, layer: locals.layer.title}) -p Visite o seu painel de controle para visualizá-la e começar a mapear coletivamente. +p=locals.t('views.mailer.contributions.new_contributor.visit_dashboard', {defaultValue: 'Visit your dashboard to start mapping collaboratively'}) -p Bom mapeamento! \ No newline at end of file +p=locals.t('views.mailer.contributions.new_contributor.bye', {defaultValue: 'Happy mapping!'}) diff --git a/app/views/mailer/email/change.jade b/app/views/mailer/email/change.jade index 752656e..a42649d 100644 --- a/app/views/mailer/email/change.jade +++ b/app/views/mailer/email/change.jade @@ -1,9 +1,8 @@ -p Olá, #{locals.user.name} +p=locals.t('views.mailer.email.change.salute', {username: locals.user.name}) -p Você solicitou alteração de e-mail no Mapas Coletivos. +p=locals.t('views.mailer.email.change.intro') p - a(href='#{settings.general.serverUrl}/email_change/#{locals.token._id}') Clique aqui para passar a utilizar este endereço. + a(href='#{settings.general.serverUrl}/email_change/#{locals.token._id}')=locals.t('views.mailer.email.change.link') -p - | Até logo! \ No newline at end of file +p=locals.t('views.mailer.email.change.bye') \ No newline at end of file diff --git a/app/views/mailer/email/confirm.jade b/app/views/mailer/email/confirm.jade index 0a2055d..85feb13 100644 --- a/app/views/mailer/email/confirm.jade +++ b/app/views/mailer/email/confirm.jade @@ -1,7 +1,6 @@ -p Olá, #{locals.user.name} +p=locals.t('views.mailer.email.confirm.salute', {defaultValue: 'Hi, __username__,', username: locals.user.name}) p - a(href='#{settings.general.serverUrl}/activate_account/#{locals.token._id}') Clique aqui para confirmar o seu e-mail. + a(href='#{settings.general.serverUrl}/activate_account/#{locals.token._id}')=p=locals.t('views.mailer.email.confirm.link', {defaultValue: 'Proceed to e-mail confirmation.'}) -p - | Até logo! \ No newline at end of file +p=locals.t('views.mailer.email.confirm.bye', {defaultValue: 'Bye!'}) \ No newline at end of file diff --git a/app/views/mailer/password/recover.jade b/app/views/mailer/password/recover.jade index 140bd91..e35ecd3 100644 --- a/app/views/mailer/password/recover.jade +++ b/app/views/mailer/password/recover.jade @@ -1,12 +1,12 @@ +p=locals.t('views.mailer.password.recover.salute', {defaultValue: 'Hi, __username__,', username: locals.contributor.name}) + p Olá, #{locals.user.name} -p Foi feita uma solicitação de recuperação de senha para o seu usuário (#{locals.user.email}). +p=locals.t('views.mailer.password.recover.intro', {defaultValue: 'If you asked to change your password, click the link below to proceed:') p - a(href='#{settings.general.serverUrl}/new_password/#{locals.token._id}') Clique aqui se você quiser alterar sua senha agora. + a(href='#{settings.general.serverUrl}/new_password/#{locals.token._id}')=locals.t('views.mailer.password.recover.link', {defaultValue: 'Change password now.') -p - Se você não fez esta solicitação, ignore este e-mail. +p=locals.t('views.mailer.password.recover.ignore', {defaultValue: 'If you did not asked to change your password, ignore this e-mail.') -p - | Obrigado! \ No newline at end of file +p=locals.t('views.mailer.password.recover.thanks', {defaultValue: 'Thank You!.') diff --git a/app/views/mailer/password/set.jade b/app/views/mailer/password/set.jade index a729583..51bcb16 100644 --- a/app/views/mailer/password/set.jade +++ b/app/views/mailer/password/set.jade @@ -1,12 +1,9 @@ -p Olá, #{locals.user.name} +p=locals.t('views.mailer.password.set.salute', {defaultValue: 'Hi, __username__,', username: locals.user.name}) -p Você precisa de uma senha para acessar o Mapas Coletivos com seu email. +p=locals.t('views.mailer.password.set.intro', {defaultValue: 'You need a password to access the mapping platform with your email'}) p - | Clique  - a(href='#{settings.general.serverUrl}/new_password/#{locals.token._id}') aqui - |  para definir sua senha agora. + a(href='#{settings.general.serverUrl}/new_password/#{locals.token._id}')=locals.t('views.mailer.password.set.token', {defaultValue: 'Click here to continue'}) -p - | Obrigado! \ No newline at end of file +p=locals.t('views.mailer.password.set.thanks', {defaultValue: 'Thank you!'}) \ No newline at end of file diff --git a/lib/mailer.js b/lib/mailer.js index 2bb1203..233b257 100644 --- a/lib/mailer.js +++ b/lib/mailer.js @@ -95,27 +95,26 @@ var Mailer = { }); }, - changeEmail: function(user, newEmail, callbackUrl, callback){ + changeEmail: function(options, callback){ var Token = mongoose.model('Token'), token = new Token({ _id: Token.generateId(), type: 'email_change', - user: user, + user: options.user, expiresAt: moment().add('day', 1).toDate(), - callbackUrl: callbackUrl, - data: { email: newEmail} + callbackUrl: options.callbackUrl, + data: { email: options.newEmail} }); token.save(function(err){ if (err) { callback(err); } else { - - - mailSender.send('mailer/email/change', { - subject: 'Confirmação de alteração de email', - to: newEmail, + options.mailSender.send('mailer/email/change', { + subject: options.t('views.mailer.email.change.subject'), + t: options.t, + to: options.newEmail, user: options.user, token: token }, callback); @@ -145,7 +144,8 @@ var Mailer = { } else { var options = _.extend(mailConfig, { - subject: 'Migração de conta', + subject: options.t('views.mailer.user.account.migrate.subject'), + t: options.t, to: user.email, html: file }); @@ -169,8 +169,9 @@ var Mailer = { options.mailSender.send('mailer/contributions/inform_contributor_permission', { - subject: 'Permissão para edição de camada', + subject: options.t('views.mailer.contributions.new_contributor.subject'), to: options.contributor.email, + t: options.t, layer: options.layer, creator: options.creator, contributor: options.contributor @@ -195,7 +196,7 @@ var Mailer = { else { options.mailSender.send('mailer/user/invite', { - subject: 'Você foi convidado a mapear', + subject: options.t('views.mailer.user.invite.subject'), to: options.user.email, user: options.user, t: options.t, diff --git a/lib/messages.js b/lib/messages.js index d6bf913..c5b263f 100644 --- a/lib/messages.js +++ b/lib/messages.js @@ -4,7 +4,7 @@ */ exports.error = function (text) { - return [{ status: 'error', text: text }]; + return {messages: [{ status: 'error', text: text }]}; } /** @@ -12,28 +12,30 @@ exports.error = function (text) { */ exports.success = function (text) { - return [{ status: 'ok', text: text }] + return {messages: [{ status: 'ok', text: text }]}; } /** * Mongoose error messages. */ -exports.mongooseErrors = function(i18n, err) { +exports.mongooseErrors = function(t, err, model) { var errors = err.errors || err, messages = []; var keys = Object.keys(errors) + console.log(err); + // if there is no validation error, just display a generic error if (!keys) { - return [{ status: 'error', text: i18n.t('Database error.')}]; + return {messages: [{ status: 'error', text: t('Database error.')}]}; } else { keys.forEach(function (key) { - messages.push({status: 'error', text: i18n.t(errors[key].message) }) + messages.push({status: 'error', text: t('mongoose.errors.'+ model +'.'+errors[key].message) }) }); - return messages; + return {messages: messages}; } } diff --git a/locales/es-ES/translation.json b/locales/es-ES/translation.json index ba7c38e..e58a045 100644 --- a/locales/es-ES/translation.json +++ b/locales/es-ES/translation.json @@ -332,7 +332,49 @@ } }, "mailer": { + "contributions": { + "new_contributor": { + "bye": "", + "intro": "", + "salute": "", + "visit_dashboard": "" + } + }, + "email": { + "change": { + "bye": "", + "intro": "", + "salute": "" + }, + "confirm": { + "bye": "", + "link": "", + "salute": "" + } + }, + "password": { + "recover": { + "ignore": "", + "intro": "", + "link": "", + "salute": "", + "thanks": "" + }, + "set": { + "intro": "", + "salute": "", + "thanks": "", + "token": "" + } + }, "user": { + "account": { + "migrate": { + "bye": "", + "link": "", + "salute": "" + } + }, "invite": { "intro": "Has sido invitado a mapear.", "link": "Siga el enlace para empiezar.", @@ -349,5 +391,6 @@ "type_a_password": "Debes indicar una contraseña" } } - } + }, + "Path `title` is required": "La capa debe tener un titulo." } \ No newline at end of file diff --git a/locales/es/translation.json b/locales/es/translation.json index ba7c38e..e377fa4 100644 --- a/locales/es/translation.json +++ b/locales/es/translation.json @@ -332,7 +332,49 @@ } }, "mailer": { + "contributions": { + "new_contributor": { + "bye": "", + "intro": "", + "salute": "", + "visit_dashboard": "" + } + }, + "email": { + "change": { + "bye": "", + "intro": "", + "salute": "" + }, + "confirm": { + "bye": "", + "link": "", + "salute": "" + } + }, + "password": { + "recover": { + "ignore": "", + "intro": "", + "link": "", + "salute": "", + "thanks": "" + }, + "set": { + "intro": "", + "salute": "", + "thanks": "", + "token": "" + } + }, "user": { + "account": { + "migrate": { + "bye": "", + "link": "", + "salute": "" + } + }, "invite": { "intro": "Has sido invitado a mapear.", "link": "Siga el enlace para empiezar.", diff --git a/locales/pt-BR/translation.json b/locales/pt-BR/translation.json index e710e9e..4b99f87 100644 --- a/locales/pt-BR/translation.json +++ b/locales/pt-BR/translation.json @@ -91,7 +91,7 @@ "error": { "invalid_id": "Id de contribuidor inválido." }, - "success": "Contribuidor adicionado com sucesso." + "success": "Contribuidor removido com sucesso." } }, "create": { @@ -332,8 +332,53 @@ } }, "mailer": { + "contributions": { + "new_contributor": { + "bye": "", + "intro": "", + "salute": "", + "visit_dashboard": "" + } + }, + "email": { + "change": { + "subject": "Confirmação de alteração de endereço de e-mail", + "bye": "Bom mapeamento!", + "intro": "Você solicitou alteração do seu endereço de e-mail.", + "salute": "Olá, __username__,", + "link": "Clique para proceder com a alteração" + }, + "confirm": { + "bye": "", + "link": "", + "salute": "" + } + }, + "password": { + "recover": { + "ignore": "", + "intro": "", + "link": "", + "salute": "", + "thanks": "" + }, + "set": { + "intro": "", + "salute": "", + "thanks": "", + "token": "" + } + }, "user": { + "account": { + "migrate": { + "bye": "", + "link": "", + "salute": "" + } + }, "invite": { + "subject": "Convite para o mapa", "intro": "Você foi convidado a mapear.", "link": "Clique aqui para começar.", "salute": "Olá, __username__,", diff --git a/locales/pt/translation.json b/locales/pt/translation.json index 56dd615..d450a38 100644 --- a/locales/pt/translation.json +++ b/locales/pt/translation.json @@ -332,7 +332,49 @@ } }, "mailer": { + "contributions": { + "new_contributor": { + "bye": "", + "intro": "", + "salute": "", + "visit_dashboard": "" + } + }, + "email": { + "change": { + "bye": "", + "intro": "", + "salute": "" + }, + "confirm": { + "bye": "", + "link": "", + "salute": "" + } + }, + "password": { + "recover": { + "ignore": "", + "intro": "", + "link": "", + "salute": "", + "thanks": "" + }, + "set": { + "intro": "", + "salute": "", + "thanks": "", + "token": "" + } + }, "user": { + "account": { + "migrate": { + "bye": "", + "link": "", + "salute": "" + } + }, "invite": { "intro": "You were invited to map.", "link": "Click here to start.", @@ -349,5 +391,6 @@ "type_a_password": "views.tokens.accept_invitation.type_a_password" } } - } + }, + "Path `title` is required": "Digite um título para a camada." } \ No newline at end of file From 019ee12cdb0f461290910e5fcf4526ea18c92bc1 Mon Sep 17 00:00:00 2001 From: Vitor George Date: Tue, 13 May 2014 11:13:34 -0300 Subject: [PATCH 09/10] translations to pt-BR and es-ES ready --- app/views/mailer/account/migrate_account.jade | 6 +-- app/views/mailer/email/confirm.jade | 6 +-- app/views/mailer/password/recover.jade | 10 ++-- app/views/mailer/password/set.jade | 6 +-- locales/es-ES/translation.json | 46 ++++++++++--------- locales/pt-BR/translation.json | 38 +++++++-------- 6 files changed, 56 insertions(+), 56 deletions(-) diff --git a/app/views/mailer/account/migrate_account.jade b/app/views/mailer/account/migrate_account.jade index e2d6e3f..e5711e9 100644 --- a/app/views/mailer/account/migrate_account.jade +++ b/app/views/mailer/account/migrate_account.jade @@ -1,6 +1,6 @@ -p=locals.t('views.mailer.user.account.migrate.salute', {defaultValue: 'Hi, __username__,', username: locals.user.name}) +p=locals.t('views.mailer.user.account.migrate.salute', {username: locals.user.name}) p - a(href='#{settings.general.serverUrl}/migrate_account/#{locals.token._id}')=locals.t('views.mailer.user.account.migrate.link', {defaultValue: 'Proceed to migration'}) + a(href='#{settings.general.serverUrl}/migrate_account/#{locals.token._id}')=locals.t('views.mailer.user.account.migrate.link') -p=locals.t('views.mailer.user.account.migrate.bye', {defaultValue: 'Happy mapping!'}) \ No newline at end of file +p=locals.t('views.mailer.user.account.migrate.bye') \ No newline at end of file diff --git a/app/views/mailer/email/confirm.jade b/app/views/mailer/email/confirm.jade index 85feb13..0330456 100644 --- a/app/views/mailer/email/confirm.jade +++ b/app/views/mailer/email/confirm.jade @@ -1,6 +1,6 @@ -p=locals.t('views.mailer.email.confirm.salute', {defaultValue: 'Hi, __username__,', username: locals.user.name}) +p=locals.t('views.mailer.email.confirm.salute', { username: locals.user.name}) p - a(href='#{settings.general.serverUrl}/activate_account/#{locals.token._id}')=p=locals.t('views.mailer.email.confirm.link', {defaultValue: 'Proceed to e-mail confirmation.'}) + a(href='#{settings.general.serverUrl}/activate_account/#{locals.token._id}')=p=locals.t('views.mailer.email.confirm.link') -p=locals.t('views.mailer.email.confirm.bye', {defaultValue: 'Bye!'}) \ No newline at end of file +p=locals.t('views.mailer.email.confirm.bye') \ No newline at end of file diff --git a/app/views/mailer/password/recover.jade b/app/views/mailer/password/recover.jade index e35ecd3..377b2d9 100644 --- a/app/views/mailer/password/recover.jade +++ b/app/views/mailer/password/recover.jade @@ -1,12 +1,10 @@ -p=locals.t('views.mailer.password.recover.salute', {defaultValue: 'Hi, __username__,', username: locals.contributor.name}) +p=locals.t('views.mailer.password.recover.salute', { username: locals.contributor.name}) -p Olá, #{locals.user.name} - -p=locals.t('views.mailer.password.recover.intro', {defaultValue: 'If you asked to change your password, click the link below to proceed:') +p=locals.t('views.mailer.password.recover.intro') p a(href='#{settings.general.serverUrl}/new_password/#{locals.token._id}')=locals.t('views.mailer.password.recover.link', {defaultValue: 'Change password now.') -p=locals.t('views.mailer.password.recover.ignore', {defaultValue: 'If you did not asked to change your password, ignore this e-mail.') +p=locals.t('views.mailer.password.recover.ignore') -p=locals.t('views.mailer.password.recover.thanks', {defaultValue: 'Thank You!.') +p=locals.t('views.mailer.password.recover.thanks') diff --git a/app/views/mailer/password/set.jade b/app/views/mailer/password/set.jade index 51bcb16..7da13a7 100644 --- a/app/views/mailer/password/set.jade +++ b/app/views/mailer/password/set.jade @@ -1,9 +1,9 @@ -p=locals.t('views.mailer.password.set.salute', {defaultValue: 'Hi, __username__,', username: locals.user.name}) +p=locals.t('views.mailer.password.set.salute', {username: locals.user.name}) -p=locals.t('views.mailer.password.set.intro', {defaultValue: 'You need a password to access the mapping platform with your email'}) +p=locals.t('views.mailer.password.set.intro') p - a(href='#{settings.general.serverUrl}/new_password/#{locals.token._id}')=locals.t('views.mailer.password.set.token', {defaultValue: 'Click here to continue'}) + a(href='#{settings.general.serverUrl}/new_password/#{locals.token._id}')=locals.t('views.mailer.password.set.token') p=locals.t('views.mailer.password.set.thanks', {defaultValue: 'Thank you!'}) \ No newline at end of file diff --git a/locales/es-ES/translation.json b/locales/es-ES/translation.json index e58a045..e014313 100644 --- a/locales/es-ES/translation.json +++ b/locales/es-ES/translation.json @@ -334,45 +334,47 @@ "mailer": { "contributions": { "new_contributor": { - "bye": "", - "intro": "", - "salute": "", - "visit_dashboard": "" + "bye": "Hasta luego!", + "intro": "Fuíste invitado por __creator__ a contribuir el la capa __layer.", + "salute": "Hola, __username__,", + "visit_dashboard": "Visite su painel de control para visualizar sus capas." } }, "email": { "change": { - "bye": "", - "intro": "", - "salute": "" + "subject": "Confirmación de cambio de dirección de correo", + "bye": "Hasta luego!", + "intro": "Has solicitado cambio de dirección de correo.", + "salute": "Hola, __username__,", + "link": "Confirmar el cambio." }, "confirm": { - "bye": "", - "link": "", - "salute": "" + "bye": "Hasta luego!", + "link": "Confirmar el cambio.", + "salute": "Hola, __username__," } }, "password": { "recover": { - "ignore": "", - "intro": "", - "link": "", - "salute": "", - "thanks": "" + "ignore": "Si no has solicitado, ignore este correo.", + "intro": "Has solicitado cambio de contraseña.", + "link": "Segui para el cambio de contraseña.", + "salute": "Hola, __username__,", + "thanks": "Hasta luego!" }, "set": { - "intro": "", - "salute": "", - "thanks": "", - "token": "" + "intro": "Necesitas una contraseña para aceder la plataforma.", + "salute": "Hola, __username__,", + "thanks": "Hasta luego!", + "token": "Seguir para el cadastro de contraseña." } }, "user": { "account": { "migrate": { - "bye": "", - "link": "", - "salute": "" + "bye": "Hasta luego!", + "link": "Ir para la migración.", + "salute": "Hola, __username__," } }, "invite": { diff --git a/locales/pt-BR/translation.json b/locales/pt-BR/translation.json index 4b99f87..ec1f14b 100644 --- a/locales/pt-BR/translation.json +++ b/locales/pt-BR/translation.json @@ -334,10 +334,10 @@ "mailer": { "contributions": { "new_contributor": { - "bye": "", - "intro": "", - "salute": "", - "visit_dashboard": "" + "bye": "Bom mapeamento!", + "intro": "Você foi convidado por __creator__ a contribuir na camada __layer.", + "salute": "Olá, __username__,", + "visit_dashboard": "Visite seu painel de controle para visualizar suas camadas." } }, "email": { @@ -349,32 +349,32 @@ "link": "Clique para proceder com a alteração" }, "confirm": { - "bye": "", - "link": "", - "salute": "" + "bye": "Bom mapeamento!", + "link": "Prosseguir com a confirmação de e-mail.", + "salute": "Olá, __username__," } }, "password": { "recover": { - "ignore": "", - "intro": "", - "link": "", - "salute": "", - "thanks": "" + "ignore": "Se você não fez esta solicitação, ignore este e-mail.", + "intro": "Você solicitou alteração de senha.", + "link": "Prosseguir com alteração de senha.", + "salute": "Olá, __username__,", + "thanks": "Bom mapeamento!" }, "set": { - "intro": "", - "salute": "", - "thanks": "", - "token": "" + "intro": "Você precisa de uma senha para acessar a plataforma.", + "salute": "Olá, __username__,", + "thanks": "Bom mapeamento!", + "token": "Clique para continuar." } }, "user": { "account": { "migrate": { - "bye": "", - "link": "", - "salute": "" + "bye": "Bom mapeamento!", + "link": "Ir para migração.", + "salute": "Olá, __username__," } }, "invite": { From 0c86af890f350b42bd3362960100e685af2d9a99 Mon Sep 17 00:00:00 2001 From: Vitor George Date: Tue, 13 May 2014 11:42:17 -0300 Subject: [PATCH 10/10] missing english string at locale files --- locales/en/translation.json | 462 ++++++++++++++++++++++++++++++------ locales/es/translation.json | 49 ++-- locales/pt/translation.json | 84 +++---- 3 files changed, 462 insertions(+), 133 deletions(-) diff --git a/locales/en/translation.json b/locales/en/translation.json index 827d617..a33a72a 100644 --- a/locales/en/translation.json +++ b/locales/en/translation.json @@ -1,74 +1,398 @@ { - "Administrative area": "Administrative area", - "Name": "Name", - "You": "You", - "E-mail": "E-mail", - "Password": "Password", - "Create admin": "Create admin", - "Email": "Email", - "\"Password\"": "\"Password\"", - "Log in": "Log in", - "Settings": "Settings", - "General": "General", - "Mailer": "Mailer", - "Users": "Users", - "Invite new": "Invite new", - "Manage roles": "Manage roles", - "Welcome to admin area": "Welcome to admin area", - "General settings": "General settings", - "Site title": "Site title", - "your site title": "your site title", - "Site description": "Site description", - "a brief site description": "a brief site description", - "Server URL": "Server URL", - "your yby server URL": "your yby server URL", - "Client URL": "Client URL", - "your yby client URL": "your yby client URL", - "Only invited users can register": "Only invited users can register", - "Allow geo files import": "Allow geo files import", - "Update": "Update", - "Allow geo-files import": "Allow geo-files import", - "\"From\" address": "\"From\" address", - "e": { - "g": { - " Notifications ": "e.g. Notifications " - }, - " smtp": { - "yourmailhost": { - "com": "e.g. smtp.yourmailhost.com" - } - } + "access_token": { + "authsocial": { + "error": { + "load_user": "Error loading user.", + "save_user": "Error while saving user." + } + }, + "facebook": { + "error": { + "missing_token": "Missing Facebook authorization token." + } + }, + "google": { + "error": { + "missing_token": "Missing Google authorization token." + } + }, + "local": { + "error": { + "need_password": "Your need a password to acccess your profile. Check your e-mail to continue.", + "needs_activation": "Profile not active, an activation email was sent.", + "send_email": "There was an error while sending a password token to your e-mail." + }, + "needs_migration": "Your account wasn't migrated yet, please visit this page.", + "unauthorized": "Unauthorized." + }, + "logout": { + "error": { + "inexistent_token": "Can't find access token.", + "not_logged": "You are not logged in." + }, + "successful": "Logout successful." + } + }, + "admin": "admin", + "content": { + "destroy": { + "success": "Content removed successfully." + }, + "load": { + "error": { + "not_found": "Content not found." + } + } + }, + "feature": { + "add_content": { + "success": "Content added successfully." + }, + "import": { + "error": { + "disabled": "Geo files import is disabled." + } + }, + "load": { + "error": { + "cant_find": "Can't find feature." + } + }, + "remove_content": { + "success": "Content removed successfully." + } + }, + "image": { + "create": { + "error": { + "not_found": "Image file not found" + } + }, + "destroy": { + "success": "Image removed successfully." + }, + "load": { + "error": { + "not_found": "Image not found." + } + } + }, + "layer": { + "contributor": { + "add": { + "error": { + "already_exists": "User is already layer creator.", + "dont_exists": "Can't find user with this e-mail.", + "email": "Error while sending e-mail to contributor." + }, + "success": "Contributor added successfully." + }, + "remove": { + "error": { + "invalid_id": "Invalid contributor id." + }, + "success": "Contributor removed successfully." + } + }, + "create": { + "missing": "Layer type missing.", + "success": "Layer created successfully." + }, + "destroy": { + "success": "Layer removed successfully." + }, + "load": { + "error": "Error loading layer.", + "not_found": "Layer not found." + }, + "update": { + "success": "Layer updated successfully.", + "tilelayer": { + "error": "Can't update TileLayer" + } + } + }, + "map": { + "destroy": { + "success": "Map removed successfully." + }, + "load": { + "error": { + "not_found": "Map not found." + } + } + }, + "token": { + "accept_invitation": { + "error": { + "invalid_token": "Invalid token.", + "user_activation": "Can't actived this user." + }, + "success": "Profile activated successfully." + }, + "activate_account": { + "error": { + "invalid": "Invalid token.", + "saving": "Error while saving token.", + "user": "Can't activate this user." + }, + "success": "Profile activated successfully, please wait redirection." + }, + "email_change": { + "error": { + "generic": "Error while changing user e-mail." + }, + "success": "E-mail changed successfully." + }, + "error": { + "cant_save": "Can't save token.", + "invalid": "Invalid token." + }, + "load": { + "error": { + "expired": "This token expired.", + "not_found": "Token not found." + } + }, + "migration": { + "error": { + "generic": "Error while migrating account." + }, + "success": "Account migrated successfully." + }, + "new_password": { + "error": { + "generic": "Error while changing password." + }, + "success": "Password changed successfully." + } + }, + "user": { + "create": { + "error": { + "email": { + "invalid": "Invalid e-mail address.", + "missing": "Please type an e-mail address." + }, + "missing_name": "Please enter your name.", + "password": { + "length": "Password should have at least 6 characters.", + "missing": "Please type a password." + } + }, + "success": { + "with_token": "User profile created successfully. An activation link was sent.", + "without_token": "User profile created successfully." + } + }, + "load": { + "error": "Failed to load user with id " + }, + "migrate": { + "form": { + "errors": { + "email": { + "missing": "Please inform an e-mail." + }, + "password": { + "length": "Password should have at least 6 characters.", + "missing": "Please type a password." + }, + "user": { + "not_found": "User not found or migration already done." + } + }, + "success": "A activation was sent to your e-mail." + } + }, + "reset_pwd": { + "form": { + "error": { + "user": { + "not_found": "User not found." + } + }, + "title": "Recover password" + }, + "mail": { + "title": "Recover password" + }, + "token": { + "success": "Password change token sent successfully." + } + }, + "update": { + "email": { + "error": { + "already_associated": "E-mail already associated to account.", + "already_used": "This e-mail address is already used.", + "invalid": "Invalid e-mail address.", + "mailer": "Error while sending e-mail confirmation.", + "missing_callback": "Missing callback." + }, + "success": "An e-mail was sent to confirm address change." + }, + "password": { + "error": { + "dont_match": "Passwords don't match.", + "length": "Password should be at least 6 characters long.", + "wrong": "Wrong password." + }, + "success": "Password changed successfully." + }, + "success": "Profile updated successfully." + } + }, + "views": { + "admin": { + "first_admin": { + "administrative_area": "Administrative Area", + "create_admin": "Create Admin", + "create_first_admin_user": "Create first admin user:", + "email": "E-mail", + "name": "Name", + "password": "Password" + }, + "login": { + "administrative_area": "Administrative Area", + "email": "E-mail", + "login": "Login", + "password": "Password" + }, + "menu": { + "general": "General", + "mailer": "Mailer", + "manage_users": "Manage users", + "settings": "Settings", + "users": { + "invite": "Invites", + "roles": "Roles" + } + }, + "settings": { + "index": { + "allow_geofiles_import": "Allow Geofiles import", + "brazilian_portuguese": "Brazilian Portuguese", + "client_url": "Client URL", + "english": "English", + "general_settings": "General Settings", + "only_invited_can_register": "Only invited can register", + "server_url": "Server URL", + "site_description": "Site Description", + "site_language": "Idioma padrão", + "site_title": "Site Title", + "spanish": "Spanish", + "update": "Update" + }, + "mailer": { + "from_address": "Sender e-mail address", + "mailer_settings": "Mailer Settings", + "password": "SMTP Password", + "smtp_host": "SMTP Host", + "smtp_port": "SMTP Port", + "smtp_user": "SMTP User", + "update": "Update", + "use_ssl": "Use SSL" + } + }, + "users": { + "new": { + "admin": "Admin", + "colaborator": "Colaborator", + "editor": "Editor", + "email": "E-mail", + "invite_a_user": "Invite a user:", + "name": "Name", + "role": "Role", + "send_invitation": "Send invitation" + }, + "roles": { + "admin": "Administrator", + "change": "Change", + "collaborator": "Colaborator", + "editor": "Editor", + "email": "E-mail", + "manage_user_roles": "Manage User Roles", + "name": "Name", + "role": "Role", + "there_are_no_users": "There are no users." + } + } + }, + "includes": { + "header": { + "admin_area_link": "Go to Admin Area", + "login": "Login", + "logout": "Logout" + } + }, + "layouts": { + "admin_area": { + "administration": "Administration" + } + }, + "mailer": { + "contributions": { + "new_contributor": { + "bye": "Bye!", + "intro": "User __creator__ invited you to contribute do layer __layer.", + "salute": "Hi, __username__,", + "visit_dashboard": "Visit dashboard to view your layers." + } + }, + "email": { + "change": { + "subject": "Confirm e-mail address change", + "bye": "Bye!", + "intro": "You have asked to change you e-mail address.", + "salute": "Hi, __username__,", + "link": "Follow this link confirm change." + }, + "confirm": { + "bye": "Bye!", + "link": "Follow this link to confirm.", + "salute": "Hi, __username__," + } + }, + "password": { + "recover": { + "ignore": "If you didn't asked for password recover, please ignore this e-mail.", + "intro": "There was a request for password recover.", + "link": "Follow this link to proceed.", + "salute": "Hi, __username__,", + "thanks": "Bye!" + }, + "set": { + "intro": "You need a password to access.", + "salute": "Hi, __username__,", + "thanks": "Bye!", + "token": "Follow this link to proceed." + } + }, + "user": { + "account": { + "migrate": { + "bye": "Bye!", + "link": "Follow this link to proceed.", + "salute": "Hi, __username__," + } + }, + "invite": { + "subject": "Mapping invitation", + "intro": "You were invited to mapa.", + "link": "Follow this link to proceed.", + "salute": "Hi, __username__,", + "thanks": "Thanks!" } + } }, - "SMTP Host": "SMTP Host", - "SMTP User": "SMTP User", - "username": "username", - "Password (will be stored as plain text)": "Password (will be stored as plain text)", - "Invite a user": "Invite a user", - "Role": "Role", - "Colaborator": "Colaborator", - "Editor": "Editor", - "Administrador": "Administrador", - "Send invitation": "Send invitation", - "Mange user roles": "Mange user roles", - "Permissão": "Permissão", - "collaborator": "collaborator", - "editor": "editor", - "admin": "admin", - "Change": "Change", - "Use SSL": "Use SSL", - "Port": "Port", - "SMTP port": "SMTP port", - "Mailer configuration": "Mailer configuration", - "Administration": "Administration", - "English": "English", - "Brazilian Portuguese": "Brazilian Portuguese", - "Spanish": "Spanish", - "System language": "System language", - "app": { - "english": "English", - "spanish": "Spanish", - "brazilian_portuguese": "Portuguese (BR)" + "tokens": { + "accept_invitation": { + "confirm_signup": "Sign up confirmation", + "define_password": "Define a password:", + "send": "Send", + "type_a_password": "Type a password" + } } + } } \ No newline at end of file diff --git a/locales/es/translation.json b/locales/es/translation.json index e377fa4..e014313 100644 --- a/locales/es/translation.json +++ b/locales/es/translation.json @@ -334,45 +334,47 @@ "mailer": { "contributions": { "new_contributor": { - "bye": "", - "intro": "", - "salute": "", - "visit_dashboard": "" + "bye": "Hasta luego!", + "intro": "Fuíste invitado por __creator__ a contribuir el la capa __layer.", + "salute": "Hola, __username__,", + "visit_dashboard": "Visite su painel de control para visualizar sus capas." } }, "email": { "change": { - "bye": "", - "intro": "", - "salute": "" + "subject": "Confirmación de cambio de dirección de correo", + "bye": "Hasta luego!", + "intro": "Has solicitado cambio de dirección de correo.", + "salute": "Hola, __username__,", + "link": "Confirmar el cambio." }, "confirm": { - "bye": "", - "link": "", - "salute": "" + "bye": "Hasta luego!", + "link": "Confirmar el cambio.", + "salute": "Hola, __username__," } }, "password": { "recover": { - "ignore": "", - "intro": "", - "link": "", - "salute": "", - "thanks": "" + "ignore": "Si no has solicitado, ignore este correo.", + "intro": "Has solicitado cambio de contraseña.", + "link": "Segui para el cambio de contraseña.", + "salute": "Hola, __username__,", + "thanks": "Hasta luego!" }, "set": { - "intro": "", - "salute": "", - "thanks": "", - "token": "" + "intro": "Necesitas una contraseña para aceder la plataforma.", + "salute": "Hola, __username__,", + "thanks": "Hasta luego!", + "token": "Seguir para el cadastro de contraseña." } }, "user": { "account": { "migrate": { - "bye": "", - "link": "", - "salute": "" + "bye": "Hasta luego!", + "link": "Ir para la migración.", + "salute": "Hola, __username__," } }, "invite": { @@ -391,5 +393,6 @@ "type_a_password": "Debes indicar una contraseña" } } - } + }, + "Path `title` is required": "La capa debe tener un titulo." } \ No newline at end of file diff --git a/locales/pt/translation.json b/locales/pt/translation.json index d450a38..ec1f14b 100644 --- a/locales/pt/translation.json +++ b/locales/pt/translation.json @@ -91,7 +91,7 @@ "error": { "invalid_id": "Id de contribuidor inválido." }, - "success": "Contribuidor adicionado com sucesso." + "success": "Contribuidor removido com sucesso." } }, "create": { @@ -272,16 +272,16 @@ "settings": { "index": { "allow_geofiles_import": "Permitir importação de arquivo geo", - "brazilian_portuguese": "", + "brazilian_portuguese": "Português Brasileiro", "client_url": "URL do cliente", - "english": "", + "english": "Inglês", "general_settings": "Configurações gerais", "only_invited_can_register": "Somente convidados podem registrar-se", "server_url": "URL do servidor", - "site_description": "Descricão do site", - "site_language": "", + "site_description": "Descrição do site", + "site_language": "Idioma padrão", "site_title": "Título do site", - "spanish": "", + "spanish": "Espanhol", "update": "Atualizar" }, "mailer": { @@ -307,10 +307,10 @@ "send_invitation": "Enviar convite" }, "roles": { - "admin": "views.admin.users.roles.admin", + "admin": "Administrador", "change": "Alterar", - "collaborator": "views.admin.users.roles.collaborator", - "editor": "views.admin.users.roles.editor", + "collaborator": "Colaborador", + "editor": "Editor", "email": "E-mail", "manage_user_roles": "Gerenciar perfis de usuário", "name": "Nome", @@ -334,63 +334,65 @@ "mailer": { "contributions": { "new_contributor": { - "bye": "", - "intro": "", - "salute": "", - "visit_dashboard": "" + "bye": "Bom mapeamento!", + "intro": "Você foi convidado por __creator__ a contribuir na camada __layer.", + "salute": "Olá, __username__,", + "visit_dashboard": "Visite seu painel de controle para visualizar suas camadas." } }, "email": { "change": { - "bye": "", - "intro": "", - "salute": "" + "subject": "Confirmação de alteração de endereço de e-mail", + "bye": "Bom mapeamento!", + "intro": "Você solicitou alteração do seu endereço de e-mail.", + "salute": "Olá, __username__,", + "link": "Clique para proceder com a alteração" }, "confirm": { - "bye": "", - "link": "", - "salute": "" + "bye": "Bom mapeamento!", + "link": "Prosseguir com a confirmação de e-mail.", + "salute": "Olá, __username__," } }, "password": { "recover": { - "ignore": "", - "intro": "", - "link": "", - "salute": "", - "thanks": "" + "ignore": "Se você não fez esta solicitação, ignore este e-mail.", + "intro": "Você solicitou alteração de senha.", + "link": "Prosseguir com alteração de senha.", + "salute": "Olá, __username__,", + "thanks": "Bom mapeamento!" }, "set": { - "intro": "", - "salute": "", - "thanks": "", - "token": "" + "intro": "Você precisa de uma senha para acessar a plataforma.", + "salute": "Olá, __username__,", + "thanks": "Bom mapeamento!", + "token": "Clique para continuar." } }, "user": { "account": { "migrate": { - "bye": "", - "link": "", - "salute": "" + "bye": "Bom mapeamento!", + "link": "Ir para migração.", + "salute": "Olá, __username__," } }, "invite": { - "intro": "You were invited to map.", - "link": "Click here to start.", - "salute": "Hi, __username__,", - "thanks": "Thank you!" + "subject": "Convite para o mapa", + "intro": "Você foi convidado a mapear.", + "link": "Clique aqui para começar.", + "salute": "Olá, __username__,", + "thanks": "Obrigado!" } } }, "tokens": { "accept_invitation": { - "confirm_signup": "", - "define_password": "views.tokens.accept_invitation.define_password", - "send": "", - "type_a_password": "views.tokens.accept_invitation.type_a_password" + "confirm_signup": "Confirme sua inscrição", + "define_password": "Defina uma senha:", + "send": "Enviar", + "type_a_password": "Digite uma senha" } } - }, - "Path `title` is required": "Digite um título para a camada." + } } \ No newline at end of file