You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by il...@apache.org on 2016/06/16 15:59:07 UTC

syncope git commit: SYNCOPE-721 i18n added

Repository: syncope
Updated Branches:
  refs/heads/master 5de3c430c -> e5eed43a3


SYNCOPE-721 i18n added


Project: http://git-wip-us.apache.org/repos/asf/syncope/repo
Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/e5eed43a
Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/e5eed43a
Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/e5eed43a

Branch: refs/heads/master
Commit: e5eed43a30ac25fda0b9c86e32364522d863c64e
Parents: 5de3c43
Author: Matteo Di Carlo <ma...@tirasa.net>
Authored: Fri May 20 12:43:01 2016 +0200
Committer: Francesco Chicchiricc� <il...@apache.org>
Committed: Thu Jun 16 17:56:59 2016 +0200

----------------------------------------------------------------------
 client/enduser/pom.xml                          |  11 +-
 .../enduser/SyncopeEnduserApplication.java      |   9 --
 .../resources/META-INF/resources/app/index.html |   8 +-
 .../resources/META-INF/resources/app/js/app.js  |  35 +++---
 .../app/js/controllers/LanguageController.js    |   9 --
 .../app/js/controllers/LoginController.js       |  24 ++--
 .../angular-translate-loader-static-files.js    | 126 +++++++++++++++++++
 .../resources/app/languages/de/dynamic.json     |  26 ++++
 .../resources/app/languages/de/static.json      |  42 +++++++
 .../resources/app/languages/en/dynamic.json     |  24 ++++
 .../resources/app/languages/en/static.json      |  42 +++++++
 .../resources/app/languages/it/dynamic.json     |  24 ++++
 .../resources/app/languages/it/static.json      |  40 ++++++
 .../META-INF/resources/app/views/captcha.html   |   2 +-
 .../app/views/confirmpasswordreset.html         |  16 +--
 .../app/views/dynamicPlainAttributes.html       |   4 +-
 .../META-INF/resources/app/views/editUser.html  |  25 +---
 .../META-INF/resources/app/views/home.html      |   4 +-
 .../resources/app/views/mustchangepassword.html |  20 +--
 .../resources/app/views/navigationButtons.html  |   4 +-
 .../resources/app/views/passwordreset.html      |  12 +-
 .../resources/app/views/requiredMessage.html    |   2 +-
 .../META-INF/resources/app/views/self.html      |  65 ++--------
 .../resources/app/views/user-credentials.html   |  22 ++--
 .../app/views/user-derived-schemas.html         |   2 +-
 .../resources/app/views/user-form-finish.html   |   2 +-
 .../resources/app/views/user-groups.html        |   8 +-
 .../resources/app/views/user-plain-schemas.html |   2 +-
 .../resources/app/views/user-resources.html     |   2 +-
 .../app/views/user-virtual-schemas.html         |   2 +-
 deb/enduser/LICENSE                             |   6 +-
 deb/enduser/NOTICE                              |   5 +
 pom.xml                                         |  13 ++
 standalone/LICENSE                              |   5 +
 standalone/NOTICE                               |   5 +
 35 files changed, 462 insertions(+), 186 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/e5eed43a/client/enduser/pom.xml
----------------------------------------------------------------------
diff --git a/client/enduser/pom.xml b/client/enduser/pom.xml
index 2195248..ea73ac9 100644
--- a/client/enduser/pom.xml
+++ b/client/enduser/pom.xml
@@ -32,18 +32,15 @@ under the License.
   <groupId>org.apache.syncope.client</groupId>
   <artifactId>syncope-client-enduser</artifactId>
   <packaging>jar</packaging>
-  
   <properties>
     <rootpom.basedir>${basedir}/../..</rootpom.basedir>
   </properties>
-  
   <dependencies>
     <dependency> 
       <groupId>javax.servlet</groupId> 
       <artifactId>javax.servlet-api</artifactId>
       <scope>provided</scope>
     </dependency>
-    
     <dependency>
       <groupId>org.apache.wicket</groupId>
       <artifactId>wicket</artifactId>
@@ -89,6 +86,14 @@ under the License.
     </dependency>
     <dependency>
       <groupId>org.webjars.bower</groupId>
+      <artifactId>angular-translate</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.webjars.bower</groupId>
+      <artifactId>angular-translate-loader-partial</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.webjars.bower</groupId>
       <artifactId>ng-password-strength</artifactId>    
     </dependency>
     <dependency>

http://git-wip-us.apache.org/repos/asf/syncope/blob/e5eed43a/client/enduser/src/main/java/org/apache/syncope/client/enduser/SyncopeEnduserApplication.java
----------------------------------------------------------------------
diff --git a/client/enduser/src/main/java/org/apache/syncope/client/enduser/SyncopeEnduserApplication.java b/client/enduser/src/main/java/org/apache/syncope/client/enduser/SyncopeEnduserApplication.java
index 4383f95..71de4db 100644
--- a/client/enduser/src/main/java/org/apache/syncope/client/enduser/SyncopeEnduserApplication.java
+++ b/client/enduser/src/main/java/org/apache/syncope/client/enduser/SyncopeEnduserApplication.java
@@ -22,10 +22,6 @@ import org.apache.syncope.client.enduser.resources.UserSelfIsLogged;
 import java.io.File;
 import java.io.Serializable;
 import org.apache.syncope.client.enduser.pages.HomePage;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.Locale;
 import java.util.Properties;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang3.BooleanUtils;
@@ -62,11 +58,6 @@ public class SyncopeEnduserApplication extends WebApplication implements Seriali
 
     private static final String ENDUSER_PROPERTIES = "enduser.properties";
 
-    public static final List<Locale> SUPPORTED_LOCALES = Collections.unmodifiableList(Arrays.asList(
-            new Locale[] {
-                Locale.ENGLISH, Locale.ITALIAN, new Locale("pt", "BR")
-            }));
-
     public static SyncopeEnduserApplication get() {
         return (SyncopeEnduserApplication) WebApplication.get();
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/e5eed43a/client/enduser/src/main/resources/META-INF/resources/app/index.html
----------------------------------------------------------------------
diff --git a/client/enduser/src/main/resources/META-INF/resources/app/index.html b/client/enduser/src/main/resources/META-INF/resources/app/index.html
index ebba78a..7f00f85 100644
--- a/client/enduser/src/main/resources/META-INF/resources/app/index.html
+++ b/client/enduser/src/main/resources/META-INF/resources/app/index.html
@@ -26,9 +26,9 @@ under the License.
     <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
     <meta name="description" content=""/>
     <meta name="viewport" content="width=device-width, initial-scale=1"/>
-    
+
     <title>Apache Syncope - EndUser</title>
-    
+
     <link rel="shortcut icon" href="img/favicon.png" type="image/png"/>
 
     <link href="css/login.css" rel="stylesheet" type="text/css"/>
@@ -54,7 +54,7 @@ under the License.
     <![endif]-->
 
     <span id="notifications" kendo-notification="notifications"></span>
-    
+
     <treasure-overlay-spinner active='spinner.active'>
       <div ui-view ng-cloak ng-controller="ApplicationController" ng-init="initApplication()">      
       </div>    
@@ -77,6 +77,8 @@ under the License.
     <script type="text/javascript" src="../webjars/bootstrap-select/${bootstrap-select.version}/js/bootstrap-select.min.js"></script>
     <script src="../webjars/FileSaver.js/${fileSaver.version}/FileSaver.js"></script>
     <script src="../webjars/lodash/${lodash.version}/lodash.min.js"></script>
+    <script src="../webjars/angular-translate/${angular-translate.version}/angular-translate.js"></script>
+    <script src="../webjars/angular-translate-loader-partial/${angular-translate-loader-partial.version}/angular-translate-loader-partial.js"></script>
     <!--main angular application-->
     <script src="js/app.js"></script>
     <!--services-->

http://git-wip-us.apache.org/repos/asf/syncope/blob/e5eed43a/client/enduser/src/main/resources/META-INF/resources/app/js/app.js
----------------------------------------------------------------------
diff --git a/client/enduser/src/main/resources/META-INF/resources/app/js/app.js b/client/enduser/src/main/resources/META-INF/resources/app/js/app.js
index 3f356c9..cd2247a 100644
--- a/client/enduser/src/main/resources/META-INF/resources/app/js/app.js
+++ b/client/enduser/src/main/resources/META-INF/resources/app/js/app.js
@@ -18,13 +18,11 @@
  **/
 
 'use strict';
-
 angular.module('home', []);
 angular.module('login', []);
 angular.module('language', []);
 angular.module('self', []);
 angular.module('info', []);
-
 // Declare app level module which depends on views, and components
 var app = angular.module('SyncopeEnduserApp', [
   'ui.router',
@@ -41,11 +39,21 @@ var app = angular.module('SyncopeEnduserApp', [
   'login',
   'language',
   'self',
-  'info'
+  'info',
+  'pascalprecht.translate'
 ]);
 
-app.config(['$stateProvider', '$urlRouterProvider', '$httpProvider',
-  function ($stateProvider, $urlRouterProvider, $httpProvider) {
+app.config(['$stateProvider', '$urlRouterProvider', '$httpProvider', '$translateProvider', '$translatePartialLoaderProvider',
+  function ($stateProvider, $urlRouterProvider, $httpProvider, $translateProvider, $translatePartialLoaderProvider) {
+
+    // translate provider configuration
+    $translatePartialLoaderProvider.addPart('static')
+            .addPart('dynamic');
+    $translateProvider.useLoader('$translatePartialLoader', {
+      urlTemplate: 'languages/{lang}/{part}.json'
+    })
+            .preferredLanguage('en');
+
     // route configuration
     $stateProvider
             .state('home', {
@@ -63,7 +71,7 @@ app.config(['$stateProvider', '$urlRouterProvider', '$httpProvider',
               resolve: {
                 'authenticated': ['AuthService',
                   function (AuthService) {
-                    return AuthService.islogged()
+                    return AuthService.islogged();
                   }]
               }
             })
@@ -197,19 +205,15 @@ app.config(['$stateProvider', '$urlRouterProvider', '$httpProvider',
               url: '/mustchangepassword',
               templateUrl: 'views/mustchangepassword.html'
             });
-
     // catch all other routes
     // send users to the home page 
     $urlRouterProvider.otherwise('/');
-
     // HTTP service configuration
     $httpProvider.defaults.withCredentials = true;
     $httpProvider.defaults.xsrfCookieName = 'XSRF-TOKEN';
     $httpProvider.defaults.xsrfHeaderName = 'X-XSRF-TOKEN';
-
     //SYNCOPE-780
     $httpProvider.defaults.headers.common["If-Modified-Since"] = "0";
-
     $httpProvider.interceptors.push(function ($q, $rootScope, $location) {
       return {
         'request': function (config, a, b) {
@@ -219,7 +223,6 @@ app.config(['$stateProvider', '$urlRouterProvider', '$httpProvider',
             var separator = config.url.indexOf('?') === -1 ? '?' : '&';
             config.url = config.url + separator + 'noCache=' + new Date().getTime();
           }
-
           $rootScope.spinner.on();
           return config || $q.when(config);
         },
@@ -246,9 +249,7 @@ app.config(['$stateProvider', '$urlRouterProvider', '$httpProvider',
         }
       };
     });
-
   }]);
-
 app.run(['$rootScope', '$location', '$cookies', '$state', 'AuthService',
   function ($rootScope, $location, $cookies, $state, AuthService) {
     // main program
@@ -259,14 +260,11 @@ app.run(['$rootScope', '$location', '$cookies', '$state', 'AuthService',
         $location.path('/self');
       }
     });
-
     $rootScope.$on('$stateChangeSuccess', function (event, toState) {
       if (toState.name === 'create') {
         $state.go('create.credentials');
-
       } else if (toState.name === 'update') {
         $state.go('update.credentials');
-
       } else if (toState.name.indexOf("update") > -1) {
         AuthService.islogged().then(function (response) {
           if (response === "true") {
@@ -279,7 +277,6 @@ app.run(['$rootScope', '$location', '$cookies', '$state', 'AuthService',
           $state.go('self');
         }
         );
-
       } else if (toState.name === 'home' || toState.name === 'self') {
         AuthService.islogged().then(function (response) {
           if (response === "true") {
@@ -296,7 +293,6 @@ app.run(['$rootScope', '$location', '$cookies', '$state', 'AuthService',
         $state.go(toState);
       }
     });
-
     $rootScope.spinner = {
       active: false,
       on: function () {
@@ -307,7 +303,6 @@ app.run(['$rootScope', '$location', '$cookies', '$state', 'AuthService',
       }
     };
   }]);
-
 app.controller('ApplicationController', ['$scope', '$rootScope', 'InfoService', function ($scope, $rootScope,
           InfoService) {
     // get syncope info and set cookie, first call
@@ -331,7 +326,6 @@ app.controller('ApplicationController', ['$scope', '$rootScope', 'InfoService',
               function (response) {
                 console.error("Something went wrong while accessing info resource", response);
               });
-
       $rootScope.isSelfRegAllowed = function () {
         return $rootScope.selfRegAllowed === true;
       };
@@ -341,7 +335,6 @@ app.controller('ApplicationController', ['$scope', '$rootScope', 'InfoService',
       $rootScope.getVersion = function () {
         return $rootScope.version;
       };
-
       //Notification management           
       $scope.notification = $('#notifications').kendoNotification().data("kendoNotification");
       $scope.notification.setOptions({stacking: "down"});

http://git-wip-us.apache.org/repos/asf/syncope/blob/e5eed43a/client/enduser/src/main/resources/META-INF/resources/app/js/controllers/LanguageController.js
----------------------------------------------------------------------
diff --git a/client/enduser/src/main/resources/META-INF/resources/app/js/controllers/LanguageController.js b/client/enduser/src/main/resources/META-INF/resources/app/js/controllers/LanguageController.js
index 621b5d0..14e3acc 100644
--- a/client/enduser/src/main/resources/META-INF/resources/app/js/controllers/LanguageController.js
+++ b/client/enduser/src/main/resources/META-INF/resources/app/js/controllers/LanguageController.js
@@ -22,15 +22,6 @@
 angular.module('language')
         .controller('LanguageController', function ($scope) {
 
-          $scope.languages = {
-            availableLanguages: [
-              {id: '1', name: 'Italiano'},
-              {id: '2', name: 'English'},
-              {id: '3', name: 'Portugese'}
-            ],
-            selectedLanguage: {id: '2', name: 'English'}
-          };
-
           $scope.init = function () {
 //            MainService.settings().then(function (response) {
 //              $scope.mainSettings = response;

http://git-wip-us.apache.org/repos/asf/syncope/blob/e5eed43a/client/enduser/src/main/resources/META-INF/resources/app/js/controllers/LoginController.js
----------------------------------------------------------------------
diff --git a/client/enduser/src/main/resources/META-INF/resources/app/js/controllers/LoginController.js b/client/enduser/src/main/resources/META-INF/resources/app/js/controllers/LoginController.js
index a5418d8..41228c2 100644
--- a/client/enduser/src/main/resources/META-INF/resources/app/js/controllers/LoginController.js
+++ b/client/enduser/src/main/resources/META-INF/resources/app/js/controllers/LoginController.js
@@ -18,16 +18,23 @@
  */
 
 'use strict';
-
 angular.module("login").controller("LoginController", ['$scope', '$rootScope', '$http', '$location', '$cookies',
-  'AuthService', function ($scope, $rootScope, $http, $location, $cookies, AuthService) {
+  'AuthService', '$translate', '$translatePartialLoader', function ($scope, $rootScope, $http,
+          $location, $cookies, AuthService, $translate) {
 
     $scope.credentials = {
       username: '',
       password: '',
       errorMessage: ''
     };
-
+    $scope.languages = {
+      availableLanguages: [
+        {id: '1', name: 'Italiano', code: 'it'},
+        {id: '2', name: 'English', code: 'en'},
+        {id: '3', name: 'Deutsch', code: 'de'}
+      ],
+      selectedLanguage: {id: '2', name: 'English', code: 'en'}
+    };
     $scope.login = function (credentials) {
 
       AuthService.login($scope.credentials).then(function (user) {
@@ -48,7 +55,6 @@ angular.module("login").controller("LoginController", ['$scope', '$rootScope', '
         $scope.showError($scope.credentials.errorMessage, $scope.notification);
       });
     };
-
     $scope.logout = function () {
       AuthService.logout().then(function (response) {
         console.info("Logout successfully");
@@ -56,7 +62,6 @@ angular.module("login").controller("LoginController", ['$scope', '$rootScope', '
         console.info("Logout failed: ", response);
       });
     };
-
     $scope.islogged = function () {
       AuthService.islogged().then(function (response) {
         console.debug("user login status detected", response);
@@ -65,30 +70,29 @@ angular.module("login").controller("LoginController", ['$scope', '$rootScope', '
         console.error("error retrieving user login status", response);
       });
     };
-
     $scope.selfCreate = function () {
       $location.path("/self/create");
     };
-
     $scope.passwordReset = function () {
       $location.path("/passwordreset");
     };
-
     $scope.errorAPI = function () {
       $http.get("/syncope-enduser/api/error").success(function (data) {
         console.debug("errorAPI response: ", data);
       });
     };
-
     $scope.sampleAPI = function () {
       $http.get("/syncope-enduser/api/user-self").success(function (data) {
         console.debug("sampleAPI response: ", data);
       });
     };
-
     $scope.schemaAPI = function () {
       $http.get("/syncope-enduser/api/schema").success(function (data) {
         console.debug("schemaAPI response: ", data);
       });
     };
+    $scope.switchLanguage = function () {
+      console.log('$scope.languages.selectedLanguage', $scope.languages.selectedLanguage.code);
+      $translate.use($scope.languages.selectedLanguage.code);
+    };
   }]);

http://git-wip-us.apache.org/repos/asf/syncope/blob/e5eed43a/client/enduser/src/main/resources/META-INF/resources/app/js/lib/angular-translate-loader-static-files.js
----------------------------------------------------------------------
diff --git a/client/enduser/src/main/resources/META-INF/resources/app/js/lib/angular-translate-loader-static-files.js b/client/enduser/src/main/resources/META-INF/resources/app/js/lib/angular-translate-loader-static-files.js
new file mode 100644
index 0000000..8b22fb7
--- /dev/null
+++ b/client/enduser/src/main/resources/META-INF/resources/app/js/lib/angular-translate-loader-static-files.js
@@ -0,0 +1,126 @@
+/* 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/*!
+ * angular-translate - v2.11.0 - 2016-03-20
+ * 
+ * Copyright (c) 2016 The angular-translate team, Pascal Precht; Licensed MIT
+ */
+(function (root, factory) {
+  if (typeof define === 'function' && define.amd) {
+    // AMD. Register as an anonymous module unless amdModuleId is set
+    define([], function () {
+      return (factory());
+    });
+  } else if (typeof exports === 'object') {
+    // Node. Does not work with strict CommonJS, but
+    // only CommonJS-like environments that support module.exports,
+    // like Node.
+    module.exports = factory();
+  } else {
+    factory();
+  }
+}(this, function () {
+
+$translateStaticFilesLoader.$inject = ['$q', '$http'];
+angular.module('pascalprecht.translate')
+/**
+ * @ngdoc object
+ * @name pascalprecht.translate.$translateStaticFilesLoader
+ * @requires $q
+ * @requires $http
+ *
+ * @description
+ * Creates a loading function for a typical static file url pattern:
+ * "lang-en_US.json", "lang-de_DE.json", etc. Using this builder,
+ * the response of these urls must be an object of key-value pairs.
+ *
+ * @param {object} options Options object, which gets prefix, suffix and key.
+ */
+.factory('$translateStaticFilesLoader', $translateStaticFilesLoader);
+
+function $translateStaticFilesLoader($q, $http) {
+
+  'use strict';
+
+  return function (options) {
+
+    if (!options || (!angular.isArray(options.files) && (!angular.isString(options.prefix) || !angular.isString(options.suffix)))) {
+      throw new Error('Couldn\'t load static files, no files and prefix or suffix specified!');
+    }
+
+    if (!options.files) {
+      options.files = [{
+        prefix: options.prefix,
+        suffix: options.suffix
+      }];
+    }
+
+    var load = function (file) {
+      if (!file || (!angular.isString(file.prefix) || !angular.isString(file.suffix))) {
+        throw new Error('Couldn\'t load static file, no prefix or suffix specified!');
+      }
+
+      return $http(angular.extend({
+        url: [
+          file.prefix,
+          options.key,
+          file.suffix
+        ].join(''),
+        method: 'GET',
+        params: ''
+      }, options.$http))
+        .then(function(result) {
+          return result.data;
+        }, function () {
+          return $q.reject(options.key);
+        });
+    };
+
+    var promises = [],
+        length = options.files.length;
+
+    for (var i = 0; i < length; i++) {
+      promises.push(load({
+        prefix: options.files[i].prefix,
+        key: options.key,
+        suffix: options.files[i].suffix
+      }));
+    }
+
+    return $q.all(promises)
+      .then(function (data) {
+        var length = data.length,
+            mergedData = {};
+
+        for (var i = 0; i < length; i++) {
+          for (var key in data[i]) {
+            mergedData[key] = data[i][key];
+          }
+        }
+
+        return mergedData;
+      });
+  };
+}
+
+$translateStaticFilesLoader.displayName = '$translateStaticFilesLoader';
+return 'pascalprecht.translate';
+
+}));

http://git-wip-us.apache.org/repos/asf/syncope/blob/e5eed43a/client/enduser/src/main/resources/META-INF/resources/app/languages/de/dynamic.json
----------------------------------------------------------------------
diff --git a/client/enduser/src/main/resources/META-INF/resources/app/languages/de/dynamic.json b/client/enduser/src/main/resources/META-INF/resources/app/languages/de/dynamic.json
new file mode 100644
index 0000000..452a4e3
--- /dev/null
+++ b/client/enduser/src/main/resources/META-INF/resources/app/languages/de/dynamic.json
@@ -0,0 +1,26 @@
+{
+  "credentials": "Referenzen",
+  "groups": "Gruppen",
+  "plainSchemas": "PlainSchemas",
+  "derivedSchemas": "DerivedSchemas",
+  "virtualSchemas": "VirtualSchemas",
+  "resources": "Ressourcen",
+  "finish": "Finish",
+  "fullname": "vollst�ndiger Name",
+  "userId": "benutzer Id",
+  "loginDate": "login Datum",
+  "firstname": "name",
+  "surname": "familien-oder nachname",
+  "ctype": "ctype",
+  "email": "email",
+  "activationDate": "aktivierungsdatum ",
+  "uselessReadonly": "uselessReadonly",
+  "cool": "cool",
+  "gender": "geschlecht",
+  "aLong": "aLong",
+  "makeItDouble": "makeItDouble",
+  "obscure": "obscure",
+  "photo": "foto",
+  "GROUPS": "Gruppen",
+  "AUXILIARY CLASSES": "Hilfsklassen"
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/e5eed43a/client/enduser/src/main/resources/META-INF/resources/app/languages/de/static.json
----------------------------------------------------------------------
diff --git a/client/enduser/src/main/resources/META-INF/resources/app/languages/de/static.json b/client/enduser/src/main/resources/META-INF/resources/app/languages/de/static.json
new file mode 100644
index 0000000..4adba5b
--- /dev/null
+++ b/client/enduser/src/main/resources/META-INF/resources/app/languages/de/static.json
@@ -0,0 +1,42 @@
+{
+  "USER": "Benutzer",
+  "CHOSENLANGUAGE": "Gew�hlte sprache",
+  "CAPTCHA": "Bitte geben sie den code im bild angezeigt.",
+  "CONFIRM_PASSWORD_RESET": "Best�tigen Sie Passwort-Reset",
+  "PASSWORD_RESET": "Passwort reset",
+  "NOTSECURE": "Nicht sicher!",
+  "ALMOSTSECURE": "Sicher, aber man k�nnte es besser machen",
+  "SUBMIT": "Einreichen",
+  "CANCEL": "Stornieren",
+  "PASSWORD_CHANGE_REQUIRED": "Passwort�nderung erforderlich",
+  "PASSWORD_CHANGE": "Passwort�nderung",
+  "CONFIRM_PASSWORD": "Best�tige das Passwort",
+  "VERYGOOD": "Sehr gut!",
+  "PASSWORD_STRENGTH": "Passwort-Sicherheit",
+  "NEXT": "N�chster",
+  "PREVIOUS": "Fr�her",
+  "USERDETAILS": "Nutzerdetails",
+  "SECURITYQUESTION": "Sicherheitsfrage",
+  "SELECTSECURITYQUESTION": "W�hlen Sie die Sicherheitsfrage",
+  "SECURITYANSWER": "Sicherheitsantwort",
+  "ISREQUIRED": "Wird ben�tigt",
+  "SELFREGISTRATION": "Selbstregistrierung",
+  "PASSWORDRESET": "Passwort zur�cksetzen",
+  "USERNAME": "Benutzername",
+  "PASSWORD": "Passwort",
+  "LOGIN": "Anmeldung",
+  "LANGUAGES": "Sprachen",
+  "ENGLISH": "Englisch",
+  "ITALIAN": "Italienisch",
+  "GERMAN": "Deutsch",
+  "GROUPS": "Gruppen",
+  "AUXILIARY CLASSES": "Hilfsklassen",
+  "CREDENZIALI": "Referenzen",
+  "PLAINSCHEMAS": "PlainSchemas",
+  "DERIVEDSCHEMAS": "Abgeleitet schemen",
+  "VIRTUALSCHEMAS": "Virtuelle Schemen",
+  "RESOURCES": "Ressourcen",
+  "REALM": "Realm",
+  "NEWUSER": "Neuer benutzer"
+}
+

http://git-wip-us.apache.org/repos/asf/syncope/blob/e5eed43a/client/enduser/src/main/resources/META-INF/resources/app/languages/en/dynamic.json
----------------------------------------------------------------------
diff --git a/client/enduser/src/main/resources/META-INF/resources/app/languages/en/dynamic.json b/client/enduser/src/main/resources/META-INF/resources/app/languages/en/dynamic.json
new file mode 100644
index 0000000..2a68559
--- /dev/null
+++ b/client/enduser/src/main/resources/META-INF/resources/app/languages/en/dynamic.json
@@ -0,0 +1,24 @@
+{
+  "credentials": "Credentials",
+  "groups": "Groups",
+  "plainSchemas": "PlainSchemas",
+  "derivedSchemas": "DerivedSchemas",
+  "virtualSchemas": "VirtualSchemas",
+  "resources": "Resources",
+  "finish": "Finish",
+  "fullname": "fullname",
+  "userId": "userId",
+  "loginDate": "loginDate",
+  "firstname": "firstname",
+  "surname": "surname",
+  "ctype": "ctype",
+  "email": "email",
+  "activationDate": "activationDate",
+  "uselessReadonly": "uselessReadonly",
+  "cool": "cool",
+  "gender": "gender",
+  "aLong": "aLong",
+  "makeItDouble": "makeItDouble",
+  "obscure": "obscure",
+  "photo": "photo"
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/e5eed43a/client/enduser/src/main/resources/META-INF/resources/app/languages/en/static.json
----------------------------------------------------------------------
diff --git a/client/enduser/src/main/resources/META-INF/resources/app/languages/en/static.json b/client/enduser/src/main/resources/META-INF/resources/app/languages/en/static.json
new file mode 100644
index 0000000..44d7abd
--- /dev/null
+++ b/client/enduser/src/main/resources/META-INF/resources/app/languages/en/static.json
@@ -0,0 +1,42 @@
+{
+  "USER": "User",
+  "CHOSENLANGUAGE": "Chosen language",
+  "CAPTCHA": "Please enter the code displayed within the image.",
+  "CONFIRM_PASSWORD_RESET": "Confirm password reset",
+  "PASSWORD_RESET": "Password reset",
+  "NOTSECURE": "Not secure!",
+  "ALMOSTSECURE": "Secure, but you could do better",
+  "SUBMIT": "Submit",
+  "CANCEL": "Cancel",
+  "PASSWORD_CHANGE_REQUIRED": "Password change required",
+  "PASSWORD_CHANGE": "Password change",
+  "CONFIRM_PASSWORD": "Confirm Password",
+  "VERYGOOD": "Very Good!",
+  "PASSWORD_STRENGTH": "Password strength",
+  "NEXT": "Next",
+  "PREVIOUS": "Previous",
+  "USERDETAILS": "User Details",
+  "SECURITYQUESTION": "Security question",
+  "SELECTSECURITYQUESTION": "Select security question",
+  "SECURITYANSWER": "Security answer",
+  "ISREQUIRED": "is required",
+  "SELFREGISTRATION": "Self registration",
+  "PASSWORDRESET": "Password Reset",
+  "USERNAME": "Username",
+  "PASSWORD": "Password",
+  "LOGIN": "Login",
+  "LANGUAGES": "Languages",
+  "ENGLISH": "English",
+  "ITALIAN": "Italian",
+  "GERMAN": "German",
+  "GROUPS": "Groups",
+  "AUXILIARY CLASSES": "Auxiliary classes",
+  "CREDENZIALI": "Credentials",
+  "PLAINSCHEMAS": "PlainSchemas",
+  "DERIVEDSCHEMAS": "DerivedSchemas",
+  "VIRTUALSCHEMAS": "VirtualSchemas",
+  "RESOURCES": "Resources",
+  "REALM": "Realm",
+  "NEWUSER": "New User"
+}
+

http://git-wip-us.apache.org/repos/asf/syncope/blob/e5eed43a/client/enduser/src/main/resources/META-INF/resources/app/languages/it/dynamic.json
----------------------------------------------------------------------
diff --git a/client/enduser/src/main/resources/META-INF/resources/app/languages/it/dynamic.json b/client/enduser/src/main/resources/META-INF/resources/app/languages/it/dynamic.json
new file mode 100644
index 0000000..252c611
--- /dev/null
+++ b/client/enduser/src/main/resources/META-INF/resources/app/languages/it/dynamic.json
@@ -0,0 +1,24 @@
+{
+  "credentials": "Credenziali",
+  "groups": "Gruppi",
+  "plainSchemas": "PlainSchemas",
+  "derivedSchemas": "DerivedSchemas",
+  "virtualSchemas": "VirtualSchemas",
+  "resources": "Risorse",
+  "finish": "Fine",
+  "fullname": "nome completo",
+  "userId": "Id utente",
+  "loginDate": "data di login",
+  "firstname": "nome",
+  "surname": "cognome",
+  "ctype": "ctype",
+  "email": "email",
+  "activationDate": "data di attivazione",
+  "uselessReadonly": "uselessReadonly",
+  "cool": "cool",
+  "gender": "genere",
+  "aLong": "aLong",
+  "makeItDouble": "makeItDouble",
+  "obscure": "obscure",
+  "photo": "foto"
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/e5eed43a/client/enduser/src/main/resources/META-INF/resources/app/languages/it/static.json
----------------------------------------------------------------------
diff --git a/client/enduser/src/main/resources/META-INF/resources/app/languages/it/static.json b/client/enduser/src/main/resources/META-INF/resources/app/languages/it/static.json
new file mode 100644
index 0000000..bab13cc
--- /dev/null
+++ b/client/enduser/src/main/resources/META-INF/resources/app/languages/it/static.json
@@ -0,0 +1,40 @@
+{
+  "USER": "Utente",
+  "CHOSENLANGUAGE": "Lingua selezionata",
+  "CAPTCHA": "Inserire il codice mostrato nell'immagine.",
+  "PASSWORD_RESET": "Recupero password",
+  "NOTSECURE": "Insicura!",
+  "ALMOSTSECURE": "Sicura, ma potresti fare di meglio!",
+  "SUBMIT": "Submit",
+  "CANCEL": "Cancella",
+  "PASSWORD_CHANGE_REQUIRED": "Richiesta di cambio password",
+  "PASSWORD_CHANGE": "Cambio Password",
+  "CONFIRM_PASSWORD": "Conferma Password",
+  "PASSWORD_STRENGTH": "Sicurezza della password",
+  "VERYGOOD": "Molto bene!",
+  "NEXT": "Successivo",
+  "PREVIOUS": "Precedente",
+  "USERDETAILS": "Dettagli Utente",
+  "SECURITYQUESTION": "Domanda di sicurezza",
+  "SELECTSECURITYQUESTION": "Domanda di sicurezza",
+  "SECURITYANSWER": "Risposta di sicurezza",
+  "ISREQUIRED": "e' richiesto",
+  "SELFREGISTRATION": "Registrazione",
+  "PASSWORDRESET": "Password Reset",
+  "USERNAME": "Nome Utente",
+  "PASSWORD": "Password",
+  "LOGIN": "Login",
+  "LANGUAGES": "Linguaggi",
+  "ENGLISH": "Inglese",
+  "ITALIAN": "Italiano",
+  "GERMAN": "Tedesco",
+  "GROUPS": "Gruppi",
+  "AUXILIARY CLASSES": "Classi Ausiliari",
+  "CREDENZIALI": "CredentialI",
+  "PLAINSCHEMAS": "PlainSchemas",
+  "DERIVEDSCHEMAS": "DerivedSchemas",
+  "VIRTUALSCHEMAS": "VirtualSchemas",
+  "RESOURCES": "Risorse",
+  "NEWUSER": "Nuovo utente",
+  "REALM": "Realm"
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/syncope/blob/e5eed43a/client/enduser/src/main/resources/META-INF/resources/app/views/captcha.html
----------------------------------------------------------------------
diff --git a/client/enduser/src/main/resources/META-INF/resources/app/views/captcha.html b/client/enduser/src/main/resources/META-INF/resources/app/views/captcha.html
index f125452..c277800 100644
--- a/client/enduser/src/main/resources/META-INF/resources/app/views/captcha.html
+++ b/client/enduser/src/main/resources/META-INF/resources/app/views/captcha.html
@@ -30,7 +30,7 @@ under the License.
         <input class="form-control" style="margin:auto; max-width: 260px" type="text" ng-model="input.value"/>
       </div>
       <div>
-        <span class="help-block">Please enter the code displayed within the image.</span>
+        <span class="help-block">{{'CAPTCHA' | translate}}</span>
       </div>
     </div>
   </nav>

http://git-wip-us.apache.org/repos/asf/syncope/blob/e5eed43a/client/enduser/src/main/resources/META-INF/resources/app/views/confirmpasswordreset.html
----------------------------------------------------------------------
diff --git a/client/enduser/src/main/resources/META-INF/resources/app/views/confirmpasswordreset.html b/client/enduser/src/main/resources/META-INF/resources/app/views/confirmpasswordreset.html
index 432404b..70a94a9 100644
--- a/client/enduser/src/main/resources/META-INF/resources/app/views/confirmpasswordreset.html
+++ b/client/enduser/src/main/resources/META-INF/resources/app/views/confirmpasswordreset.html
@@ -23,7 +23,7 @@ under the License.
 
       <div>
         <div class="page-header" style="text-align: left; font-weight: 700;">
-          <span>Confirm password reset</span>
+          <span>{{'CONFIRM_PASSWORD_RESET'| translate}}</span>
         </div>
         <div class="breadcrumb-header text-center">
 
@@ -44,7 +44,7 @@ under the License.
             </div>
 
             <div id="attribute" class="form-group">
-              <label for="confirmPassword">Confirm Password</label>
+              <label for="confirmPassword">{{'CONFIRM_PASSWORD'| translate}}</label>
               <input name="password" type="password" class="form-control" equals="user.password" ng-model="confirmPassword.value"
                      placeholder="confirm password" validate="true">
               <validation-message name="password"/>
@@ -52,18 +52,18 @@ under the License.
 
             <div id="attribute" class="form-group">
               <div class="suggestions">
-                Password Strength: 
-                <span ng-if="passStrength < 50">Not secure!</span>
-                <span ng-if="passStrength >= 50 && passStrength <= 82">Secure, but you could do better!</span>
-                <span ng-if="passStrength > 82">Very Good!</span>
+                {{'PASSWORD_STRENGTH'| translate}}:
+                <span ng-if="passStrength < 50">{{'INSECURE' | translate}}</span>
+                <span ng-if="passStrength >= 50 && passStrength <= 82">{{'ALMOSTSECURE'| translate}}</span>
+                <span ng-if="passStrength > 82">{{'VERYGOOD'| translate}}</span>
               </div>
               <div ng-password-strength="user.password" strength="passStrength" inner-class="progress-bar" inner-class-prefix="progress-bar-">
               </div>
             </div>
             <div id="attribute" class="form-group row">
-              <button id="resetpassword" type="submit" class="btn btn-default pull-right">Submit</button>
+              <button id="resetpassword" type="submit" class="btn btn-default pull-right">{{'SUBMIT'| translate}}</button>
               <div class="pull-left">
-                <a id="cancel" href="#/self" class="btn btn-danger">Cancel</a>
+                <a id="cancel" href="#/self" class="btn btn-danger">{{'CANCEL'| translate}}</a>
               </div>
             </div>
           </div>

http://git-wip-us.apache.org/repos/asf/syncope/blob/e5eed43a/client/enduser/src/main/resources/META-INF/resources/app/views/dynamicPlainAttributes.html
----------------------------------------------------------------------
diff --git a/client/enduser/src/main/resources/META-INF/resources/app/views/dynamicPlainAttributes.html b/client/enduser/src/main/resources/META-INF/resources/app/views/dynamicPlainAttributes.html
index 6ca8c0e..b203fb1 100644
--- a/client/enduser/src/main/resources/META-INF/resources/app/views/dynamicPlainAttributes.html
+++ b/client/enduser/src/main/resources/META-INF/resources/app/views/dynamicPlainAttributes.html
@@ -17,10 +17,10 @@ specific language governing permissions and limitations
 under the License.
 -->
 <div id="attribute" class="form-group" ng-repeat="plainSchema in dynamicForm.plainSchemas">
-  <label for="plainSchema.key">{{plainSchema.key}} <span ng-if="plainSchema.mandatoryCondition === 'true'">*</span></label>
+  <label for="plainSchema.key">{{plainSchema.key | translate}} <span ng-if="plainSchema.mandatoryCondition === 'true'">*</span></label>
   <div ng-if="!plainSchema.multivalue">
     <dynamic-plain-attribute schema="plainSchema" user="user" index="0"></dynamic-plain-attribute>
-    <validation-message name="{{plainSchema.key}}"/>
+    <validation-message name="{{plainSchema.key | translate}}"/>
   </div>
 
   <div ng-if="plainSchema.multivalue">

http://git-wip-us.apache.org/repos/asf/syncope/blob/e5eed43a/client/enduser/src/main/resources/META-INF/resources/app/views/editUser.html
----------------------------------------------------------------------
diff --git a/client/enduser/src/main/resources/META-INF/resources/app/views/editUser.html b/client/enduser/src/main/resources/META-INF/resources/app/views/editUser.html
index 1f971ec..41c05fb 100644
--- a/client/enduser/src/main/resources/META-INF/resources/app/views/editUser.html
+++ b/client/enduser/src/main/resources/META-INF/resources/app/views/editUser.html
@@ -18,16 +18,13 @@ under the License.
 -->
 <div ng-cloak class="container">
   <div class="login-container" ng-controller="UserController" ng-init="initUser();" style="box-sizing: border-box; ">
-
     <div id="form-container" class="col-md-6 col-md-offset-3" style="box-sizing: border-box; background-color: #F7F7F7;">
-
       <div>
         <div class="page-header" style="text-align: left; font-weight: 700;">          
-          <span ng-show="createMode">New User</span>
-          <span ng-show="!createMode">User {{user.username}}</span>
+          <span ng-show="createMode">{{'NEWUSER'| translate}}</span>
+          <span ng-show="!createMode">{{'USER'| translate}} {{user.username}}</span>
         </div>
         <div class="breadcrumb-header text-center">
-
           <!-- the links to our nested states using relative paths -->
           <!-- add the active class if the state matches our ui-sref -->
           <!--<div id="status-buttons" class="text-center">-->
@@ -38,29 +35,13 @@ under the License.
               <a class="btn btn-default" ng-show="!createMode" ng-click="logout()"><i class="glyphicon glyphicon-off"style="color:red"></i></a>
               <!--add class breadcrumb-disabled-link to buttons to prevent click-->              
               <a ng-repeat="(key, value) in wizard" ui-sref-active="active" ui-sref=".{{key}}" class="btn btn-default" 
-                 ng-class="createMode ? 'disable-link' : ''">{{key}}</a>       
+                 ng-class="createMode ? 'disable-link' : ''">{{key | translate}}</a>       
             </div>
           </div>
         </div>
         <form class="signup-form" name="userForm" ng-submit="saveUser(user)" novalidate>
-
           <div id="form-views" ui-view>
-
-            <!--            <div class="form-group row">
-                          <div class="col-xs-6 col-xs-offset-3">
-                            <a id="next" ui-sref="create.credentials" class="btn btn-block btn-signin">
-                              Start <span class="glyphicon glyphicon-circle-arrow-right"></span>
-                            </a> 
-                            <a id="cancel" href="#/self" class="btn btn-link">Cancel</a>
-                          </div>
-                        </div>-->
-
           </div>
-          <!--            <div class="form-actions">
-                        <button type="submit" ng-disabled="form.$invalid || vm.dataLoading" class="btn btn-primary" ng-click="saveUser()">Register</button>
-                        <img ng-if="vm.dataLoading" src="data:image/gif;base64,R0lGODlhEAAQAPIAAP///wAAAMLCwkJCQgAAAGJiYoKCgpKSkiH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCgAAACwAAAAAEAAQAAADMwi63P4wyklrE2MIOggZnAdOmGYJRbExwroUmcG2LmDEwnHQLVsYOd2mBzkYDAdKa+dIAAAh+QQJCgAAACwAAAAAEAAQAAADNAi63P5OjCEgG4QMu7DmikRxQlFUYDEZIGBMRVsaqHwctXXf7WEYB4Ag1xjihkMZsiUkKhIAIfkECQoAAAAsAAAAABAAEAAAAzYIujIjK8pByJDMlFYvBoVjHA70GU7xSUJhmKtwHPAKzLO9HMaoKwJZ7Rf8AYPDDzKpZBqfvwQAIfkECQoAAAAsAAAAABAAEAAAAzMIumIlK8oyhpHsnFZfhYumCYUhDAQxRIdhHBGqRoKw0R8DYlJd8z0fMDgsGo/IpHI5TAAAIfkECQoAAAAsAAAAABAAEAAAAzIIunInK0rnZBTwGPNMgQwmdsNgXGJUlIWEuR5oWUIpz8pAEAMe6TwfwyYsGo/IpFKSAAAh+QQJCgAAACwAAAAAEAAQAAADMwi6IMKQORfjdOe82p4wGccc4CEuQradylesojEMBgsUc2G7sDX3lQGBMLAJibufbSlKAAAh+QQJCgAAACwAAAAAEAAQAAADMgi63P7wCRHZnFVdmgHu2nFwlWCI3WGc3TSWhUFGxTAUkGCbtgENBMJAEJsxgMLWzpEAACH5BAkKAAAALAAAAAAQABAAAAMyCLrc/jDKSatlQtScKdceCAjDII7HcQ4EMTCpyrCuUBjCYRgHVtqlAiB1YhiCnlsRkAAAOwAAAAAAAAAAAA==" />
-                        <a href="#/self" class="btn btn-link">Cancel</a>
-                      </div>-->
         </form>
       </div>
     </div>

http://git-wip-us.apache.org/repos/asf/syncope/blob/e5eed43a/client/enduser/src/main/resources/META-INF/resources/app/views/home.html
----------------------------------------------------------------------
diff --git a/client/enduser/src/main/resources/META-INF/resources/app/views/home.html b/client/enduser/src/main/resources/META-INF/resources/app/views/home.html
index b338613..1147a29 100644
--- a/client/enduser/src/main/resources/META-INF/resources/app/views/home.html
+++ b/client/enduser/src/main/resources/META-INF/resources/app/views/home.html
@@ -23,8 +23,8 @@ under the License.
     <p>{{subtitle}}</p>
     <p>{{name}}</p>
     
-    <button type="button" ng-click="">Password Reset</button>
-    <button type="button" ng-click="">Self Registration</button>
+    <button type="button" ng-click="">{{'PASSWORD_RESET' | translate}}</button>
+    <button type="button" ng-click="">{{'SELF_REGISTRATION' | translate}}</button>
     <button type="button" ng-click="">Self Update</button>
     <button type="button" ng-click="sampleAPI()">Sample</button>
     <button type="button" ng-click="errorAPI()">Error</button>

http://git-wip-us.apache.org/repos/asf/syncope/blob/e5eed43a/client/enduser/src/main/resources/META-INF/resources/app/views/mustchangepassword.html
----------------------------------------------------------------------
diff --git a/client/enduser/src/main/resources/META-INF/resources/app/views/mustchangepassword.html b/client/enduser/src/main/resources/META-INF/resources/app/views/mustchangepassword.html
index a06966c..083f988 100644
--- a/client/enduser/src/main/resources/META-INF/resources/app/views/mustchangepassword.html
+++ b/client/enduser/src/main/resources/META-INF/resources/app/views/mustchangepassword.html
@@ -23,7 +23,7 @@ under the License.
 
       <div>
         <div class="page-header" style="text-align: left; font-weight: 700;">
-          <span>Password change required</span>
+          <span>{{'PASSWORD_CHANGE_REQUIRED'| translate}}</span>
         </div>
         <div class="breadcrumb-header text-center">
 
@@ -31,7 +31,7 @@ under the License.
             <div id="status-buttons" class="btn-group btn-breadcrumb">
               <a class="btn btn-default" ng-click="logout()"><i class="glyphicon glyphicon-off"style="color:red"></i></a>
               <!--add class breadcrumb-disabled-link to buttons to prevent click-->
-              <a ui-sref-active="active" class="btn btn-default">Password change</a>
+              <a ui-sref-active="active" class="btn btn-default">{{'PASSWORD_CHANGE'| translate}}</a>
             </div>
           </div>
         </div>
@@ -39,12 +39,12 @@ under the License.
 
           <div id="form-views" ui-view>
             <div id="attribute" class="form-group">
-              <label for="user.password">Password</label>
+              <label for="user.password">{{'PASSWORD'| translate}}</label>
               <input type="password" class="form-control" name="password" ng-model="user.password" placeholder="password">
             </div>
 
             <div id="attribute" class="form-group">
-              <label for="confirmPassword">Confirm Password</label>
+              <label for="confirmPassword">{{'CONFIRM_PASSWORD'| translate}}</label>
               <input name="password" type="password" class="form-control" equals="user.password" ng-model="confirmPassword.value"
                      placeholder="confirm password" validate="true">
               <validation-message name="password"/>
@@ -52,18 +52,18 @@ under the License.
 
             <div id="attribute" class="form-group">
               <div class="suggestions">
-                Password Strength: 
-                <span ng-if="passStrength < 50">Not secure!</span>
-                <span ng-if="passStrength >= 50 && passStrength <= 82">Secure, but you could do better!</span>
-                <span ng-if="passStrength > 82">Very Good!</span>
+                {{'PASSWORD_STRENGTH'| translate}}: 
+                <span ng-if="passStrength < 50">{{'NOTSECURE'| translate}}</span>
+                <span ng-if="passStrength >= 50 && passStrength <= 82">{{'ALMOSTSECURE'| translate}}</span>
+                <span ng-if="passStrength > 82">{{'VERYGOOD'| translate}}</span>
               </div>
               <div ng-password-strength="user.password" strength="passStrength" inner-class="progress-bar" inner-class-prefix="progress-bar-">
               </div>
             </div>
             <div id="attribute" class="form-group row">
-              <button id="resetpassword" type="submit" class="btn btn-default pull-right">Submit</button>
+              <button id="resetpassword" type="submit" class="btn btn-default pull-right">{{'SUBMIT'| translate}}</button>
               <div class="pull-left">
-                <a id="cancel" href="#/self" class="btn btn-danger">Cancel</a>
+                <a id="cancel" href="#/self" class="btn btn-danger">{{'CANCEL'| translate}}</a>
               </div>
             </div>
           </div>

http://git-wip-us.apache.org/repos/asf/syncope/blob/e5eed43a/client/enduser/src/main/resources/META-INF/resources/app/views/navigationButtons.html
----------------------------------------------------------------------
diff --git a/client/enduser/src/main/resources/META-INF/resources/app/views/navigationButtons.html b/client/enduser/src/main/resources/META-INF/resources/app/views/navigationButtons.html
index b633640..98b63fa 100644
--- a/client/enduser/src/main/resources/META-INF/resources/app/views/navigationButtons.html
+++ b/client/enduser/src/main/resources/META-INF/resources/app/views/navigationButtons.html
@@ -18,9 +18,9 @@ under the License.
 -->
 <div class="pull-right">
   <a ng-show="next !== 'none'" id="next" class="btn btn-default" ng-click="validateAndNext($event)">
-    Next <span class="glyphicon glyphicon-circle-arrow-right"></span>
+    {{'NEXT' | translate}} <span class="glyphicon glyphicon-circle-arrow-right"></span>
   </a>
   <a ng-show="previous !== 'none'" id="previous" ng-click="previousTab()" class="btn btn-default">
-    <span class="glyphicon glyphicon-circle-arrow-left"></span> Previous
+    <span class="glyphicon glyphicon-circle-arrow-left"></span> {{'PREVIOUS' | translate}}
   </a>
 </div>

http://git-wip-us.apache.org/repos/asf/syncope/blob/e5eed43a/client/enduser/src/main/resources/META-INF/resources/app/views/passwordreset.html
----------------------------------------------------------------------
diff --git a/client/enduser/src/main/resources/META-INF/resources/app/views/passwordreset.html b/client/enduser/src/main/resources/META-INF/resources/app/views/passwordreset.html
index 9728cde..693d3f7 100644
--- a/client/enduser/src/main/resources/META-INF/resources/app/views/passwordreset.html
+++ b/client/enduser/src/main/resources/META-INF/resources/app/views/passwordreset.html
@@ -31,7 +31,7 @@ under the License.
             <div id="status-buttons" class="btn-group btn-breadcrumb">
               <a href="#/self" class="btn btn-default"><i class="glyphicon glyphicon-home"></i></a>
               <!--add class breadcrumb-disabled-link to buttons to prevent click-->
-              <a ui-sref-active="active" class="btn btn-default">User Details</a>
+              <a ui-sref-active="active" class="btn btn-default">{{'USERDETAILS'| translate}}</a>
             </div>
           </div>
         </div>
@@ -39,20 +39,20 @@ under the License.
 
           <div id="form-views" ui-view>
             <div id="attribute" class="form-group">
-              <label for="user.username">User</label>
+              <label for="user.username">{{'USER'| translate}}</label>
               <input name="username" type="text" class="form-control" ng-model="user.username" required 
                      placeholder="Username" ng-blur="retrieveSecurityQuestion(user)">
               <p ng-show="(userForm.username.$error.required && !userForm.username.$pristine)" 
                  class="text-validation-error">Username is required</p>
             </div>
             <div id="attribute" class="form-group" ng-show="$root.pwdResetRequiringSecurityQuestions">
-              <label for="user.securityquestion">Security Question</label> 
+              <label for="user.securityquestion">{{'SECURITYQUESTION'| translate}}</label> 
               <div class="suggestions">(Not Loading? <a href ng-click="retrieveSecurityQuestion(user)">Reload</a>)</div>
               <input name="securityquestion" type="text" class="form-control" ng-model="userSecurityQuestion" 
                      disabled="disabled">              
             </div>
             <div id="attribute" class="form-group" ng-show="$root.pwdResetRequiringSecurityQuestions">
-              <label for="user.securityanswer">Security Answer</label>
+              <label for="user.securityanswer">{{'SECURITYANSWER'| translate}}</label>
               <input name="securityanswer" type="text" class="form-control" ng-model="user.securityanswer" 
                      placeholder="Security Answer" >              
             </div>
@@ -61,9 +61,9 @@ under the License.
               <div class="form-group row">
                 <captcha input="captchaInput" enabled="captchaEnabled"></captcha>
               </div>
-              <button id="resetpassword" type="submit" class="btn btn-default pull-right">Submit</button>
+              <button id="resetpassword" type="submit" class="btn btn-default pull-right">{{'SUBMIT'| translate}}</button>
               <div class="pull-left">
-                <a id="cancel" href="#/self" class="btn btn-danger">Cancel</a>
+                <a id="cancel" href="#/self" class="btn btn-danger">{{'CANCEL'| translate}}</a>
               </div>
             </div>
           </div>

http://git-wip-us.apache.org/repos/asf/syncope/blob/e5eed43a/client/enduser/src/main/resources/META-INF/resources/app/views/requiredMessage.html
----------------------------------------------------------------------
diff --git a/client/enduser/src/main/resources/META-INF/resources/app/views/requiredMessage.html b/client/enduser/src/main/resources/META-INF/resources/app/views/requiredMessage.html
index 191afdf..341dc9a 100644
--- a/client/enduser/src/main/resources/META-INF/resources/app/views/requiredMessage.html
+++ b/client/enduser/src/main/resources/META-INF/resources/app/views/requiredMessage.html
@@ -18,5 +18,5 @@ specific language governing permissions and limitations
 under the License.
 -->
 <div ng-switch-when="required">
-{{fieldName}} is required 
+{{fieldName}} {{'ISREQUIRED'| translate}} 
 </div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/syncope/blob/e5eed43a/client/enduser/src/main/resources/META-INF/resources/app/views/self.html
----------------------------------------------------------------------
diff --git a/client/enduser/src/main/resources/META-INF/resources/app/views/self.html b/client/enduser/src/main/resources/META-INF/resources/app/views/self.html
index 482fedd..e48d10b 100644
--- a/client/enduser/src/main/resources/META-INF/resources/app/views/self.html
+++ b/client/enduser/src/main/resources/META-INF/resources/app/views/self.html
@@ -21,95 +21,48 @@ under the License.
     <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
     <meta charset="UTF-8"/>
     <meta content='width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no' name='viewport'/>
-
     <title>Apache Syncope Enduser - Login</title>
   </head>
-
   <body>
-
     <div ng-cloak class="container">
-
-      <div id="login-container" ng-controller="LoginController"  style="box-sizing: border-box; ">
-
-        <!--        <div id="logo">
-                  <a href="/">
-                    <img class="login-logo" src="img/logo-green.png" />
-                  </a>
-                </div>-->
+      <div id="login-container" ng-controller="LoginController"  ng-init="init" style="box-sizing: border-box; ">
         <div id="login" class="card card-container">
           <div>
-            <!--<div id="language" class="form-group" ng-controller="LanguageController" ng-init="init()">
-              <div id="languageContainer" class="col-xs-2">
-
-                <select class="form-control" ng-options="language.name for language in languages.availableLanguages track by language.id"
-                        ng-model="languages.selectedLanguage" ></select>
-
-              </div>
-            </div>-->
-
             <img class="login-logo" src="img/logo-green.png" />
-
             <div id="login-form" class="form">              
             </div>
-
             <form id="login-form" class="form form-signin" novalidate>
-
               <fieldset class="form-group input-group">
-
                 <div class="form-group">
                   <input autofocus="autofocus" type="text" class="form-control" id="login-username" placeholder="Username"
                          ng-required ng-model="credentials.username" placeholder="username">
                 </div>
-
                 <div class="form-group">
                   <input type="password" class="form-control" id="login-password" placeholder="Password" 
                          ng-required ng-model="credentials.password" placeholder="password">
                 </div>
-
                 <div class="form-group">
-
+                  <select  ng-change="switchLanguage()" id="language" style="width: 100%" class="btn dropdown-toggle btn-default" 
+                           ng-options="language.name for language in languages.availableLanguages track by language.id" 
+                           ng-model="languages.selectedLanguage"></select>
+                </div>                
+                <div class="form-group">
                   <button type="submit" id="login-btn" class="btn btn-default btn-signin login-btn" 
                           ng-click="login(credentials)">Login</button>
                 </div>
               </fieldset>
             </form>
-
           </div>
-
         </div>
         <div class="text-center" ng-show="$root.isSelfRegAllowed()">
-          <a href="javascript:void(0);" class="btn btn-link" ng-click="selfCreate()">Self Registration</a>
-
-          <!--      <div id="initialLoaderDiv">
-                  <img src="img/busy.gif" class="ajax-loader"/>
-                </div>-->
+          <a href="javascript:void(0);" class="btn btn-link" ng-click="selfCreate()">
+            {{ 'SELFREGISTRATION' | translate}}
+          </a>
         </div>
         <div class="text-center" ng-show="$root.isPwdResetAllowed()">
           <a href="javascript:void(0);" class="btn btn-link" ng-click="passwordReset()">Password Reset</a>
         </div>
-        <!-- /#login-container -->
       </div> <!-- /#login -->
     </div>
-    <!--    <div class="container" ng-cloak ng-controller="LoginController">
-          <div class="card card-container">
-            <img class="login-logo" src="img/logo-green.png" />
-    
-            <div growl></div>
-    
-            <form class="form-signin"  novalidate ng-show="!isLogged()">
-              <input type="text" id="username" class="form-control" ng-required autofocus="autofocus" ng-model="credentials.username" />
-              <input type="password" id="password" class="form-control" required="required" ng-model="credentials.password" />
-    
-              <select id="language" style="width: 100%" 
-                      ng-options="language.name for language in languages.availableLanguages track by language.id" 
-                      ng-model="languages.selectedLanguage"></select>
-    
-              <button type="submit" class="btn btn-lg btn-primary btn-block btn-signin" ng-click="login(credentials)">Login</button>
-            </form>
-    
-            
-    
-          </div>
-        </div>-->
   </body>
 </html>

http://git-wip-us.apache.org/repos/asf/syncope/blob/e5eed43a/client/enduser/src/main/resources/META-INF/resources/app/views/user-credentials.html
----------------------------------------------------------------------
diff --git a/client/enduser/src/main/resources/META-INF/resources/app/views/user-credentials.html b/client/enduser/src/main/resources/META-INF/resources/app/views/user-credentials.html
index a09ab98..f993d4d 100644
--- a/client/enduser/src/main/resources/META-INF/resources/app/views/user-credentials.html
+++ b/client/enduser/src/main/resources/META-INF/resources/app/views/user-credentials.html
@@ -17,18 +17,18 @@ specific language governing permissions and limitations
 under the License.
 -->
 <div id="attribute" class="form-group">
-  <label for="user.username">Username <span>*</span></label>
+  <label for="user.username">{{'USERNAME' | translate}} <span>*</span></label>
   <input name="username" type="text" class="form-control" ng-model="user.username" required placeholder="username" validate="true"/>
   <validation-message name="username" template="requiredMessage" />
 </div>
 
 <div id="attribute" class="form-group">
-  <label for="user.password">Password</label>
+  <label for="user.password">{{"PASSWORD"|translate}}</label>
   <input type="password" class="form-control" name="password" ng-model="user.password" placeholder="password">
 </div>
 
 <div id="attribute" class="form-group">
-  <label for="confirmPassword">Confirm Password</label>
+  <label for="confirmPassword">{{'CONFIRM_PASSWORD'| translate}}</label>
   <input name="password" type="password" class="form-control" equals="user.password" ng-model="confirmPassword.value"
          placeholder="confirm password" validate="true">
   <validation-message name="password"/>
@@ -36,26 +36,26 @@ under the License.
 
 <div id="attribute" class="form-group">
   <div class="suggestions">
-    Password Strength: 
-    <span ng-if="passStrength < 50">Not secure!</span>
-    <span ng-if="passStrength >= 50 && passStrength <= 82">Secure, but you could do better!</span>
-    <span ng-if="passStrength > 82">Very Good!</span>
+   {{'PASSWORD_STRENGTH' | translate}}: 
+    <span ng-if="passStrength < 50">{{'NOTSECURE' | translate}}</span>
+    <span ng-if="passStrength >= 50 && passStrength <= 82">{{'ALMOSTSECURE' | translate}}</span>
+    <span ng-if="passStrength > 82">{{'VERYGOOD'| translate}}</span>
   </div>
   <div ng-password-strength="user.password" strength="passStrength" inner-class="progress-bar" inner-class-prefix="progress-bar-">
   </div>
 </div>
 
 <div id="attribute" class="form-group">
-  <label for="securityQuestion">Security Question</label>
+  <label for="securityQuestion">{{'SECURITYQUESTION' | translate}}</label>
   <select name="securityQuestion" class="form-control"
           ng-model="user.securityQuestion"
           ng-options="securityQuestion.key as securityQuestion.content for securityQuestion in availableSecurityQuestions">
-    <option value="">Select security question</option>
+    <option value="">{{'SELECTSECURITYQUESTION' | translate}}</option>
   </select>
 </div>
 
 <div id="attribute" class="form-group">
-  <label for="securityAnswer">Security Answer</label>
+  <label for="securityAnswer">{{'SECURITYANSWER' | translate}}</label>
   <input ng-disabled="user.securityQuestion === initialSecurityQuestion" name="securityAnswer" type="text" class="form-control" 
          ng-model="user.securityAnswer"
          placeholder="security answer">
@@ -65,6 +65,6 @@ under the License.
   <navigation-buttons ng-show="createMode" base="create" current="credentials" wizard="{{wizard}}"></navigation-buttons>
   <navigation-buttons ng-show="!createMode" base= "update" current="credentials" wizard="{{wizard}}"></navigation-buttons>
   <div class="pull-left">
-    <a id="cancel" href="#/self" class="btn btn-danger pull-left" ng-click="logout()">Cancel</a>
+    <a id="cancel" href="#/self" class="btn btn-danger pull-left" ng-click="logout()">{{'CANCEL' | translate}}</a>
   </div>
 </div>

http://git-wip-us.apache.org/repos/asf/syncope/blob/e5eed43a/client/enduser/src/main/resources/META-INF/resources/app/views/user-derived-schemas.html
----------------------------------------------------------------------
diff --git a/client/enduser/src/main/resources/META-INF/resources/app/views/user-derived-schemas.html b/client/enduser/src/main/resources/META-INF/resources/app/views/user-derived-schemas.html
index b764352..4f53652 100644
--- a/client/enduser/src/main/resources/META-INF/resources/app/views/user-derived-schemas.html
+++ b/client/enduser/src/main/resources/META-INF/resources/app/views/user-derived-schemas.html
@@ -24,6 +24,6 @@ under the License.
   <navigation-buttons ng-show="createMode" base="create" current="derivedSchemas" wizard="{{wizard}}"></navigation-buttons>
   <navigation-buttons ng-show="!createMode" base="update" current="derivedSchemas" wizard="{{wizard}}"></navigation-buttons>
   <div class="pull-left">
-    <a id="cancel" href="#/self" class="btn btn-danger" ng-click="logout()">Cancel</a>
+    <a id="cancel" href="#/self" class="btn btn-danger" ng-click="logout()">{{'CANCEL' | translate}}</a>
   </div>
 </div>

http://git-wip-us.apache.org/repos/asf/syncope/blob/e5eed43a/client/enduser/src/main/resources/META-INF/resources/app/views/user-form-finish.html
----------------------------------------------------------------------
diff --git a/client/enduser/src/main/resources/META-INF/resources/app/views/user-form-finish.html b/client/enduser/src/main/resources/META-INF/resources/app/views/user-form-finish.html
index 5c6465c..8944ef7 100644
--- a/client/enduser/src/main/resources/META-INF/resources/app/views/user-form-finish.html
+++ b/client/enduser/src/main/resources/META-INF/resources/app/views/user-form-finish.html
@@ -25,6 +25,6 @@ under the License.
   <navigation-buttons ng-show="createMode" base="create" current="finish" wizard="{{wizard}}"></navigation-buttons>
   <navigation-buttons ng-show="!createMode" base="update" current="finish" wizard="{{wizard}}"></navigation-buttons>
   <div class="pull-left">
-    <a id="cancel" href="#/self" class="btn btn-danger" ng-click="logout()">Cancel</a>
+    <a id="cancel" href="#/self" class="btn btn-danger" ng-click="logout()">{{'CANCEL' | translate}}</a>
   </div>
 </div>

http://git-wip-us.apache.org/repos/asf/syncope/blob/e5eed43a/client/enduser/src/main/resources/META-INF/resources/app/views/user-groups.html
----------------------------------------------------------------------
diff --git a/client/enduser/src/main/resources/META-INF/resources/app/views/user-groups.html b/client/enduser/src/main/resources/META-INF/resources/app/views/user-groups.html
index 63d6855..7f28dd5 100644
--- a/client/enduser/src/main/resources/META-INF/resources/app/views/user-groups.html
+++ b/client/enduser/src/main/resources/META-INF/resources/app/views/user-groups.html
@@ -17,7 +17,7 @@ specific language governing permissions and limitations
 under the License.
 -->
 <div id="attribute" class="form-group row upper-select">
-  <label>Realm</label>
+  <label>{{"REALM"|translate}}</label>
   <select class="form-control"
           ng-disabled="true"
           ng-model="user.realm"
@@ -26,17 +26,17 @@ under the License.
   </select>
 </div>
 <div id="attribute" class="form-group row upper-select">
-  <label>Groups</label><br/>
+  <label>{{"GROUPS"|translate}}</label><br/>
   <groups form="dynamicForm" user="user"></groups>
 </div>
 <div id="attribute" class="form-group row upper-select">
-  <label>Auxilary Classes</label><br/>
+  <label>{{"AUXILIARY CLASSES"|translate}}</label><br/>
   <auxiliary form="dynamicForm" user="user"></auxiliary>
 </div>
 <div id="attribute" class="form-group row">
   <navigation-buttons ng-show="createMode" base="create" current="groups" wizard="{{wizard}}"></navigation-buttons>
   <navigation-buttons ng-show="!createMode" base="update" current="groups" wizard="{{wizard}}"></navigation-buttons>
   <div class="pull-left">
-    <a id="cancel" href="#/self" class="btn btn-danger pull-left" ng-click="logout()">Cancel</a>
+    <a id="cancel" href="#/self" class="btn btn-danger pull-left" ng-click="logout()">{{'CANCEL'| translate}}</a>
   </div>
 </div>

http://git-wip-us.apache.org/repos/asf/syncope/blob/e5eed43a/client/enduser/src/main/resources/META-INF/resources/app/views/user-plain-schemas.html
----------------------------------------------------------------------
diff --git a/client/enduser/src/main/resources/META-INF/resources/app/views/user-plain-schemas.html b/client/enduser/src/main/resources/META-INF/resources/app/views/user-plain-schemas.html
index ef2fb57..7a9dd88 100644
--- a/client/enduser/src/main/resources/META-INF/resources/app/views/user-plain-schemas.html
+++ b/client/enduser/src/main/resources/META-INF/resources/app/views/user-plain-schemas.html
@@ -24,6 +24,6 @@ under the License.
   <navigation-buttons ng-show="createMode" base="create" current="plainSchemas" wizard="{{wizard}}"></navigation-buttons>
   <navigation-buttons ng-show="!createMode" base="update" current="plainSchemas" wizard="{{wizard}}"></navigation-buttons>
   <div class="pull-left">
-    <a id="cancel" href="#/self" class="btn btn-danger pull-left" ng-click="logout()">Cancel</a>
+    <a id="cancel" href="#/self" class="btn btn-danger pull-left" ng-click="logout()">{{'CANCEL' | translate}}</a>
   </div>
 </div>

http://git-wip-us.apache.org/repos/asf/syncope/blob/e5eed43a/client/enduser/src/main/resources/META-INF/resources/app/views/user-resources.html
----------------------------------------------------------------------
diff --git a/client/enduser/src/main/resources/META-INF/resources/app/views/user-resources.html b/client/enduser/src/main/resources/META-INF/resources/app/views/user-resources.html
index f0eb228..ca45d79 100644
--- a/client/enduser/src/main/resources/META-INF/resources/app/views/user-resources.html
+++ b/client/enduser/src/main/resources/META-INF/resources/app/views/user-resources.html
@@ -23,6 +23,6 @@ under the License.
   <navigation-buttons ng-show="createMode" base="create" current="resources" wizard="{{wizard}}"></navigation-buttons>
   <navigation-buttons ng-show="!createMode" base="update" current="resources" wizard="{{wizard}}"></navigation-buttons>
   <div class="pull-left">
-    <a id="cancel" href="#/self" class="btn btn-danger" ng-click="logout()">Cancel</a>
+    <a id="cancel" href="#/self" class="btn btn-danger" ng-click="logout()">{{'CANCEL'| translate}}</a>
   </div>
 </div>

http://git-wip-us.apache.org/repos/asf/syncope/blob/e5eed43a/client/enduser/src/main/resources/META-INF/resources/app/views/user-virtual-schemas.html
----------------------------------------------------------------------
diff --git a/client/enduser/src/main/resources/META-INF/resources/app/views/user-virtual-schemas.html b/client/enduser/src/main/resources/META-INF/resources/app/views/user-virtual-schemas.html
index 6e72ba6..b40c4c2 100644
--- a/client/enduser/src/main/resources/META-INF/resources/app/views/user-virtual-schemas.html
+++ b/client/enduser/src/main/resources/META-INF/resources/app/views/user-virtual-schemas.html
@@ -25,6 +25,6 @@ under the License.
   <navigation-buttons ng-show="createMode" base="create" current="virtualSchemas" wizard="{{wizard}}"></navigation-buttons>
   <navigation-buttons ng-show="!createMode" base="update" current="virtualSchemas" wizard="{{wizard}}"></navigation-buttons>
   <div class="pull-left">
-    <a id="cancel" href="#/self" class="btn btn-danger" ng-click="logout()">Cancel</a>
+    <a id="cancel" href="#/self" class="btn btn-danger" ng-click="logout()">{{'CANCEL' | translate}}</a>
   </div>
 </div>

http://git-wip-us.apache.org/repos/asf/syncope/blob/e5eed43a/deb/enduser/LICENSE
----------------------------------------------------------------------
diff --git a/deb/enduser/LICENSE b/deb/enduser/LICENSE
index e30e921..91decd5 100644
--- a/deb/enduser/LICENSE
+++ b/deb/enduser/LICENSE
@@ -753,6 +753,11 @@ This is licensed under the MIT license, see above.
 
 ==
 
+For Angular Translate (https://angular-translate.github.io/):
+This is licensed under the MIT license, see above.
+
+==
+
 For ng-password-strength (https://github.com/subarroca/ng-password-strength):
 This is licensed under the MIT license, see above.
 
@@ -763,7 +768,6 @@ This is licensed under the MIT license, see above.
 
 ==
 
-
 For Web Services Description Language for Java (http://wsdl4j.sourceforge.net/):
 This is licensed under the CPL:
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/e5eed43a/deb/enduser/NOTICE
----------------------------------------------------------------------
diff --git a/deb/enduser/NOTICE b/deb/enduser/NOTICE
index 0b62425..71a2b40 100644
--- a/deb/enduser/NOTICE
+++ b/deb/enduser/NOTICE
@@ -122,6 +122,11 @@ Copyright (c) 2014-2016 Google, Inc. http://angular.io
 
 ==
 
+This product includes software developed by the Angular Translate project.
+Copyright (c) <2014> <pa...@gmail.com>
+
+==
+
 This product contains unmodified binary redistributions for H2 database engine,
 which is dual licensed and available under a modified version of the MPL 1.1 (Mozilla Public License) or under the
 (unmodified) EPL 1.0 (Eclipse Public License).

http://git-wip-us.apache.org/repos/asf/syncope/blob/e5eed43a/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 949149d..c47c186 100644
--- a/pom.xml
+++ b/pom.xml
@@ -404,6 +404,8 @@ under the License.
     <angular-ui-bootstrap.version>1.3.3</angular-ui-bootstrap.version>
     <angular-ui-select.version>0.17.1</angular-ui-select.version>
     <angular-treasure-overlay-spinner.version>1.1.0</angular-treasure-overlay-spinner.version>
+    <angular-translate.version>2.11.0</angular-translate.version>
+    
     <ng-password-strength.version>0.2.1</ng-password-strength.version>
     <lodash.version>4.0.0</lodash.version>
     <kendo-ui-core.version>2014.2.716</kendo-ui-core.version>
@@ -1177,6 +1179,16 @@ under the License.
       </dependency>
       <dependency>
         <groupId>org.webjars.bower</groupId>
+        <artifactId>angular-translate</artifactId>
+        <version>${angular-translate.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.webjars.bower</groupId>
+        <artifactId>angular-translate-loader-partial</artifactId>
+        <version>${angular-translate.version}</version>
+      </dependency>      
+      <dependency>
+        <groupId>org.webjars.bower</groupId>
         <artifactId>ng-password-strength</artifactId>
         <version>${ng-password-strength.version}</version>
         <exclusions>
@@ -1613,6 +1625,7 @@ under the License.
             <exclude>**/deb/control/conffiles</exclude>
             <exclude>**/deb/control/control</exclude>
             <exclude>**/*.lst</exclude>
+            <exclude>**/*.json</exclude>
           </excludes>
         </configuration>
         <executions>

http://git-wip-us.apache.org/repos/asf/syncope/blob/e5eed43a/standalone/LICENSE
----------------------------------------------------------------------
diff --git a/standalone/LICENSE b/standalone/LICENSE
index 746fb50..f7a5aa0 100644
--- a/standalone/LICENSE
+++ b/standalone/LICENSE
@@ -1107,6 +1107,11 @@ This is licensed under the MIT license, see above.
 
 ==
 
+For Angular Translate (https://angular-translate.github.io/):
+This is licensed under the MIT license, see above.
+
+==
+
 For ng-password-strength (https://github.com/subarroca/ng-password-strength):
 This is licensed under the MIT license, see above.
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/e5eed43a/standalone/NOTICE
----------------------------------------------------------------------
diff --git a/standalone/NOTICE b/standalone/NOTICE
index 5d9afb6..f6b7fd0 100644
--- a/standalone/NOTICE
+++ b/standalone/NOTICE
@@ -240,6 +240,11 @@ Copyright (c) 2014-2016 Google, Inc. http://angular.io
 
 ==
 
+This product includes software developed by the Angular Translate project.
+Copyright (c) <2014> <pa...@gmail.com>
+
+==
+
 This product contains unmodified binary redistributions for H2 database engine,
 which is dual licensed and available under a modified version of the MPL 1.1 (Mozilla Public License) or under the
 (unmodified) EPL 1.0 (Eclipse Public License).