added client side validation for email, username and password inputs

This commit is contained in:
David Baldwynn 2017-10-27 23:23:50 -07:00
parent 82d60c5a42
commit 34b2cba461
38 changed files with 2457 additions and 447 deletions

View File

@ -121,6 +121,12 @@ exports.signup = function(req, res) {
// Add missing user fields
user.provider = 'local';
if(req.body.password.length < 4){
return res.status(400).send({
message: 'Password must be at least 4 characters long'
});
}
// Then save the temporary user
nev.createTempUser(user, function (err, existingPersistentUser, newTempUser) {
@ -161,6 +167,13 @@ exports.signup = function(req, res) {
* Signin after passport authentication
*/
exports.signin = function(req, res, next) {
console.log(req.body);
if(req.body.password.length < 4){
return res.status(400).send({
message: 'Password must be at least 4 characters long'
});
}
passport.authenticate('local', function(err, user, info) {
if (err || !user) {
res.status(400).send(info);
@ -188,7 +201,9 @@ exports.signin = function(req, res, next) {
* Signout
*/
exports.signout = function(req, res) {
res.destroyCookie('langCookie');
if(req.cookies.hasOwnProperty('userLang')){
res.destroyCookie('userLang');
}
req.logout();
return res.status(200).send('You have successfully logged out.');
};

View File

@ -11,7 +11,8 @@ var _ = require('lodash'),
config = require('../../../config/config'),
nodemailer = require('nodemailer'),
async = require('async'),
crypto = require('crypto');
crypto = require('crypto'),
pug = require('pug');
var smtpTransport = nodemailer.createTransport(config.mailer.options);
@ -32,7 +33,7 @@ exports.forgot = function(req, res) {
if (req.body.username) {
User.findOne({
$or: [
{'username': req.body.username},
{'username': req.body.username.toLowerCase()},
{'email': req.body.username}
]
}, '-salt -password', function(err, user) {
@ -45,7 +46,7 @@ exports.forgot = function(req, res) {
var tempUserModel = mongoose.model(config.tempUserCollection);
tempUserModel.findOne({
$or: [
{'username': req.body.username},
{'username': req.body.username.toLowerCase()},
{'email': req.body.username}
]
}).lean().exec(function(err, user) {
@ -80,13 +81,12 @@ exports.forgot = function(req, res) {
}
},
function(token, user, done) {
res.render('templates/reset-password-email', {
name: user.displayName || 'TellForm User',
appName: config.app.title,
url: 'http://' + req.headers.host + '/auth/reset/' + token
}, function(err, emailHTML) {
done(err, emailHTML, user);
});
const fn = pug.compileFile(__dirname + "/../../views/templates/reset-password-email.server.view.pug");
res.locals['url'] = 'http://' + req.headers.host + '/auth/reset/' + token;
console.log(res.locals);
var renderedHtml = fn(res.locals);
done(null, renderedHtml, user);
},
// If valid email, send reset email using service
function(emailHTML, user, done) {
@ -153,10 +153,21 @@ exports.validateResetToken = function(req, res) {
* Reset password POST from email token
*/
exports.reset = function(req, res, next) {
if(req.body.newPassword.length < 4){
return res.status(400).send({
message: 'Password must be at least 4 characters long'
});
}
if(req.body.newPassword !== req.body.verifyPassword){
return res.status(400).send({
message: 'Passwords do not match'
});
}
// Init Variables
var passwordDetails = req.body;
async.waterfall([
function(done) {
User.findOne({
resetPasswordToken: req.params.token,
@ -165,32 +176,25 @@ exports.reset = function(req, res, next) {
}
}, function(err, user) {
if (!err && user) {
if (passwordDetails.newPassword === passwordDetails.verifyPassword) {
user.password = passwordDetails.newPassword;
user.resetPasswordToken = null;
user.resetPasswordExpires = null;
user.password = passwordDetails.newPassword;
user.resetPasswordToken = null;
user.resetPasswordExpires = null;
user.save(function(err) {
if (err) {
done(err, null);
}
done(null, user);
});
} else {
done('Passwords do not match', null);
}
user.save(function(err, savedUser) {
if (err) {
done(err, null);
}
done(null, savedUser);
});
} else {
done('Password reset token is invalid or has expired.', null);
}
});
},
function(user, done) {
res.render('templates/reset-password-confirm-email', {
name: user.displayName,
appName: config.app.title
}, function(err, emailHTML) {
done(err, emailHTML, user);
});
const fn = pug.compileFile(__dirname + "/../../views/templates/reset-password-confirm-email.server.view.pug");
var renderedHtml = fn(res.locals);
done(null, renderedHtml, user);
},
// If valid email, send reset email using service
function(emailHTML, user, done) {

View File

@ -69,6 +69,7 @@ var UserSchema = new Schema({
email: {
type: String,
trim: true,
lowercase: true,
unique: 'Account already exists with this email',
match: [/.+\@.+\..+/, 'Please fill a valid email address'],
required: [true, 'Email is required']
@ -77,7 +78,7 @@ var UserSchema = new Schema({
type: String,
unique: true,
lowercase: true,
match: [/^[a-zA-Z0-9\.\-\_]+$/, 'Username can only contain alphanumeric characters and \'_\', \'-\' and \'.\''],
match: [/^[a-zA-Z0-9\-]+$/, 'Username can only contain alphanumeric characters and \'-\''],
required: [true, 'Username is required']
},
passwordHash: {

View File

@ -30,7 +30,7 @@
<p>Hello there!</p>
<p>This is a courtesy message to confirm that your password was just changed.</p>
<p>Thanks so much for using our services! If you have any questions, or suggestions, please feel free to email us here at&nbsp;<a href="mailto:team@tellform.com">team@tellform.com</a>.</p>
<p> - The {{appName}} team</p>
<p> - The #{appName} team</p>
</td>
<td width="36"></td>
</tr>

View File

@ -0,0 +1,41 @@
doctype html
html
head
body(style='padding: 0; width: 100% !important; -webkit-text-size-adjust: 100%; margin: 0; -ms-text-size-adjust: 100%', marginheight='0', marginwidth='0')
center
table(cellpadding='8', cellspacing='0', style='*width: 540px; padding: 0; width: 100% !important; background: #ffffff; margin: 0; background-color: #ffffff', border='0')
tbody
tr
td(valign='top')
table(cellpadding='0', cellspacing='0', style='border-radius: 6px; -webkit-border-radius: 6px; border: 1px #c0c0c0 solid; -moz-border-radius: 6px', border='0', align='center')
tbody
tr
td(colspan='3', height='6')
tr
td
table(cellpadding='0', cellspacing='0', style='line-height: 25px', border='0', align='center')
tbody
tr
td(colspan='3', height='30')
tr
td(width='36')
td(width='454', align='left', style="color: #444444; border-collapse: collapse; font-size: 11pt; font-family: 'Open Sans', 'Lucida Grande', 'Segoe UI', Arial, Verdana, 'Lucida Sans Unicode', Tahoma, 'Sans Serif'; max-width: 454px", valign='top')
p=__('EMAIL_GREETING')
p=__('RESET_PASSWORD_CONFIRMATION_EMAIL_BODY_1')
p=__("VERIFICATION_EMAIL_PARAGRAPH_2")
a(href='mailto:team@tellform.com') team@tellform.com
p=__('EMAIL_SIGNATURE')
td(width='36')
tr
td(colspan='3', height='36')
table(cellpadding='0', cellspacing='0', align='center', border='0')
tbody
tr
td(height='10')
tr
td(style='padding: 0; border-collapse: collapse')
table(cellpadding='0', cellspacing='0', align='center', border='0')
tbody
tr(style="color: #c0c0c0; font-size: 11px; font-family: 'Open Sans', 'Lucida Grande', 'Segoe UI', Arial, Verdana, 'Lucida Sans Unicode', Tahoma, 'Sans Serif'; -webkit-text-size-adjust: none")
td(width='400', align='left')
td(width='128', align='right') © TellForm 2017

View File

@ -0,0 +1,44 @@
doctype html
html
head
body(style='padding: 0; width: 100% !important; -webkit-text-size-adjust: 100%; margin: 0; -ms-text-size-adjust: 100%', marginheight='0', marginwidth='0')
center
table(cellpadding='8', cellspacing='0', style='*width: 540px; padding: 0; width: 100% !important; background: #ffffff; margin: 0; background-color: #ffffff', border='0')
tbody
tr
td(valign='top')
table(cellpadding='0', cellspacing='0', style='border-radius: 6px; -webkit-border-radius: 6px; border: 1px #c0c0c0 solid; -moz-border-radius: 6px', border='0', align='center')
tbody
tr
td(colspan='3', height='6')
tr
td
table(cellpadding='0', cellspacing='0', style='line-height: 25px', border='0', align='center')
tbody
tr
td(colspan='3', height='30')
tr
td(width='36')
td(width='454', align='left', style="color: #444444; border-collapse: collapse; font-size: 11pt; font-family: 'Open Sans', 'Lucida Grande', 'Segoe UI', Arial, Verdana, 'Lucida Sans Unicode', Tahoma, 'Sans Serif'; max-width: 454px", valign='top')
p=__('EMAIL_GREETING')
p=__('RESET_PASSWORD_REQUEST_EMAIL_PARAGRAPH_1')
p
a(href=url)=__('RESET_PASSWORD_REQUEST_EMAIL_LINK_TEXT')
p=__('RESET_PASSWORD_REQUEST_EMAIL_PARAGRAPH_2')
p=__('VERIFICATION_EMAIL_PARAGRAPH_2')
a(href='mailto:team@tellform.com') team@tellform.com
p=__('EMAIL_SIGNATURE')
td(width='36')
tr
td(colspan='3', height='36')
table(cellpadding='0', cellspacing='0', align='center', border='0')
tbody
tr
td(height='10')
tr
td(style='padding: 0; border-collapse: collapse')
table(cellpadding='0', cellspacing='0', align='center', border='0')
tbody
tr(style="color: #c0c0c0; font-size: 11px; font-family: 'Open Sans', 'Lucida Grande', 'Segoe UI', Arial, Verdana, 'Lucida Sans Unicode', Tahoma, 'Sans Serif'; -webkit-text-size-adjust: none")
td(width='400', align='left')
td(width='128', align='right') © TellForm 2017

View File

@ -28,7 +28,7 @@ html
p=__('EMAIL_GREETING')
p=__('VERIFICATION_EMAIL_PARAGRAPH_1')
p
a(href='https://${URL}')=__('VERIFICATION_EMAIL_LINK_TEXT')
a(href='http://${URL}')=__('VERIFICATION_EMAIL_LINK_TEXT')
p=__('VERIFICATION_EMAIL_PARAGRAPH_2')
a(href='mailto:team@tellform.com')
| team@tellform.com

View File

@ -13,5 +13,9 @@
"WELCOME_EMAIL_PARAGRAPH_1": "Wir möchten Sie als unser neustes Mitglied begrüßen!",
"WELCOME_EMAIL_PARAGRAPH_2": "Wir wünschen Ihnen viel Spaß mit TellForm! Wenn Sie Probleme haben, senden Sie uns bitte eine E-Mail an",
"WELCOME_EMAIL_SUBJECT": "Willkommen bei %s!",
"WELCOME_EMAIL_TEXT": "Ihr Konto wurde erfolgreich verifiziert."
"WELCOME_EMAIL_TEXT": "Ihr Konto wurde erfolgreich verifiziert.",
"RESET_PASSWORD_CONFIRMATION_EMAIL_PARAGRAPH_1": "Dies ist eine Höflichkeitsnachricht, um zu bestätigen, dass Ihr Passwort gerade geändert wurde.",
"RESET_PASSWORD_REQUEST_EMAIL_PARAGRAPH_1": "Hier ist ein spezieller Link, mit dem Sie Ihr Passwort zurücksetzen können: Bitte beachten Sie, dass es innerhalb einer Stunde zu Ihrem Schutz abläuft:",
"RESET_PASSWORD_REQUEST_EMAIL_LINK_TEXT": "Passwort zurücksetzen",
"RESET_PASSWORD_REQUEST_EMAIL_PARAGRAPH_2": "Falls Sie dies nicht gewünscht haben, ignorieren Sie bitte diese E-Mail und Ihr Passwort bleibt unverändert."
}

View File

@ -13,5 +13,10 @@
"WELCOME_EMAIL_PARAGRAPH_1": "We would like to welcome you as our newest member!",
"WELCOME_EMAIL_PARAGRAPH_2": "We hope you enjoy using TellForm! If you have any trouble please feel free to email us here at",
"WELCOME_EMAIL_SUBJECT": "Welcome to %s!",
"WELCOME_EMAIL_TEXT": "Your account has been successfully verified."
"WELCOME_EMAIL_TEXT": "Your account has been successfully verified.",
"RESET_PASSWORD_CONFIRMATION_EMAIL_PARAGRAPH_1": "This is a courtesy message to confirm that your password was just changed.",
"RESET_PASSWORD_REQUEST_EMAIL_PARAGRAPH_1": "Here is a special link that will allow you to reset your password. Please note it will expire in one hour for your protection:",
"RESET_PASSWORD_REQUEST_EMAIL_LINK_TEXT": "Reset Your Password",
"RESET_PASSWORD_REQUEST_EMAIL_PARAGRAPH_2": "If you did not request this, please ignore this email and your password will remain unchanged.",
"RESET_PASSWORD_CONFIRMATION_EMAIL_BODY_1": "RESET_PASSWORD_CONFIRMATION_EMAIL_BODY_1"
}

View File

@ -13,5 +13,9 @@
"WELCOME_EMAIL_PARAGRAPH_1": "¡Nos gustaría darle la bienvenida como nuestro miembro más nuevo!",
"WELCOME_EMAIL_PARAGRAPH_2": "Esperamos que disfrute utilizando TellForm. Si tiene algún problema, no dude en enviarnos un correo electrónico aquí",
"WELCOME_EMAIL_SUBJECT": "¡Bienvenido a %s!",
"WELCOME_EMAIL_TEXT": "Su cuenta ha sido verificada con éxito"
"WELCOME_EMAIL_TEXT": "Su cuenta ha sido verificada con éxito",
"RESET_PASSWORD_CONFIRMATION_EMAIL_PARAGRAPH_1": "Este es un mensaje de cortesía para confirmar que su contraseña acaba de cambiarse",
"RESET_PASSWORD_REQUEST_EMAIL_PARAGRAPH_1": "Aquí hay un enlace especial que le permitirá restablecer su contraseña. Tenga en cuenta que caducará en una hora para su protección:",
"RESET_PASSWORD_REQUEST_EMAIL_LINK_TEXT": "Restablecer su contraseña",
"RESET_PASSWORD_REQUEST_EMAIL_PARAGRAPH_2": "Si no lo solicitó, ignore este correo electrónico y su contraseña no cambiará".
}

View File

@ -13,5 +13,9 @@
"WELCOME_EMAIL_PARAGRAPH_1": "Nous aimerions vous accueillir en tant que nouveau membre!",
"WELCOME_EMAIL_PARAGRAPH_2": "Nous espérons que vous apprécierez l'utilisation de TellForm! Si vous avez des problèmes, n'hésitez pas à nous envoyer un e-mail ici",
"WELCOME_EMAIL_SUBJECT": "Bienvenue dans %s!",
"WELCOME_EMAIL_TEXT": "Votre compte a été vérifié avec succès."
"WELCOME_EMAIL_TEXT": "Votre compte a été vérifié avec succès.",
"RESET_PASSWORD_CONFIRMATION_EMAIL_PARAGRAPH_1": "Ceci est un message de courtoisie pour confirmer que votre mot de passe a été modifié.",
"RESET_PASSWORD_REQUEST_EMAIL_PARAGRAPH_1": "Voici un lien spécial qui vous permettra de réinitialiser votre mot de passe Veuillez noter qu'il expirera dans une heure pour votre protection:",
"RESET_PASSWORD_REQUEST_EMAIL_LINK_TEXT": "Réinitialiser votre mot de passe",
"RESET_PASSWORD_REQUEST_EMAIL_PARAGRAPH_2": "Si vous ne l'avez pas demandé, veuillez ignorer cet e-mail et votre mot de passe restera inchangé."
}

View File

@ -13,5 +13,9 @@
"WELCOME_EMAIL_PARAGRAPH_1": "Vorremmo darVi il benvenuto come il nostro nuovo membro!",
"WELCOME_EMAIL_PARAGRAPH_2": "Speriamo che ti piace usare TellForm! Se hai problemi, non esitate a contattarci via",
"WELCOME_EMAIL_SUBJECT": "Benvenuto a %s!",
"WELCOME_EMAIL_TEXT": "Il tuo account è stato verificato correttamente."
"WELCOME_EMAIL_TEXT": "Il tuo account è stato verificato correttamente.",
"RESET_PASSWORD_CONFIRMATION_EMAIL_PARAGRAPH_1": "Si tratta di un messaggio di cortesia per confermare che la password è stata appena modificata".
"RESET_PASSWORD_REQUEST_EMAIL_PARAGRAPH_1": "Ecco un collegamento speciale che ti permetterà di reimpostare la tua password. Si prega di notare che scadrà in un'ora per la protezione:",
"RESET_PASSWORD_REQUEST_EMAIL_LINK_TEXT": "Ripristina la tua password",
"RESET_PASSWORD_REQUEST_EMAIL_PARAGRAPH_2": "Se non l'hai richiesta, ignora questa email e la tua password rimane invariata."
}

View File

@ -14,9 +14,11 @@ module.exports = function () {
passwordField: 'password'
},
function (username, password, done) {
console.log('\n\n\n\n\nusername: '+username);
console.log('password: '+password)
User.findOne({
$or: [
{'username': username},
{'username': username.toLowerCase()},
{'email': username}
]
}, function (err, user) {

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -2,7 +2,7 @@
angular.module('core').config(['$translateProvider', function ($translateProvider) {
$translateProvider.translations('de', {
$translateProvider.translations('it', {
MENU: 'MENÜ',
SIGNUP_TAB: 'Vi Phrasal',
SIGNIN_TAB: 'Accedi',

View File

@ -8,12 +8,12 @@ angular.module('forms').config(['$translateProvider', function ($translateProvid
ADVANCED_SETTINGS: 'Advanced Settings',
FORM_NAME: 'Form Name',
FORM_STATUS: 'Form Status',
PUBLIC: 'Public',
PRIVATE: 'Private',
PUBLIC_1: 'Public',
PRIVATE_1: 'Private',
GA_TRACKING_CODE: 'Google Analytics Tracking Code',
DISPLAY_FOOTER: 'Display Form Footer?',
SAVE_CHANGES: 'Save Changes',
CANCEL: 'Cancel',
CANCEL_1: 'Cancel',
DISPLAY_START_PAGE: 'Display Start Page?',
DISPLAY_END_PAGE: 'Display Custom End Page?',
@ -22,15 +22,15 @@ angular.module('forms').config(['$translateProvider', function ($translateProvid
CREATE_FORM: 'Create form',
CREATED_ON: 'Created on',
MY_FORMS: 'My forms',
NAME: 'Name',
NAME_1: 'Name',
LANGUAGE: 'Language',
FORM_PAUSED: 'Form paused',
//Edit Field Modal
EDIT_FIELD: 'Edit this Field',
SAVE_FIELD: 'Save',
ON: 'ON',
OFF: 'OFF',
ON_1: 'ON',
OFF_1: 'OFF',
REQUIRED_FIELD: 'Required',
LOGIC_JUMP: 'Logic Jump',
SHOW_BUTTONS: 'Additional Buttons',
@ -45,21 +45,21 @@ angular.module('forms').config(['$translateProvider', function ($translateProvid
I_UNDERSTAND: 'I understand the consequences, delete this form.',
DELETE_FORM_SM: 'Delete',
DELETE_FORM_MD: 'Delete Form',
DELETE: 'Delete',
FORM: 'Form',
VIEW: 'View',
LIVE: 'Live',
PREVIEW: 'Preview',
COPY: 'Copy',
DELETE_1: 'Delete',
FORM_1: 'Form',
VIEW_1: 'View',
LIVE_1: 'Live',
PREVIEW_1: 'Preview',
COPY_1: 'Copy',
COPY_AND_PASTE: 'Copy and Paste this to add your TellForm to your website',
CHANGE_WIDTH_AND_HEIGHT: 'Change the width and height values to suit you best',
POWERED_BY: 'Powered by',
TELLFORM_URL: 'Your TellForm is permanently at this URL',
//Edit Form View
DISABLED: 'Disabled',
YES: 'YES',
NO: 'NO',
DISABLED_1: 'Disabled',
YES_1: 'YES',
NO_1: 'NO',
ADD_LOGIC_JUMP: 'Add Logic Jump',
ADD_FIELD_LG: 'Click to Add New Field',
ADD_FIELD_MD: 'Add New Field',
@ -71,7 +71,7 @@ angular.module('forms').config(['$translateProvider', function ($translateProvid
INTRO_TITLE: 'Title',
INTRO_PARAGRAPH: 'Paragraph',
INTRO_BTN: 'Start Button',
TITLE: 'Title',
TITLE_1: 'Title',
PARAGRAPH: 'Paragraph',
BTN_TEXT: 'Go Back Button',
BUTTONS: 'Buttons',
@ -81,7 +81,7 @@ angular.module('forms').config(['$translateProvider', function ($translateProvid
PREVIEW_FIELD: 'Preview Question',
QUESTION_TITLE: 'Title',
QUESTION_DESCRIPTION: 'Description',
OPTIONS: 'Options',
OPTIONS_1: 'Options',
ADD_OPTION: 'Add Option',
NUM_OF_STEPS: 'Number of Steps',
CLICK_FIELDS_FOOTER: 'Click on fields to add them here',
@ -93,7 +93,7 @@ angular.module('forms').config(['$translateProvider', function ($translateProvid
IS_GREATER_OR_EQUAL_THAN: 'is greater or equal than',
IS_SMALLER_THAN: 'is_smaller_than',
IS_SMALLER_OR_EQUAL_THAN: 'is smaller or equal than',
CONTAINS: 'contains',
CONTAINS_1: 'contains',
DOES_NOT_CONTAINS: 'does not contain',
ENDS_WITH: 'ends with',
DOES_NOT_END_WITH: 'does not end with',
@ -103,14 +103,14 @@ angular.module('forms').config(['$translateProvider', function ($translateProvid
//Edit Submissions View
TOTAL_VIEWS: 'total unique visits',
RESPONSES: 'responses',
RESPONSES_1: 'responses',
COMPLETION_RATE: 'completion rate',
AVERAGE_TIME_TO_COMPLETE: 'avg. completion time',
DESKTOP_AND_LAPTOP: 'Desktops',
TABLETS: 'Tablets',
PHONES: 'Phones',
OTHER: 'Other',
TABLETS_1: 'Tablets',
PHONES_1: 'Phones',
OTHER_1: 'Other',
UNIQUE_VISITS: 'Unique Visits',
FIELD_TITLE: 'Field Title',
@ -123,11 +123,10 @@ angular.module('forms').config(['$translateProvider', function ($translateProvid
EXPORT_TO_JSON: 'Export to JSON',
PERCENTAGE_COMPLETE: 'Percentage Complete',
TIME_ELAPSED: 'Time Elapsed',
DEVICE: 'Device',
LOCATION: 'Location',
DEVICE_1: 'Device',
LOCATION_1: 'Location',
IP_ADDRESS: 'IP Address',
DATE_SUBMITTED: 'Date Submitted',
GENERATED_PDF: 'Generated PDF',
//Design View
BACKGROUND_COLOR: 'Background Color',
@ -150,42 +149,42 @@ angular.module('forms').config(['$translateProvider', function ($translateProvid
//Field Types
SHORT_TEXT: 'Short Text',
EMAIL: 'Email',
EMAIL_1: 'Email',
MULTIPLE_CHOICE: 'Multiple Choice',
DROPDOWN: 'Dropdown',
DATE: 'Date',
DROPDOWN_1: 'Dropdown',
DATE_1: 'Date',
PARAGRAPH_T: 'Paragraph',
YES_NO: 'Yes/No',
LEGAL: 'Legal',
RATING: 'Rating',
NUMBERS: 'Numbers',
SIGNATURE: 'Signature',
LEGAL_1: 'Legal',
RATING_1: 'Rating',
NUMBERS_1: 'Numbers',
SIGNATURE_1: 'Signature',
FILE_UPLOAD: 'File upload',
OPTION_SCALE: 'Option Scale',
PAYMENT: 'Payment',
STATEMENT: 'Statement',
LINK: 'Link',
PAYMENT_1: 'Payment',
STATEMENT_1: 'Statement',
LINK_1: 'Link',
//Form Preview
FORM_SUCCESS: 'Form entry successfully submitted!',
REVIEW: 'Review',
REVIEW_1: 'Review',
BACK_TO_FORM: 'Go back to Form',
EDIT_FORM: 'Edit this TellForm',
ADVANCEMENT: '{{done}} out of {{total}} answered',
ADVANCEMENT_1: '{{done}} out of {{total}} answered',
CONTINUE_FORM: 'Continue to Form',
REQUIRED: 'required',
REQUIRED_1: 'required',
COMPLETING_NEEDED: '{{answers_not_completed}} answer(s) need completing',
OPTIONAL: 'optional',
OPTIONAL_1: 'optional',
ERROR_EMAIL_INVALID: 'Please enter a valid email address',
ERROR_NOT_A_NUMBER: 'Please enter valid numbers only',
ERROR_URL_INVALID: 'Please a valid url',
OK: 'OK',
ENTER: 'press ENTER',
NEWLINE: 'press SHIFT+ENTER to create a newline',
CONTINUE: 'Continue',
OK_1: 'OK',
ENTER_1: 'press ENTER',
NEWLINE_1: 'press SHIFT+ENTER to create a newline',
CONTINUE_1: 'Continue',
LEGAL_ACCEPT: 'I accept',
LEGAL_NO_ACCEPT: 'I dont accept',
SUBMIT: 'Submit',
SUBMIT_1: 'Submit',
UPLOAD_FILE: 'Upload your File'
});
}]);

View File

@ -2,34 +2,188 @@
angular.module('forms').config(['$translateProvider', function ($translateProvider) {
$translateProvider.translations('fr', {
FORM_SUCCESS: 'Votre formulaire a été enregistré!',
REVIEW: 'Incomplet',
BACK_TO_FORM: 'Retourner au formulaire',
EDIT_FORM: 'Éditer le Tellform',
CREATE_FORM: 'Créer un TellForm',
ADVANCEMENT: '{{done}} complétés sur {{total}}',
CONTINUE_FORM: 'Aller au formulaire',
REQUIRED: 'obligatoire',
COMPLETING_NEEDED: '{{answers_not_completed}} réponse(s) doive(nt) être complétée(s)',
OPTIONAL: 'facultatif',
ERROR_EMAIL_INVALID: 'Merci de rentrer une adresse mail valide',
ERROR_NOT_A_NUMBER: 'Merce de ne rentrer que des nombres',
ERROR_URL_INVALID: 'Merci de rentrer une url valide',
OK: 'OK',
ENTER: 'presser ENTRÉE',
YES: 'Oui',
NO: 'Non',
NEWLINE: 'presser SHIFT+ENTER pour créer une nouvelle ligne',
CONTINUE: 'Continuer',
LEGAL_ACCEPT: 'Jaccepte',
LEGAL_NO_ACCEPT: 'Je naccepte pas',
DELETE: 'Supprimer',
CANCEL: 'Réinitialiser',
SUBMIT: 'Enregistrer',
UPLOAD_FILE: 'Envoyer un fichier',
Y: 'O',
N: 'N',
});
$translateProvider.translations('fr', {
// Configurer la vue de l'onglet Formulaire
ADVANCED_SETTINGS: 'Paramètres avancés',
FORM_NAME: "Nom du formulaire",
FORM_STATUS: 'Statut du formulaire',
PUBLIC_1: 'Public',
PRIVATE_1: "Privé",
GA_TRACKING_CODE: "Code de suivi Google Analytics",
DISPLAY_FOOTER: "Afficher le pied de formulaire?",
SAVE_CHANGES: 'Enregistrer les modifications',
CANCEL_1: 'Annuler',
DISPLAY_START_PAGE: "Afficher la page de démarrage?",
DISPLAY_END_PAGE: "Afficher la page de fin personnalisée?",
// Afficher les formulaires
CREATE_A_NEW_FORM: "Créer un nouveau formulaire",
CREATE_FORM: "Créer un formulaire",
CREATED_ON: 'Créé le',
MY_FORMS: 'Mes formes',
NAME_1: "Nom",
LANGUE: 'Langue',
FORM_PAUSED: 'Formulaire en pause',
// Modifier le modal de champ
EDIT_FIELD: "Modifier ce champ",
SAVE_FIELD: 'Enregistrer',
ON_1: 'ON',
OFF_1: "OFF",
REQUIRED_FIELD: "Obligatoire",
LOGIC_JUMP: 'Saut logique',
SHOW_BUTTONS: 'Boutons supplémentaires',
SAVE_START_PAGE: "Enregistrer",
// Affichage du formulaire d'administration
ARE_YOU_SURE: 'Es-tu ABSOLUMENT sûr?',
READ_WARNING: "De mauvaises choses inattendues se produiront si vous ne lisez pas ceci!",
DELETE_WARNING1: 'Cette action NE PEUT PAS être annulée. Cela supprimera définitivement le "',
DELETE_WARNING2: '" forme et supprime toutes les soumissions de formulaire associées. ',
DELETE_CONFIRM: "Veuillez taper le nom du formulaire pour confirmer.",
I_UNDERSTAND: 'Je comprends les conséquences, efface ce formulaire.',
DELETE_FORM_SM: 'Supprimer',
DELETE_FORM_MD: "Supprimer le formulaire",
DELETE_1: "Supprimer",
FORM_1: 'Formulaire',
VIEW_1: "Afficher",
LIVE_1: "Live",
PREVIEW_1: 'Aperçu',
COPY_1: "Copier",
COPY_AND_PASTE: "Copiez et collez ceci pour ajouter votre TellForm à votre site Web",
CHANGE_WIDTH_AND_HEIGHT: "Changez les valeurs de largeur et de hauteur pour mieux vous convenir",
POWERED_BY: "Alimenté par",
TELLFORM_URL: "Votre TellForm est en permanence sur cette URL",
// Modifier la vue de formulaire
DISABLED_1: "Désactivé",
OUI_1: 'OUI',
NO_1: 'NON',
ADD_LOGIC_JUMP: 'Ajouter un saut de logique',
ADD_FIELD_LG: "Cliquez pour ajouter un nouveau champ",
ADD_FIELD_MD: "Ajouter un nouveau champ",
ADD_FIELD_SM: "Ajouter un champ",
EDIT_START_PAGE: "Modifier la page de démarrage",
EDIT_END_PAGE: "Modifier la page de fin",
WELCOME_SCREEN: 'Page de démarrage',
END_SCREEN: 'Fin de page',
INTRO_TITLE: "Titre",
INTRO_PARAGRAPH: 'Paragraphe',
INTRO_BTN: 'Bouton de démarrage',
TITLE_1: "Titre",
PARAGRAPHE: 'Paragraphe',
BTN_TEXT: "Bouton Retour",
BOUTONS: 'Boutons',
BUTTON_TEXT: "Texte",
BUTTON_LINK: "Lien",
ADD_BUTTON: 'Ajouter un bouton',
PREVIEW_FIELD: 'Question d\'aperçu',
QUESTION_TITLE: "Titre",
QUESTION_DESCRIPTION: 'Description',
OPTIONS_1: 'Options',
ADD_OPTION: 'Ajouter une option',
NUM_OF_STEPS: "Nombre d'étapes",
CLICK_FIELDS_FOOTER: 'Cliquez sur les champs pour les ajouter ici',
SHAPE: 'Forme',
IF_THIS_FIELD: "Si ce champ",
IS_EQUAL_TO: 'est égal à',
IS_NOT_EQUAL_TO: 'n\'est pas égal à',
IS_GREATER_THAN: 'est supérieur à',
IS_GREATER_OR_EQUAL_THAN: 'est supérieur ou égal à',
IS_SMALLER_THAN: 'is_smaller_than',
IS_SMALLER_OR_EQUAL_THAN: 'est plus petit ou égal à',
CONTAINS_1: 'contient',
DOES_NOT_CONTAINS: 'ne contient pas',
ENDS_WITH: "se termine par",
DOES_NOT_END_WITH: "ne finit pas avec",
STARTS_WITH: 'commence par',
DOES_NOT_START_WITH: "ne commence pas par",
THEN_JUMP_TO: 'alors saute à',
// Modifier la vue des soumissions
TOTAL_VIEWS: 'total des visites uniques',
RESPONSES_1: "réponses",
COMPLETION_RATE: "taux d'achèvement",
AVERAGE_TIME_TO_COMPLETE: 'moy. le temps d\'achèvement',
DESKTOP_AND_LAPTOP: 'Desktops',
TABLETS_1: 'Tablettes',
PHONES_1: 'Téléphones',
OTHER_1: 'Autre',
UNIQUE_VISITS: 'Visites uniques',
FIELD_TITLE: 'Titre du champ',
FIELD_VIEWS: 'Field Views',
FIELD_DROPOFF: "Achèvement du champ",
FIELD_RESPONSES: 'Réponses sur le terrain',
DELETE_SELECTED: 'Supprimer la sélection',
EXPORT_TO_EXCEL: 'Exporter vers Excel',
EXPORT_TO_CSV: 'Export to CSV',
EXPORT_TO_JSON: "Exporter vers JSON",
PERCENTAGE_COMPLETE: 'Pourcentage terminé',
TIME_ELAPSED: 'Temps écoulé',
DEVICE_1: "Device",
LOCATION_1: "Emplacement",
IP_ADDRESS: 'Adresse IP',
DATE_SUBMITTED: 'Date de soumission',
// Vue de conception
BACKGROUND_COLOR: "Couleur d'arrière-plan",
DESIGN_HEADER: "Changez l'apparence de votre formulaire",
QUESTION_TEXT_COLOR: "Couleur du texte de la question",
ANSWER_TEXT_COLOR: "Couleur du texte de la réponse",
BTN_BACKGROUND_COLOR: "Couleur d'arrière-plan du bouton",
BTN_TEXT_COLOR: "Couleur du texte du bouton",
// Vue de partage
EMBED_YOUR_FORM: "Intégrez votre formulaire",
SHARE_YOUR_FORM: "Partager votre formulaire",
// Onglets d'administration
CREATE_TAB: "Créer",
DESIGN_TAB: 'Design',
CONFIGURE_TAB: 'Configurer',
ANALYZE_TAB: "Analyser",
SHARE_TAB: "Partager",
// Types de champs
SHORT_TEXT: "Texte court",
EMAIL_1: "E-mail",
MULTIPLE_CHOICE: 'Choix multiple',
DROPDOWN_1: 'Dropdown',
DATE_1: 'Date',
PARAGRAPH_T: "Paragraphe",
OUI_NON: 'Oui / Non',
LEGAL_1: 'Légal',
RATING_1: "Évaluation",
NUMBERS_1: "Chiffres",
SIGNATURE_1: 'Signature',
FILE_UPLOAD: 'Téléchargement de fichier',
OPTION_SCALE: 'Option Scale',
PAYMENT_1: 'Paiement',
STATEMENT_1: 'Déclaration',
LINK_1: "Lien",
// Aperçu du formulaire
FORM_SUCCESS: 'Entrée de formulaire soumise avec succès!',
REVIEW_1: 'Review',
BACK_TO_FORM: "Revenir au formulaire",
EDIT_FORM: "Modifier ce TellForm",
ADVANCEMENT_1: '{{done}} sur {{total}} a répondu',
CONTINUE_FORM: "Continuer à se former",
REQUIRED_1: 'requis',
COMPLETING_NEEDED: '{{answers_not_completed}} réponse (s) doivent être complétées',
OPTIONAL_1: 'optionnel',
ERROR_EMAIL_INVALID: "Veuillez entrer une adresse email valide",
ERROR_NOT_A_NUMBER: "Veuillez entrer uniquement des numéros valides",
ERROR_URL_INVALID: "S'il vous plaît une adresse valide",
OK_1: 'OK',
ENTER_1: 'appuyez sur ENTRER',
NEWLINE_1: 'appuyez sur MAJ + ENTRÉE pour créer une nouvelle ligne',
CONTINUE_1: "Continuer",
LEGAL_ACCEPT: 'J\'accepte',
LEGAL_NO_ACCEPT: "Je n'accepte pas",
SUBMIT_1: "Soumettre",
UPLOAD_FILE: "Télécharger votre fichier"
});
}]);

View File

@ -2,34 +2,189 @@
angular.module('forms').config(['$translateProvider', function ($translateProvider) {
$translateProvider.translations('de', {
FORM_SUCCESS: 'Ihre Angaben wurden gespeichert.',
REVIEW: 'Unvollständig',
BACK_TO_FORM: 'Zurück zum Formular',
EDIT_FORM: '',
CREATE_FORM: '',
ADVANCEMENT: '{{done}} von {{total}} beantwortet',
CONTINUE_FORM: 'Zum Formular',
REQUIRED: 'verpflichtend',
COMPLETING_NEEDED: 'Es fehlen/fehtl noch {{answers_not_completed}} Antwort(en)',
OPTIONAL: 'fakultativ',
ERROR_EMAIL_INVALID: 'Bitte gültige Mailadresse eingeben',
ERROR_NOT_A_NUMBER: 'Bitte nur Zahlen eingeben',
ERROR_URL_INVALID: 'Bitte eine gültige URL eingeben',
OK: 'Okay',
ENTER: 'Eingabetaste drücken',
YES: 'Ja',
NO: 'Nein',
NEWLINE: 'Für eine neue Zeile SHIFT+ENTER drücken',
CONTINUE: 'Weiter',
LEGAL_ACCEPT: 'I accept',
LEGAL_NO_ACCEPT: 'I dont accept',
DELETE: 'Entfernen',
CANCEL: 'Canceln',
SUBMIT: 'Speichern',
UPLOAD_FILE: 'Datei versenden',
Y: 'J',
N: 'N',
});
$translateProvider.translations('de', {
// Konfigurieren der Formularregisterkarte
ADVANCED_SETTINGS: 'Erweiterte Einstellungen',
FORM_NAME: 'Formularname',
FORM_STATUS: 'Formularstatus',
PUBLIC_1: 'Öffentlich',
PRIVATE_1: 'Privat',
GA_TRACKING_CODE: 'Google Analytics Tracking-Code',
DISPLAY_FOOTER: 'Formularfußzeile anzeigen?',
SAVE_CHANGES: 'Änderungen speichern',
CANCEL_1: 'Abbrechen',
DISPLAY_START_PAGE: 'Startseite anzeigen?',
DISPLAY_END_PAGE: 'Benutzerdefinierte Endseite anzeigen?',
// Listenformularansicht
CREATE_A_NEW_FORM: 'Erstelle ein neues Formular',
CREATE_FORM: 'Formular erstellen',
CREATED_ON: 'Erstellt am',
MY_FORMS: 'Meine Formulare',
NAME_1: 'Name',
SPRACHE: 'Sprache',
FORM_PAUSED: 'Formular pausiert',
// Feld Modal bearbeiten
EDIT_FIELD: 'Dieses Feld bearbeiten',
SAVE_FIELD: 'Speichern',
ON_1: 'ON',
AUS_1: 'AUS',
REQUIRED_FIELD: 'Erforderlich',
LOGIC_JUMP: 'Logischer Sprung',
SHOW_BUTTONS: 'Zusätzliche Schaltflächen',
SAVE_START_PAGE: 'Speichern',
// Admin-Formularansicht
ARE_YOU_SURE: "Bist du ABSOLUT sicher?",
READ_WARNING: 'Unerwartete schlimme Dinge werden passieren, wenn Sie das nicht lesen!',
DELETE_WARNING1: 'Diese Aktion kann NICHT rückgängig gemacht werden. Dies wird dauerhaft die "',
DELETE_WARNING2: '"Formular und entferne alle verknüpften Formulareinreichungen.',
DELETE_CONFIRM: 'Bitte geben Sie den Namen des zu bestätigenden Formulars ein.',
I_UNDERSTAND: "Ich verstehe die Konsequenzen, lösche dieses Formular.",
DELETE_FORM_SM: 'Löschen',
DELETE_FORM_MD: 'Formular löschen',
DELETE_1: 'Löschen',
FORM_1: 'Formular',
VIEW_1: 'Ansicht',
LIVE_1: 'Live',
PREVIEW_1: 'Vorschau',
COPY_1: 'Kopieren',
COPY_AND_PASTE: 'Kopieren und einfügen, um Ihre TellForm auf Ihrer Website hinzuzufügen',
CHANGE_WIDTH_AND_HEIGHT: 'Ändern Sie die Werte für Breite und Höhe, um Ihnen am besten zu entsprechen',
POWERED_BY: 'Powered by',
TELLFORM_URL: "Ihr TellForm ist dauerhaft unter dieser URL",
// Formularansicht bearbeiten
DISABLED_1: 'Deaktiviert',
JA_1: 'JA',
NO_1: 'NEIN',
ADD_LOGIC_JUMP: 'Logic Jump hinzufügen',
ADD_FIELD_LG: 'Klicken Sie auf Neues Feld hinzufügen',
ADD_FIELD_MD: 'Neues Feld hinzufügen',
ADD_FIELD_SM: 'Feld hinzufügen',
EDIT_START_PAGE: 'Startseite bearbeiten',
EDIT_END_PAGE: 'Endseite bearbeiten',
WELCOME_SCREEN: 'Startseite',
END_SCREEN: 'Ende Seite',
INTRO_TITLE: 'Titel',
INTRO_PARAGRAPH: "Absatz",
INTRO_BTN: 'Start Button',
TITLE_1: "Titel",
PARAGRAPH: "Absatz",
BTN_TEXT: 'Zurück Button',
TASTEN: 'Knöpfe',
BUTTON_TEXT: 'Text',
BUTTON_LINK: 'Link',
ADD_BUTTON: 'Schaltfläche hinzufügen',
PREVIEW_FIELD: 'Vorschaufrage',
QUESTION_TITLE: 'Titel',
QUESTION_DESCRIPTION: 'Beschreibung',
OPTIONS_1: 'Optionen',
ADD_OPTION: 'Option hinzufügen',
NUM_OF_STEPS: 'Anzahl der Schritte',
CLICK_FIELDS_FOOTER: 'Klicken Sie auf Felder, um sie hier hinzuzufügen',
FORM: 'Form',
IF_THIS_FIELD: 'Wenn dieses Feld',
IS_EQUAL_TO: 'ist gleich',
IS_NOT_EQUAL_TO: 'ist nicht gleich',
IS_GREATER_THAN: 'ist größer als',
IS_GREATER_OR_EQUAL_THAN: 'ist größer oder gleich',
IS_SMALLER_THAN: 'is_smaller_than',
IS_SMALLER_OR_EQUAL_THAN: 'ist kleiner oder gleich',
CONTAINS_1: 'enthält',
DOES_NOT_CONTAINS: 'enthält nicht',
ENDS_WITH: 'endet mit',
DOES_NOT_END_WITH: 'endet nicht mit',
STARTS_WITH: 'beginnt mit',
DOES_NOT_START_WITH: 'beginnt nicht mit',
THEN_JUMP_TO: 'Springe dann zu',
// Bearbeiten der Einreichungsansicht
TOTAL_VIEWS: 'Gesamtzahl eindeutiger Besuche',
RESPONSES_1: 'Antworten',
COMPLETION_RATE: 'Abschlussrate',
AVERAGE_TIME_TO_COMPLETE: 'avg. Fertigstellungszeit',
DESKTOP_AND_LAPTOP: 'Desktops',
TABLETS_1: "Tabletten",
PHONES_1: 'Telefone',
OTHER_1: 'Andere',
UNIQUE_VISITS: 'Eindeutige Besuche',
FIELD_TITLE: 'Feldtitel',
FIELD_VIEWS: 'Feld Ansichten',
FIELD_DROPOFF: 'Feldabschluss',
FIELD_RESPONSES: 'Feldantworten',
DELETE_SELECTED: 'Ausgewählte löschen',
EXPORT_TO_EXCEL: 'Export nach Excel',
EXPORT_TO_CSV: 'In CSV exportieren',
EXPORT_TO_JSON: 'Export nach JSON',
PERCENTAGE_COMPLETE: 'Prozent abgeschlossen',
TIME_ELAPSED: 'Zeit verstrichen',
DEVICE_1: 'Gerät',
LOCATION_1: 'Ort',
IP_ADDRESS: 'IP-Adresse',
DATE_SUBMITTED: 'Eingereichtes Datum',
// Entwurfsansicht
BACKGROUND_COLOR: 'Hintergrundfarbe',
DESIGN_HEADER: 'Ändern Sie, wie Ihr Formular aussieht',
QUESTION_TEXT_COLOR: 'Fragetextfarbe',
ANSWER_TEXT_COLOR: 'Textfarbe beantworten',
BTN_BACKGROUND_COLOR: 'Schaltfläche Hintergrundfarbe',
BTN_TEXT_COLOR: 'Schaltfläche Textfarbe',
// Freigabeansicht
EMBED_YOUR_FORM: 'Einbetten Ihres Formulars',
SHARE_YOUR_FORM: 'Teilen Sie Ihr Formular',
// Admin-Registerkarten
CREATE_TAB: 'Erstellen',
DESIGN_TAB: 'Design',
CONFIGURE_TAB: 'Konfigurieren',
ANALYZE_TAB: 'Analysieren',
    SHARE_TAB: 'Freigeben',
// Feldtypen
SHORT_TEXT: 'Kurztext',
EMAIL_1: 'Email',
MULTIPLE_CHOICE: 'Multiple Choice',
DROPDOWN_1: 'Dropdown',
DATE_1: 'Datum',
PARAGRAPH_T: "Absatz",
YES_NO: 'Ja / Nein',
LEGAL_1: "Legal",
RATING_1: 'Rating',
NUMBERS_1: 'Zahlen',
SIGNATURE_1: "Unterschrift",
FILE_UPLOAD: 'Datei-Upload',
OPTION_SCALE: 'Option Scale',
ZAHLUNG_1: "Zahlung",
STATEMENT_1: 'Anweisung',
LINK_1: 'Link',
// Formularvorschau
FORM_SUCCESS: 'Formulareintrag erfolgreich gesendet!',
REVIEW_1: 'Review',
BACK_TO_FORM: 'Gehe zurück zu Formular',
EDIT_FORM: 'Bearbeiten Sie diese TellForm',
ADVANCEMENT_1: '{{done}} von {{total}} wurde beantwortet',
CONTINUE_FORM: 'Weiter zum Formular',
REQUIRED_1: 'erforderlich',
COMPLETING_NEEDED: '{{answers_not_completed}} Antwort (en) müssen ausgefüllt werden',
OPTIONAL_1: 'optional',
ERROR_EMAIL_INVALID: 'Geben Sie eine gültige E-Mail-Adresse ein',
ERROR_NOT_A_NUMBER: 'Bitte nur gültige Nummern eingeben',
ERROR_URL_INVALID: 'Bitte eine gültige URL',
OK_1: 'OK',
ENTER_1: 'ENTER drücken',
NEWLINE_1: 'Drücken Sie UMSCHALT + EINGABETASTE, um eine neue Zeile zu erstellen',
CONTINUE_1: 'Weiter',
LEGAL_ACCEPT: "Ich akzeptiere",
LEGAL_NO_ACCEPT: "Ich akzeptiere nicht",
SUBMIT_1: 'Senden',
UPLOAD_FILE: 'Hochladen Ihrer Datei'
});
}]);

View File

@ -2,34 +2,189 @@
angular.module('forms').config(['$translateProvider', function ($translateProvider) {
$translateProvider.translations('it', {
FORM_SUCCESS: 'Il formulario è stato inviato con successo!',
REVIEW: 'Incompleto',
BACK_TO_FORM: 'Ritorna al formulario',
EDIT_FORM: '',
CREATE_FORM: '',
ADVANCEMENT: '{{done}} su {{total}} completate',
CONTINUE_FORM: 'Vai al formulario',
REQUIRED: 'obbligatorio',
COMPLETING_NEEDED: '{{answers_not_completed}} risposta/e deve/ono essere completata/e',
OPTIONAL: 'opzionale',
ERROR_EMAIL_INVALID: 'Si prega di inserire un indirizzo email valido',
ERROR_NOT_A_NUMBER: 'Si prega di inserire solo numeri',
ERROR_URL_INVALID: 'Grazie per inserire un URL valido',
OK: 'OK',
ENTER: 'premere INVIO',
YES: 'Sì',
NO: 'No',
NEWLINE: 'premere SHIFT+INVIO per creare una nuova linea',
CONTINUE: 'Continua',
LEGAL_ACCEPT: 'I accept',
LEGAL_NO_ACCEPT: 'I dont accept',
DELETE: 'Cancella',
CANCEL: 'Reset',
SUBMIT: 'Registra',
UPLOAD_FILE: 'Invia un file',
Y: 'S',
N: 'N',
});
$translateProvider.translations('it', {
// Configura la visualizzazione scheda modulo
ADVANCED_SETTINGS: 'Impostazioni avanzate',
FORM_NAME: 'Nome modulo',
FORM_STATUS: 'Stato modulo',
PUBLIC_1: 'pubblico',
PRIVATE_1: 'Privato',
GA_TRACKING_CODE: 'Codice di monitoraggio di Google Analytics',
DISPLAY_FOOTER: 'Visualizza piè di pagina?',
SAVE_CHANGES: 'Salva modifiche',
CANCEL_1: 'Annulla',
DISPLAY_START_PAGE: 'Visualizza pagina iniziale?',
DISPLAY_END_PAGE: 'Mostra pagina finale personalizzata?',
// Visualizzazione dei moduli di elenco
CREATE_A_NEW_FORM: 'Crea un nuovo modulo',
CREATE_FORM: 'Crea modulo',
CREATED_ON: 'Creato su',
MY_FORMS: 'Le mie forme',
NAME_1: 'Nome',
LINGUA: 'Lingua',
FORM_PAUSED: 'Forme in pausa',
// Modifica campo modale
EDIT_FIELD: 'Modifica questo campo',
SAVE_FIELD: 'Salva',
ON_1: 'ON',
OFF_1: 'OFF',
REQUIRED_FIELD: 'Obbligatorio',
LOGIC_JUMP: 'Jump Logic',
SHOW_BUTTONS: 'Pulsanti aggiuntivi',
SAVE_START_PAGE: 'Salva',
// Visualizzazione modulo di amministrazione
ARE_YOU_SURE: 'Sei ASSOLUTAMENTE sicuro?',
READ_WARNING: 'Le cose cattive impreviste avverranno se non lo leggi!',
DELETE_WARNING1: 'Questa azione NON può essere annullata. Ciò eliminerà in modo permanente il "',
DELETE_WARNING2: '" forma e rimuovi tutti i moduli di modulo associati. ',
DELETE_CONFIRM: 'Inserisci il nome del modulo per confermare',
I_UNDERSTAND: "Capisco le conseguenze, elimina questa forma",
DELETE_FORM_SM: 'Elimina',
DELETE_FORM_MD: 'Elimina modulo',
DELETE_1: 'Elimina',
FORM_1: 'Forma',
VIEW_1: 'Visualizza',
LIVE_1: 'Live',
PREVIEW_1: 'Anteprima',
COPY_1: 'Copia',
COPY_AND_PASTE: 'Copia e incolla questo per aggiungere il tuo TellForm al tuo sito web',
CHANGE_WIDTH_AND_HEIGHT: 'Modifica i valori di larghezza e di altezza per adattarti al meglio',
POWERED_BY: 'Powered by',
TELLFORM_URL: 'Il tuo TellForm è permanente in questo URL',
// Modifica vista modulo
DISABLED_1: 'disabilitato',
YES_1: 'SI',
NO_1: 'NO',
ADD_LOGIC_JUMP: 'Aggiungi logico salto',
ADD_FIELD_LG: 'Clicca per aggiungere nuovo campo',
ADD_FIELD_MD: 'Aggiungi nuovo campo',
ADD_FIELD_SM: 'Aggiungi campo',
EDIT_START_PAGE: 'Modifica pagina iniziale',
EDIT_END_PAGE: 'Modifica pagina finale',
WELCOME_SCREEN: 'Pagina iniziale',
END_SCREEN: 'Fine pagina',
INTRO_TITLE: 'Titolo',
INTRO_PARAGRAPH: 'Paragrafo',
INTRO_BTN: 'Pulsante Start',
TITLE_1: 'Titolo',
PARAGRAFO: 'Paragrafo',
BTN_TEXT: 'Tornare indietro',
TASTI: 'Pulsanti',
BUTTON_TEXT: 'Testo',
BUTTON_LINK: 'Link',
ADD_BUTTON: 'Aggiungi pulsante',
PREVIEW_FIELD: 'Anteprima domanda',
QUESTION_TITLE: 'Titolo',
QUESTION_DESCRIPTION: 'Descrizione',
OPTIONS_1: 'Opzioni',
ADD_OPTION: 'Aggiungi opzione',
NUM_OF_STEPS: 'Numero di passi',
CLICK_FIELDS_FOOTER: 'Clicca sui campi per aggiungerli qui',
FORMA: 'Forma',
IF_THIS_FIELD: 'Se questo campo',
IS_EQUAL_TO: 'è uguale a',
IS_NOT_EQUAL_TO: 'non è uguale a',
IS_GREATER_THAN: 'è maggiore di',
IS_GREATER_OR_EQUAL_THAN: 'è maggiore o uguale a',
IS_SMALLER_THAN: 'is_smaller_than',
IS_SMALLER_OR_EQUAL_THAN: 'è più piccolo o uguale a quello',
CONTAINS_1: 'contiene',
DOES_NOT_CONTAINS: 'non contiene',
ENDS_WITH: 'finisce con',
DOES_NOT_END_WITH: 'non finisce con',
STARTS_WITH: 'inizia con',
DOES_NOT_START_WITH: 'non inizia con',
THEN_JUMP_TO: 'poi salta a',
// Modifica visualizzazione presentazioni
TOTAL_VIEWS: 'visite totali totali',
RESPONSES_1: 'risposte',
COMPLETION_RATE: 'tasso di completamento',
AVERAGE_TIME_TO_COMPLETE: 'avg. tempo di completamento',
DESKTOP_AND_LAPTOP: 'Desktop',
TABLETS_1: 'compresse',
PHONES_1: 'Telefoni',
OTHER_1: 'Altro',
UNIQUE_VISITS: 'Visite Uniche',
FIELD_TITLE: 'Titolo del campo',
FIELD_VIEWS: 'Viste sul campo',
FIELD_DROPOFF: 'Completamento del campo',
FIELD_RESPONSES: 'Risposte sul campo',
DELETE_SELECTED: 'Elimina selezionata',
EXPORT_TO_EXCEL: 'Esporta in Excel',
EXPORT_TO_CSV: 'Esporta in CSV',
EXPORT_TO_JSON: 'Esporta in JSON',
PERCENTAGE_COMPLETE: 'Percentuale completa',
TIME_ELAPSED: 'Tempo trascorso',
DEVICE_1: 'Dispositivo',
LOCATION_1: 'Posizione',
IP_ADDRESS: 'Indirizzo IP',
DATE_SUBMITTED: 'Data trasmessa',
// Vista di progettazione
BACKGROUND_COLOR: 'Colore di sfondo',
DESIGN_HEADER: 'Modifica il tuo aspetto forma',
QUESTION_TEXT_COLOR: 'Colore del testo di domanda',
ANSWER_TEXT_COLOR: 'Answer Text Color',
BTN_BACKGROUND_COLOR: 'Colore di sfondo del pulsante',
BTN_TEXT_COLOR: 'Colore del testo pulsante',
// Vista condivisione
EMBED_YOUR_FORM: 'Inserisci il tuo modulo',
SHARE_YOUR_FORM: 'Condividi il tuo modulo',
// Schede amministratore
CREATE_TAB: 'Crea',
DESIGN_TAB: 'Design',
CONFIGURE_TAB: 'Configura',
ANALYZE_TAB: 'Analizza',
    SHARE_TAB: 'Condividi',
// Tipi di campo
SHORT_TEXT: 'Testo corto',
EMAIL_1: 'E-mail',
MULTIPLE_CHOICE: 'Scelta multipla',
DROPDOWN_1: 'Dropdown',
DATE_1: 'Data',
PARAGRAPH_T: 'Paragrafo',
YES_NO: 'Sì / no',
LEGAL_1: 'Legale',
RATING_1: 'Valutazione',
NUMBERS_1: 'Numeri',
SIGNATURE_1: 'Firma',
FILE_UPLOAD: 'Caricamento file',
OPTION_SCALE: 'Scala opzione',
PAGAMENTO_1: 'Pagamento',
STATEMENT_1: 'Dichiarazione',
LINK_1: 'Link',
// Anteprima del modulo
FORM_SUCCESS: 'Inserimento modulo con successo presentato!',
REVIEW_1: 'Recensione',
BACK_TO_FORM: 'Torna alla scheda',
EDIT_FORM: 'Modifica questo TellForm',
ADVANCEMENT_1: '{{done}} su {{total}} ha risposto',
CONTINUE_FORM: "Continua a formare",
REQUIRED_1: 'richiesta',
COMPLETING_NEEDED: '{{answers_not_completed}} answer (s) need completing',
OPTIONAL_1: 'facoltativo',
ERROR_EMAIL_INVALID: 'Inserisci un indirizzo e-mail valido',
ERROR_NOT_A_NUMBER: 'Inserisci solo numeri validi',
ERROR_URL_INVALID: 'Per favore un url valido',
OK_1: 'OK',
ENTER_1: 'premere INVIO',
NEWLINE_1: 'premere SHIFT + INVIO per creare una nuova riga',
CONTINUE_1: 'Continua',
LEGAL_ACCEPT: 'accetto',
LEGAL_NO_ACCEPT: 'Non accetto',
SUBMIT_1: 'Invia',
UPLOAD_FILE: 'Carica il tuo file'
});
}]);

View File

@ -55,9 +55,9 @@ angular.module('users').config(['$translateProvider', function ($translateProvid
SUBMIT_BTN: 'Submit',
ASK_FOR_NEW_PASSWORD: 'Ask for new password reset',
PASSWORD_RESET_INVALID: 'Password reset is invalid',
PASSWORD_RESET_SUCCESS: 'Passport successfully reset',
PASSWORD_CHANGE_SUCCESS: 'Passport successfully changed',
PASSWORD_RESET_INVALID: 'Password reset link is invalid',
PASSWORD_RESET_SUCCESS: 'Password successfully reset',
PASSWORD_CHANGE_SUCCESS: 'Password successfully changed',
RESET_PASSWORD: 'Reset your password',
CHANGE_PASSWORD: 'Change your password',

View File

@ -38,7 +38,7 @@ angular.module('users').config(['$translateProvider', function ($translateProvid
SUBMIT_BTN: 'Enregistrer',
ASK_FOR_NEW_PASSWORD: 'Demander un nouveau mot de pass ',
PASSWORD_RESET_INVALID: 'Le nouveau mot de passe est invalid',
PASSWORD_RESET_INVALID: 'Ce lien de réinitialisation de mot de passe a déjà expiré',
PASSWORD_RESET_SUCCESS: 'Mot de passe réinitialisé avec succès',
PASSWORD_CHANGE_SUCCESS: 'Mot de passe enregistré avec succès',

View File

@ -55,7 +55,7 @@ angular.module('users').config(['$translateProvider', function ($translateProvid
SUBMIT_BTN: 'Senden',
ASK_FOR_NEW_PASSWORD: 'Neues Passwort zurücksetzen',
PASSWORD_RESET_INVALID: 'Passwort-Reset ist ungültig',
PASSWORD_RESET_INVALID: 'Dieser Link zum Zurücksetzen des Passworts ist bereits abgelaufen',
PASSWORD_RESET_SUCCESS: 'Passport erfolgreich zurückgesetzt',
PASSWORD_CHANGE_SUCCESS: 'Pass wurde erfolgreich geändert',
RESET_PASSWORD: 'Passwort zurücksetzen',

View File

@ -55,7 +55,7 @@ angular.module('users').config(['$translateProvider', function ($translateProvid
SUBMIT_BTN: 'Invia',
ASK_FOR_NEW_PASSWORD: 'Richiedi nuova password reimpostata',
PASSWORD_RESET_INVALID: 'Il reset della password non è valido',
PASSWORD_RESET_INVALID: 'Questo collegamento per la reimpostazione della password è già scaduto',
PASSWORD_RESET_SUCCESS: 'Passaporto resettato con successo',
PASSWORD_CHANGE_SUCCESS: 'Passaporto modificato con successo',
RESET_PASSWORD: 'Ripristina la tua password',

View File

@ -55,7 +55,7 @@ angular.module('users').config(['$translateProvider', function ($translateProvid
SUBMIT_BTN: 'Enviar',
ASK_FOR_NEW_PASSWORD: 'Pedir reseteo de contraseña',
PASSWORD_RESET_INVALID: 'El reseteo de la contraseña es inválido',
PASSWORD_RESET_INVALID: 'Este enlace de restablecimiento de contraseña ya ha caducado',
PASSWORD_RESET_SUCCESS: 'Contraseña exitosamente reseteada',
PASSWORD_CHANGE_SUCCESS: 'Contraseña exitosamente cambiada',
RESET_PASSWORD: 'Resetear contraseña',

View File

@ -7,8 +7,10 @@ angular.module('users').controller('AuthenticationController', ['$scope', '$loca
$scope = $rootScope;
$scope.credentials = {};
$scope.error = '';
$scope.forms = [];
$scope.signin = function() {
console.log($scope.forms.signinForm);
User.login($scope.credentials).then(
function(response) {
Auth.login(response);

View File

@ -11,10 +11,12 @@ angular.module('users').controller('PasswordController', ['$scope', '$stateParam
User.askForPasswordReset($scope.credentials).then(
function(response){
$scope.success = response.message;
$scope.error = null;
$scope.credentials = null;
},
function(error){
$scope.error = error;
$scope.success = null;
$scope.credentials = null;
}
);
@ -25,8 +27,10 @@ angular.module('users').controller('PasswordController', ['$scope', '$stateParam
$scope.success = $scope.error = null;
User.resetPassword($scope.passwordDetails, $stateParams.token).then(
function(response){
console.log(response.message);
// If successful show success message and clear form
$scope.success = response.message;
$scope.error = null;
$scope.passwordDetails = null;
// And redirect to the index page
@ -34,6 +38,7 @@ angular.module('users').controller('PasswordController', ['$scope', '$stateParam
},
function(error){
$scope.error = error.message || error;
$scope.success = null;
$scope.passwordDetails = null;
}
);

View File

@ -33,8 +33,10 @@ angular.module('users').controller('SettingsController', ['$scope', '$rootScope'
}).success(function(response) {
// If successful show success message and clear form
$scope.success = true;
$scope.error = null;
$scope.user = response;
}).error(function(response) {
$scope.success = null;
$scope.error = response.message;
});
};
@ -47,8 +49,10 @@ angular.module('users').controller('SettingsController', ['$scope', '$rootScope'
user.$update(function(response) {
$scope.success = true;
$scope.error = null;
$scope.user = response;
}, function(response) {
$scope.success = null;
$scope.error = response.data.message;
});
} else {
@ -63,8 +67,10 @@ angular.module('users').controller('SettingsController', ['$scope', '$rootScope'
$http.post('/users/password', $scope.passwordDetails).success(function(response) {
// If successful show success message and clear form
$scope.success = true;
$scope.error = null;
$scope.passwordDetails = null;
}).error(function(response) {
$scope.success = null;
$scope.error = response.message;
});
};

View File

@ -13,11 +13,13 @@ angular.module('users').controller('VerifyController', ['$scope', '$state', '$ro
User.resendVerifyEmail($scope.credentials.email).then(
function(response){
$scope.success = response.message;
$scope.error = null;
$scope.credentials = null;
$scope.isResetSent = true;
},
function(error){
$scope.error = error;
$scope.success = null;
$scope.credentials.email = null;
$scope.isResetSent = false;
}
@ -31,11 +33,13 @@ angular.module('users').controller('VerifyController', ['$scope', '$state', '$ro
User.validateVerifyToken($stateParams.token).then(
function(response){
$scope.success = response.message;
$scope.error = null;
$scope.isResetSent = true;
$scope.credentials.email = null;
},
function(error){
$scope.isResetSent = false;
$scope.success = null;
$scope.error = error;
$scope.credentials.email = null;
}

View File

@ -1,4 +1,15 @@
<section class="text-center auth">
<h3 class="col-md-12">{{ 'ACCESS_DENIED_TEXT' | translate }}</h3>
<a href="/#!/sigin" class="col-md-12">{{ 'SIGNIN_BTN' | translate }}</a>
<section class="row auth" data-ng-controller="PasswordController">
<div class="row valign">
<div class="col-md-4 col-md-offset-4">
<div class="col-md-12 text-center" style="padding-bottom: 50px;">
<img src="/static/modules/core/img/logo_white.svg" height="100px">
</div>
<h3 class="col-md-12 text-center">{{ 'ACCESS_DENIED_TEXT' | translate }}</h3>
<div class="col-md-12 text-center">
<a class="btn btn-signup btn-rounded btn-block" href="/#!/signin" >
{{ 'ASK_FOR_NEW_PASSWORD' | translate }}
</a>
</div>
</div>
</div>
</section>

View File

@ -6,18 +6,18 @@
<img src="/static/modules/core/img/logo_white.svg" height="100px">
</div>
<div class="col-md-12">
<form class="signin form-horizontal" autocomplete="off">
<form name="forms.signinForm" class="signin form-horizontal" autocomplete="off">
<fieldset>
<div data-ng-show="error" class="text-center text-danger">
{{ 'ERROR' | translate }}: <strong data-ng-bind="error"></strong>
</div>
<div class="form-group">
<!--<label for="username">{{ 'USERNAME_LABEL' | translate }}</label>-->
<input type="text" id="username" name="username" class="form-control" data-ng-model="credentials.username" placeholder="{{ 'USERNAME_OR_EMAIL_LABEL' | translate }}" ng-minlength="4">
<input type="text" id="username" name="username" class="form-control" data-ng-model="credentials.username" placeholder="{{ 'USERNAME_OR_EMAIL_LABEL' | translate }}" required pattern=".{4,}" title="Username/Email must be at least 4 characters">
</div>
<div class="form-group">
<!--<label for="password">{{ 'PASSWORD_LABEL' | translate }}</label>-->
<input type="password" id="password" name="password" class="form-control" data-ng-model="credentials.password" placeholder="{{ 'PASSWORD_LABEL' | translate }}" ng-minlength="4">
<input type="password" id="password" name="password" class="form-control" data-ng-model="credentials.password" placeholder="{{ 'PASSWORD_LABEL' | translate }}" pattern=".{4,}" required title="Passwords must be at least 4 characters">
</div>
<div class="form-group">
<button class="btn btn-signup btn-rounded btn-block" ng-click="signin()">{{ 'SIGNIN_BTN' | translate }}</button>

View File

@ -12,15 +12,15 @@
</div>
<div class="form-group">
<!--<label for="username">{{ 'USERNAME_LABEL' | translate }}</label>-->
<input type="text" id="username" name="username" class="form-control" ng-pattern="languageRegExp" ng-minlength="4" ng-model="credentials.username" placeholder="{{ 'USERNAME_LABEL' | translate }}" ng-minlength="4">
<input type="text" id="username" name="username" class="form-control" ng-pattern="languageRegExp" ng-minlength="4" ng-model="credentials.username" placeholder="{{ 'USERNAME_LABEL' | translate }}" required pattern=".{4,}" title="Username/Email must be at least 4 characters">
</div>
<div class="form-group">
<!--<label for="email">{{ 'EMAIL_LABEL' | translate }}</label>-->
<input type="email" id="email" name="email" class="form-control" ng-model="credentials.email" placeholder="{{ 'EMAIL_LABEL' | translate }}">
<input type="email" id="email" name="email" class="form-control" ng-model="credentials.email" placeholder="{{ 'EMAIL_LABEL' | translate }}" required pattern=".{4,}" title="Email must be at least 4 characters">
</div>
<div class="form-group">
<!--<label for="password">{{ 'PASSWORD_LABEL' | translate }}</label>-->
<input type="password" id="password" name="password" class="form-control" ng-model="credentials.password" placeholder="{{ 'PASSWORD_LABEL' | translate }}" ng-minlength="4">
<input type="password" id="password" name="password" class="form-control" ng-model="credentials.password" placeholder="{{ 'PASSWORD_LABEL' | translate }}" pattern=".{4,}" required title="Passwords must be at least 4 characters">
</div>
<div class="text-center form-group">
<button type="submit" class="btn btn-signup btn-rounded btn-block">{{ 'SIGNUP_BTN' | translate }}</button>

View File

@ -16,9 +16,14 @@
<div class="form-group">
<input type="text" id="username" name="username" class="form-control" data-ng-model="credentials.username" placeholder="{{ 'USERNAME_OR_EMAIL_LABEL' | translate }}">
</div>
<div class="text-center form-group">
<div class="text-center form-group" ng-if="!success">
<button type="submit" class="btn btn-signup btn-rounded btn-block">{{ 'PASSWORD_RESTORE_HEADER' | translate }}</button>
</div>
<div class="col-md-12 text-center" ng-if="success">
<a class="btn btn-signup btn-rounded btn-block" href="/#!/signin" >
{{ 'CONTINUE_TO_LOGIN' | translate }}
</a>
</div>
</fieldset>
</form>
</div>

View File

@ -1,4 +1,17 @@
<section class="row text-center">
<h3 class="col-md-12">{{ 'PASSWORD_RESET_INVALID' | translate }}</h3>
<a href="/#!/password/forgot" class="col-md-12">{{ 'ASK_FOR_NEW_PASSWORD' | translate }}</a>
<section class="row auth" data-ng-controller="PasswordController">
<div class="row valign">
<div class="col-md-4 col-md-offset-4">
<div class="col-md-12 text-center" style="padding-bottom: 50px;">
<img src="/static/modules/core/img/logo_white.svg" height="100px">
</div>
<h3 class="col-md-12 text-center">
{{ 'PASSWORD_RESET_INVALID' | translate }}
</h3>
<div class="col-md-12 text-center">
<a class="btn btn-signup btn-rounded btn-block" href="/#!/password/forgot" >
{{ 'ASK_FOR_NEW_PASSWORD' | translate }}
</a>
</div>
</div>
</div>
</section>

View File

@ -1,4 +1,16 @@
<section class="row text-center">
<h3 class="col-md-12">{{ 'PASSWORD_RESET_SUCCESS' | translate }}</h3>
<a href="/#!/" class="col-md-12">{{ 'CONTINUE_TO_LOGIN' | translate }}</a>
<section class="row auth" data-ng-controller="PasswordController">
<div class="row valign">
<div class="col-md-4 col-md-offset-4">
<div class="col-md-12 text-center" style="padding-bottom: 50px;">
<img src="/static/modules/core/img/logo_white.svg" height="100px">
</div>
<h3 class="col-md-12 text-center">{{ 'PASSWORD_RESET_SUCCESS' | translate }}</h3>
<div class="col-md-12 text-center">
<a class="btn btn-signup btn-rounded btn-block" href="/#!/signin" >
{{ 'CONTINUE_TO_LOGIN' | translate }}
</a>
</div>
</div>
</div>
</section>

View File

@ -3,19 +3,19 @@
<div class="col-xs-offset-2 col-xs-8 col-md-offset-3 col-md-6">
<form data-ng-submit="resetUserPassword()" class="signin form-horizontal" autocomplete="off">
<fieldset>
<div data-ng-show="error" class="text-center text-danger">
<div ng-if="error" class="text-center text-danger">
<strong>{{error}}</strong>
</div>
<div data-ng-show="success" class="text-center text-success">
<div ng-if="success" class="text-center text-success">
<strong>{{success}}</strong>
</div>
<div class="form-group">
<label for="newPassword">{{ 'NEW_PASSWORD_LABEL' | translate }}</label>
<input type="password" id="newPassword" name="newPassword" class="form-control" data-ng-model="passwordDetails.newPassword" placeholder="{{ 'NEW_PASSWORD_LABEL' | translate }}">
<input type="password" id="newPassword" name="newPassword" class="form-control" data-ng-model="passwordDetails.newPassword" placeholder="{{ 'NEW_PASSWORD_LABEL' | translate }}" required pattern=".{4,}" title="Username/Email must be at least 4 characters">
</div>
<div class="form-group">
<label for="verifyPassword">{{ 'VERIFY_PASSWORD_LABEL' | translate }}</label>
<input type="password" id="verifyPassword" name="verifyPassword" class="form-control" data-ng-model="passwordDetails.verifyPassword" placeholder="{{ 'VERIFY_PASSWORD_LABEL' | translate }}">
<input type="password" id="verifyPassword" name="verifyPassword" class="form-control" data-ng-model="passwordDetails.verifyPassword" placeholder="{{ 'VERIFY_PASSWORD_LABEL' | translate }}" required pattern=".{4,}" title="Username/Email must be at least 4 characters">
</div>
<div class="text-center form-group">
<button type="submit" class="btn btn-large btn-primary">{{ 'UPDATE_PASSWORD_LABEL' | translate }}</button>