added multi language support for form title
This commit is contained in:
commit
c03c9ae33d
|
@ -72,7 +72,7 @@ var FormSchema = new Schema({
|
||||||
},
|
},
|
||||||
language: {
|
language: {
|
||||||
type: String,
|
type: String,
|
||||||
enum: ['english', 'french', 'spanish'],
|
enum: ['english', 'french', 'spanish', 'german', 'italian'],
|
||||||
required: 'Form must have a language',
|
required: 'Form must have a language',
|
||||||
default: 'english'
|
default: 'english'
|
||||||
},
|
},
|
||||||
|
|
|
@ -94,7 +94,7 @@ var UserSchema = new Schema({
|
||||||
},
|
},
|
||||||
language: {
|
language: {
|
||||||
type: String,
|
type: String,
|
||||||
enum: ['english', 'french', 'spanish'],
|
enum: ['english', 'french', 'spanish', 'italian', 'german'],
|
||||||
default: 'english',
|
default: 'english',
|
||||||
required: 'User must have a language'
|
required: 'User must have a language'
|
||||||
},
|
},
|
||||||
|
|
|
@ -33,9 +33,9 @@
|
||||||
"angular-input-stars": "https://github.com/whitef0x0/angular-input-stars.git#master",
|
"angular-input-stars": "https://github.com/whitef0x0/angular-input-stars.git#master",
|
||||||
"raven-js": "^3.0.4",
|
"raven-js": "^3.0.4",
|
||||||
"tableExport.jquery.plugin": "^1.5.1",
|
"tableExport.jquery.plugin": "^1.5.1",
|
||||||
"angular-translate": "~2.11.0",
|
|
||||||
"js-yaml": "^3.6.1",
|
"js-yaml": "^3.6.1",
|
||||||
"angular-ui-select": "whitef0x0/ui-select#compiled"
|
"angular-ui-select": "whitef0x0/ui-select#compiled",
|
||||||
|
"angular-translate": "~2.11.0"
|
||||||
},
|
},
|
||||||
"resolutions": {
|
"resolutions": {
|
||||||
"angular-bootstrap": "^0.14.0",
|
"angular-bootstrap": "^0.14.0",
|
||||||
|
|
8
config/env/all.js
vendored
8
config/env/all.js
vendored
|
@ -99,10 +99,14 @@ module.exports = {
|
||||||
],
|
],
|
||||||
unit_tests: [
|
unit_tests: [
|
||||||
'public/lib/angular-mocks/angular-mocks.js',
|
'public/lib/angular-mocks/angular-mocks.js',
|
||||||
'public/modules/*/tests/unit/**/*.js'
|
'public/modules/*/tests/unit/**/*.js',
|
||||||
|
'!public/modules/**/demo/**/*.js',
|
||||||
|
'!public/modules/**/node_modules/**/*.js'
|
||||||
],
|
],
|
||||||
e2e_tests: [
|
e2e_tests: [
|
||||||
'public/modules/*/tests/e2e/**.js'
|
'public/modules/*/tests/e2e/**.js',
|
||||||
|
'!public/modules/**/demo/**/*.js',
|
||||||
|
'!public/modules/**/node_modules/**/*.js'
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
433
public/dist/application.js
vendored
433
public/dist/application.js
vendored
File diff suppressed because one or more lines are too long
6
public/dist/application.min.js
vendored
6
public/dist/application.min.js
vendored
File diff suppressed because one or more lines are too long
|
@ -7,7 +7,7 @@ angular.module('core').controller('HeaderController', ['$rootScope', '$scope', '
|
||||||
$scope.user = $rootScope.user = Auth.ensureHasCurrentUser(User);
|
$scope.user = $rootScope.user = Auth.ensureHasCurrentUser(User);
|
||||||
$scope.authentication = $rootScope.authentication = Auth;
|
$scope.authentication = $rootScope.authentication = Auth;
|
||||||
|
|
||||||
$rootScope.languages = $scope.languages = ['english', 'french', 'spanish'];
|
$rootScope.languages = $scope.languages = ['english', 'french', 'spanish', 'italian', 'german'];
|
||||||
|
|
||||||
$scope.isCollapsed = false;
|
$scope.isCollapsed = false;
|
||||||
$rootScope.hideNav = false;
|
$rootScope.hideNav = false;
|
||||||
|
|
|
@ -1,81 +0,0 @@
|
||||||
<section data-ng-controller="HomeController" class="hero-section" style="overflow:hidden;">
|
|
||||||
<div class="opacity-background">
|
|
||||||
</div>
|
|
||||||
<div class="image-background">
|
|
||||||
</div>
|
|
||||||
<div class="jumbotron text-center">
|
|
||||||
<div class="container" data-ng-if="!authentication.isAuthenticated()">
|
|
||||||
<div class="row text-center logo" style="border-bottom: 1px solid rgba(255,255,255,.2); margin-bottom: 30px;">
|
|
||||||
<h3 class="col-xs-12" style="color: #FA787E; margin-bottom:0px">
|
|
||||||
<i class="fa fa-archive fa-3x"></i>
|
|
||||||
</h3>
|
|
||||||
<h2 class="col-xs-12" style="margin-top:0px">
|
|
||||||
<span>Tell<span style="text-decoration: underline; color: #FA787E;">Form</span></span>
|
|
||||||
</h2>
|
|
||||||
</div>
|
|
||||||
<div class="row" style="margin-top:0px">
|
|
||||||
<h1 class="lead col-md-10 col-md-offset-1 hidden-xs hidden-sm" style="font-size:3.8em;">
|
|
||||||
Craft beautiful forms in seconds.
|
|
||||||
</h1>
|
|
||||||
|
|
||||||
<h2 class="lead col-sm-12 text-center hidden-md hidden-lg" style="font-size:2.8em;">
|
|
||||||
Craft beautiful forms.
|
|
||||||
</h2>
|
|
||||||
|
|
||||||
<p class="lead hidden-xs hidden-sm col-md-10 col-md-offset-1 col-lg-8 col-lg-offset-2" style="font-size:1.5em; color:rgba(255,255,255,.75)">
|
|
||||||
<i>TellForm is an opensource <b>alternative to TypeForm </b> that can create stunning forms from PDFs or from scratch</i>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p class="lead col-xs-12 hidden-md hidden-lg" style="font-size:1.5em; color:rgba(255,255,255,.75)">
|
|
||||||
<i>TellForm is an opensource <b>alternative to TypeForm </b> that can create stunning forms from PDFs or from scratch</i>
|
|
||||||
</h1>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="jumbotron text-center">
|
|
||||||
<div class="container" data-ng-if="!authentication.isAuthenticated()">
|
|
||||||
<div class="row" style="margin-top:0px">
|
|
||||||
<h1 class="lead col-md-10 col-md-offset-1 hidden-xs hidden-sm" style="font-size:3.8em;">
|
|
||||||
Create your next ______.
|
|
||||||
</h1>
|
|
||||||
|
|
||||||
<h1 class="lead col-md-10 col-md-offset-1 hidden-xs hidden-sm" style="font-size:2.5em;">
|
|
||||||
Tell a story with a form.
|
|
||||||
</h1>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row" style="margin-top:7%;">
|
|
||||||
<a class="col-xs-4 col-xs-offset-4 btn btn-info signup-btn" href="/#!/signup" style="background-color:#FA787E; border: none; font-size: 2em; padding: 0.3em 0.9em; color: white;">
|
|
||||||
sign me up!
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<footer class="footer-basic-centered">
|
|
||||||
|
|
||||||
<p class="footer-company-motto">The company motto.</p>
|
|
||||||
|
|
||||||
<p class="footer-links">
|
|
||||||
<a href="/#!/">Home</a>
|
|
||||||
·
|
|
||||||
<a href="/#!/blog">Blog</a>
|
|
||||||
·
|
|
||||||
<a href="https://github.com/whitef0x0/tellform">Github Source</a>
|
|
||||||
·
|
|
||||||
<a href="/#!/about">About</a>
|
|
||||||
.
|
|
||||||
<a href="/#!/terms">Privacy & Terms</a>
|
|
||||||
·
|
|
||||||
<a href="https://status.tellform.com">System Status</a>
|
|
||||||
·
|
|
||||||
<a href="mailto:polydaic@gmail.com">Contact</a>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p class="footer-company-name">TellForm © 2016</p>
|
|
||||||
|
|
||||||
</footer>
|
|
|
@ -8,6 +8,15 @@ angular.module('forms').controller('ListFormsController', ['$rootScope', '$scope
|
||||||
$scope.forms = {};
|
$scope.forms = {};
|
||||||
$scope.showCreateModal = false;
|
$scope.showCreateModal = false;
|
||||||
|
|
||||||
|
$scope.languageRegExp = $scope.myPt = {
|
||||||
|
regExp: /[@!#$%^&*()\-+={}\[\]|\\/'";:`.,~№?<>]+/i,
|
||||||
|
test: function(val) {
|
||||||
|
console.log(val);
|
||||||
|
return !this.regExp.test(val);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
// Return all user's Forms
|
// Return all user's Forms
|
||||||
$scope.findAll = function() {
|
$scope.findAll = function() {
|
||||||
Forms.query(function(_forms){
|
Forms.query(function(_forms){
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
<div class="title-row row">
|
<div class="title-row row">
|
||||||
<div class="col-xs-5 field-title text-left"> Name </div>
|
<div class="col-xs-5 field-title text-left"> Name </div>
|
||||||
<div class="col-xs-12 field-input">
|
<div class="col-xs-12 field-input">
|
||||||
<input type="text" name="title" required ng-model="formTitle" ng-pattern="/^[a-zA-Z0-9 \-.]*$/" ng-minlength="4"/>
|
<input type="text" name="title" required ng-model="formTitle" ng-pattern="languageRegExp" ng-minlength="4" style="color:black;"/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="details-row row">
|
<div class="details-row row">
|
||||||
|
|
|
@ -33,6 +33,8 @@
|
||||||
"resolutions": {
|
"resolutions": {
|
||||||
"angular-bootstrap": "^0.14.0",
|
"angular-bootstrap": "^0.14.0",
|
||||||
"angular": "1.4.x"
|
"angular": "1.4.x"
|
||||||
|
"restangular": "~1.5.2",
|
||||||
|
"angular-ui-select": "whitef0x0/ui-select#compiled",
|
||||||
},
|
},
|
||||||
"overrides": {
|
"overrides": {
|
||||||
"BOWER-PACKAGE": {
|
"BOWER-PACKAGE": {
|
||||||
|
|
35
public/modules/forms/base/config/i18n/german.js
Normal file
35
public/modules/forms/base/config/i18n/german.js
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
angular.module('forms').config(['$translateProvider', function ($translateProvider) {
|
||||||
|
|
||||||
|
$translateProvider.translations('german', {
|
||||||
|
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 don’t accept',
|
||||||
|
DELETE: 'Entfernen',
|
||||||
|
CANCEL: 'Canceln',
|
||||||
|
SUBMIT: 'Speichern',
|
||||||
|
UPLOAD_FILE: 'Datei versenden',
|
||||||
|
Y: 'J',
|
||||||
|
N: 'N',
|
||||||
|
});
|
||||||
|
|
||||||
|
}]);
|
35
public/modules/forms/base/config/i18n/italian.js
Normal file
35
public/modules/forms/base/config/i18n/italian.js
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
angular.module('forms').config(['$translateProvider', function ($translateProvider) {
|
||||||
|
|
||||||
|
$translateProvider.translations('italian', {
|
||||||
|
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 don’t accept',
|
||||||
|
DELETE: 'Cancella',
|
||||||
|
CANCEL: 'Reset',
|
||||||
|
SUBMIT: 'Registra',
|
||||||
|
UPLOAD_FILE: 'Invia un file',
|
||||||
|
Y: 'S',
|
||||||
|
N: 'N',
|
||||||
|
});
|
||||||
|
|
||||||
|
}]);
|
35
public/modules/forms/base/config/i18n/spanish.js
Normal file
35
public/modules/forms/base/config/i18n/spanish.js
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
angular.module('forms').config(['$translateProvider', function ($translateProvider) {
|
||||||
|
|
||||||
|
$translateProvider.translations('spanish', {
|
||||||
|
FORM_SUCCESS: '¡El formulario ha sido enviado con éxito!',
|
||||||
|
REVIEW: 'Revisar',
|
||||||
|
BACK_TO_FORM: 'Regresar al formulario',
|
||||||
|
EDIT_FORM: '',
|
||||||
|
CREATE_FORM: '',
|
||||||
|
ADVANCEMENT: '{{done}} de {{total}} contestadas',
|
||||||
|
CONTINUE_FORM: 'Continuar al formulario',
|
||||||
|
REQUIRED: 'Información requerida',
|
||||||
|
COMPLETING_NEEDED: '{{answers_not_completed}} respuesta(s) necesita(n) ser completada(s)',
|
||||||
|
OPTIONAL: 'Opcional',
|
||||||
|
ERROR_EMAIL_INVALID: 'Favor de proporcionar un correo electrónico válido',
|
||||||
|
ERROR_NOT_A_NUMBER: 'Por favor, introduzca sólo números válidos',
|
||||||
|
ERROR_URL_INVALID: 'Favor de proporcionar un url válido',
|
||||||
|
OK: 'OK',
|
||||||
|
ENTER: 'pulse INTRO',
|
||||||
|
YES: 'Si',
|
||||||
|
NO: 'No',
|
||||||
|
NEWLINE: 'presione SHIFT+INTRO para crear una nueva línea',
|
||||||
|
CONTINUE: 'Continuar',
|
||||||
|
LEGAL_ACCEPT: 'I accept',
|
||||||
|
LEGAL_NO_ACCEPT: 'I don’t accept',
|
||||||
|
DELETE: 'Eliminar',
|
||||||
|
CANCEL: 'Cancelar',
|
||||||
|
SUBMIT: 'Registrar',
|
||||||
|
UPLOAD_FILE: 'Cargar el archivo',
|
||||||
|
Y: 'S',
|
||||||
|
N: 'N'
|
||||||
|
});
|
||||||
|
|
||||||
|
}]);
|
|
@ -49,6 +49,9 @@ angular.module('forms').factory('myForm', ['Forms', function(Forms) {
|
||||||
}]);
|
}]);
|
||||||
angular.module('forms').constant('FORM_URL', '/form/:formId');
|
angular.module('forms').constant('FORM_URL', '/form/:formId');
|
||||||
|
|
||||||
|
angular.module('forms').value('SendVisitorData', {
|
||||||
|
send: function(){}
|
||||||
|
});
|
||||||
|
|
||||||
angular.element(document).ready(function() {
|
angular.element(document).ready(function() {
|
||||||
//Then init the app
|
//Then init the app
|
||||||
|
|
|
@ -29,12 +29,13 @@ angular.module('forms').directive('fieldDirective', ['$http', '$compile', '$root
|
||||||
'number',
|
'number',
|
||||||
'natural'
|
'natural'
|
||||||
];
|
];
|
||||||
if (__indexOf.call(supported_fields, type) >= 0) {
|
|
||||||
var templateUrl = 'modules/forms/base/views/directiveViews/field/';
|
var templateUrl = 'modules/forms/base/views/directiveViews/field/';
|
||||||
|
|
||||||
|
if (__indexOf.call(supportedFields, type) >= 0) {
|
||||||
templateUrl = templateUrl+type+'.html';
|
templateUrl = templateUrl+type+'.html';
|
||||||
return $templateCache.get(templateUrl);
|
}
|
||||||
}
|
return $templateCache.get(templateUrl);
|
||||||
return null;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
|
|
@ -8,7 +8,6 @@
|
||||||
</small>
|
</small>
|
||||||
{{field.title}}
|
{{field.title}}
|
||||||
<span class="required-error" ng-show="!field.required">{{ 'OPTIONAL' | translate }}</span>
|
<span class="required-error" ng-show="!field.required">{{ 'OPTIONAL' | translate }}</span>
|
||||||
|
|
||||||
</h3>
|
</h3>
|
||||||
<p class="col-xs-12">
|
<p class="col-xs-12">
|
||||||
<small>{{field.description}}</small>
|
<small>{{field.description}}</small>
|
||||||
|
|
|
@ -29,9 +29,6 @@
|
||||||
ng-model="field.fieldValue"
|
ng-model="field.fieldValue"
|
||||||
ng-model-options="{ debounce: 250 }"
|
ng-model-options="{ debounce: 250 }"
|
||||||
value="field.fieldValue"
|
value="field.fieldValue"
|
||||||
ng-model="field.fieldValue"
|
|
||||||
ng-model-options="{ debounce: 250 }"
|
|
||||||
value="field.fieldValue"
|
|
||||||
ng-focus="setActiveField(field._id, index, true)"
|
ng-focus="setActiveField(field._id, index, true)"
|
||||||
on-enter-or-tab-key="nextField()"
|
on-enter-or-tab-key="nextField()"
|
||||||
on-tab-and-shift-key="prevField()"
|
on-tab-and-shift-key="prevField()"
|
||||||
|
|
Loading…
Reference in a new issue