Quellcode durchsuchen

AMBARI-14481. Ambari Admin: string constants used in controllers, directives and services should be defined once (alexantonenko)

Alex Antonenko vor 9 Jahren
Ursprung
Commit
764fda9aba
23 geänderte Dateien mit 478 neuen und 134 gelöschten Zeilen
  1. 11 5
      ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/NavbarCtrl.js
  2. 8 7
      ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/ambariViews/CreateViewInstanceCtrl.js
  3. 22 13
      ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/ambariViews/ViewsEditCtrl.js
  4. 4 3
      ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/ambariViews/ViewsListCtrl.js
  5. 4 3
      ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/clusters/ClustersManageAccessCtrl.js
  6. 13 12
      ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/clusters/UserAccessListCtrl.js
  7. 4 3
      ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/groups/GroupsCreateCtrl.js
  8. 14 5
      ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/groups/GroupsEditCtrl.js
  9. 6 5
      ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/groups/GroupsListCtrl.js
  10. 6 5
      ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/mainCtrl.js
  11. 6 8
      ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/stackVersions/StackVersionsCreateCtrl.js
  12. 22 8
      ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/stackVersions/StackVersionsEditCtrl.js
  13. 3 2
      ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/stackVersions/StackVersionsListCtrl.js
  14. 7 3
      ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/users/UsersCreateCtrl.js
  15. 7 6
      ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/users/UsersListCtrl.js
  16. 37 18
      ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/users/UsersShowCtrl.js
  17. 4 4
      ambari-admin/src/main/resources/ui/admin-web/app/scripts/directives/editableList.js
  18. 274 1
      ambari-admin/src/main/resources/ui/admin-web/app/scripts/i18n.config.js
  19. 1 1
      ambari-admin/src/main/resources/ui/admin-web/app/scripts/services/Alert.js
  20. 5 3
      ambari-admin/src/main/resources/ui/admin-web/app/scripts/services/ConfirmationModal.js
  21. 16 15
      ambari-admin/src/main/resources/ui/admin-web/app/scripts/services/Stack.js
  22. 1 1
      ambari-admin/src/main/resources/ui/admin-web/app/scripts/services/UnsavedDialog.js
  23. 3 3
      ambari-admin/src/main/resources/ui/admin-web/app/scripts/services/UserConstants.js

+ 11 - 5
ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/NavbarCtrl.js

@@ -18,7 +18,8 @@
 'use strict';
 
 angular.module('ambariAdminConsole')
-.controller('NavbarCtrl',['$scope', 'Cluster', '$location', 'Alert', 'ROUTES', 'ConfirmationModal', '$rootScope', 'Stack', function($scope, Cluster, $location, Alert, ROUTES, ConfirmationModal, $rootScope, Stack) {
+.controller('NavbarCtrl',['$scope', 'Cluster', '$location', 'Alert', 'ROUTES', 'ConfirmationModal', '$rootScope', 'Stack', '$translate', function($scope, Cluster, $location, Alert, ROUTES, ConfirmationModal, $rootScope, Stack, $translate) {
+  var $t = $translate.instant;
   $scope.cluster = null;
   $scope.totalRepos = 0;
   $scope.editCluster = {
@@ -40,7 +41,7 @@ angular.module('ambariAdminConsole')
         setTimeout(loadClusterData, 1000);
       }
     }).catch(function (data) {
-      Alert.error('Cannot load cluster status', data.statusText);
+      Alert.error($t('common.alerts.cannotLoadClusterStatus'), data.statusText);
     });
   }
   loadClusterData();
@@ -56,7 +57,12 @@ angular.module('ambariAdminConsole')
   };
 
   $scope.confirmClusterNameChange = function() {
-    ConfirmationModal.show('Confirm Cluster Name Change', 'Are you sure you want to change the cluster name to ' + $scope.editCluster.name + '?')
+    ConfirmationModal.show(
+      $t('common.clusterNameChangeConfirmation.title'),
+      $t('common.clusterNameChangeConfirmation.message', {
+        clusterName: $scope.editCluster.name
+      })
+    )
       .then(function() {
         $scope.saveClusterName();
       }).catch(function() {
@@ -71,9 +77,9 @@ angular.module('ambariAdminConsole')
 
     Cluster.editName(oldClusterName, newClusterName).then(function(data) {
       $scope.cluster.Clusters.cluster_name = newClusterName;
-      Alert.success('The cluster has been renamed to ' + newClusterName + '.');
+      Alert.success($t('common.alerts.clusterRenamed', {clusterName: newClusterName}));
     }).catch(function(data) {
-      Alert.error('Cannot rename cluster to ' + newClusterName, data.data.message);
+      Alert.error($t('common.alerts.cannotRenameCluster', {clusterName: newClusterName}), data.data.message);
     });
 
     $scope.toggleEditName();

+ 8 - 7
ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/ambariViews/CreateViewInstanceCtrl.js

@@ -18,7 +18,8 @@
 'use strict';
 
 angular.module('ambariAdminConsole')
-.controller('CreateViewInstanceCtrl',['$scope', 'View', 'Alert', 'Cluster', '$routeParams', '$location', 'UnsavedDialog', function($scope, View, Alert, Cluster, $routeParams, $location, UnsavedDialog) {
+.controller('CreateViewInstanceCtrl',['$scope', 'View', 'Alert', 'Cluster', '$routeParams', '$location', 'UnsavedDialog', '$translate', function($scope, View, Alert, Cluster, $routeParams, $location, UnsavedDialog, $translate) {
+  var $t = $translate.instant;
   $scope.form = {};
   var targetUrl = '';
 
@@ -38,7 +39,7 @@ angular.module('ambariAdminConsole')
       });
 
       $scope.clusterConfigurable = viewVersion.ViewVersionInfo.cluster_configurable;
-      $scope.clusterConfigurableErrorMsg = $scope.clusterConfigurable ? "" : "This view cannot use this option";
+      $scope.clusterConfigurableErrorMsg = $scope.clusterConfigurable ? "" : $t('views.alerts.cannotUseOption');
 
       $scope.instance = {
         view_name: viewVersion.ViewVersionInfo.view_name,
@@ -72,7 +73,7 @@ angular.module('ambariAdminConsole')
           $scope.form.instanceCreateForm[key].validationError = false;
           $scope.form.instanceCreateForm[key].validationMessage = '';
         } catch (e) {
-          console.log('Unable to reset error message for prop:', key);
+          console.log($t('views.alerts.unableToResetErrorMessage', {key: key}));
         }
       });
       $scope.errorKeys = [];
@@ -101,7 +102,7 @@ angular.module('ambariAdminConsole')
         $scope.noClusterAvailible = false;
         $scope.instance.isLocalCluster = $scope.clusterConfigurable;
       }else{
-        $scope.clusters.push("No Clusters");
+        $scope.clusters.push($t('common.noClusters'));
       }
       $scope.cluster = $scope.clusters[0];
     });
@@ -127,7 +128,7 @@ angular.module('ambariAdminConsole')
       $scope.instance.clusterName = $scope.cluster;
       View.createInstance($scope.instance)
         .then(function(data) {
-          Alert.success('Created View Instance ' + $scope.instance.instance_name);
+          Alert.success($t('views.alerts.instanceCreated', {instanceName: $scope.instance.instance_name}));
           $scope.form.instanceCreateForm.$setPristine();
           if( targetUrl ){
             $location.path(targetUrl);
@@ -158,10 +159,10 @@ angular.module('ambariAdminConsole')
                 $scope.form.instanceCreateForm.generalValidationError = errorMessage;
               }
             } catch (e) {
-              console.error('Unable to parse error message:', data.message);
+              console.error($t('views.alerts.unableToParseError', {message: data.message}));
             }
           }
-          Alert.error('Cannot create instance', errorMessage);
+          Alert.error($t('views.alerts.cannotCreateInstance'), errorMessage);
           $scope.form.instanceCreateForm.isSaving = false;
         });
       }

+ 22 - 13
ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/ambariViews/ViewsEditCtrl.js

@@ -18,7 +18,8 @@
 'use strict';
 
 angular.module('ambariAdminConsole')
-.controller('ViewsEditCtrl', ['$scope', '$routeParams' , 'Cluster', 'View', 'Alert', 'PermissionLoader', 'PermissionSaver', 'ConfirmationModal', '$location', 'UnsavedDialog', function($scope, $routeParams, Cluster, View, Alert, PermissionLoader, PermissionSaver, ConfirmationModal, $location, UnsavedDialog) {
+.controller('ViewsEditCtrl', ['$scope', '$routeParams' , 'Cluster', 'View', 'Alert', 'PermissionLoader', 'PermissionSaver', 'ConfirmationModal', '$location', 'UnsavedDialog', '$translate', function($scope, $routeParams, Cluster, View, Alert, PermissionLoader, PermissionSaver, ConfirmationModal, $location, UnsavedDialog, $translate) {
+  var $t = $translate.instant;
   $scope.identity = angular.identity;
   $scope.isConfigurationEmpty = true;
   $scope.isSettingsEmpty = true;
@@ -47,7 +48,7 @@ angular.module('ambariAdminConsole')
       }
     })
     .catch(function(data) {
-      Alert.error('Cannot load instance info', data.data.message);
+      Alert.error($t('views.alerts.cannotLoadInstanceInfo'), data.data.message);
     });
   }
 
@@ -57,7 +58,7 @@ angular.module('ambariAdminConsole')
       $scope.cluster = instance.ViewInstanceInfo.cluster_handle;
     }else{
       $scope.isLocalCluster = false;
-      $scope.cluster = $scope.clusters.length > 0 ? $scope.clusters[0] : "No Clusters";
+      $scope.cluster = $scope.clusters.length > 0 ? $scope.clusters[0] : $t('common.noClusters');
     }
     $scope.originalLocalCluster = $scope.isLocalCluster;
     $scope.isConfigurationEmpty = !$scope.numberOfClusterConfigs;
@@ -104,7 +105,7 @@ angular.module('ambariAdminConsole')
   View.getMeta($routeParams.viewId, $routeParams.version).then(function(data) {
     $scope.configurationMeta = data.data.ViewVersionInfo.parameters;
     $scope.clusterConfigurable = data.data.ViewVersionInfo.cluster_configurable;
-    $scope.clusterConfigurableErrorMsg = $scope.clusterConfigurable ? "" : "This view cannot use this option";
+    $scope.clusterConfigurableErrorMsg = $scope.clusterConfigurable ? "" : $t('views.alerts.cannotUseOption');
     angular.forEach($scope.configurationMeta, function (item) {
       item.displayName = item.name.replace(/\./g, '\.\u200B');
       item.clusterConfig = !!item.clusterConfig;
@@ -129,7 +130,7 @@ angular.module('ambariAdminConsole')
       $scope.isPermissionsEmpty = angular.equals({}, $scope.permissions);
     })
     .catch(function(data) {
-      Alert.error('Cannot load permissions', data.data.message);
+      Alert.error($t('views.alerts.cannotLoadPermissions'), data.data.message);
     });
   }
 
@@ -191,7 +192,7 @@ angular.module('ambariAdminConsole')
       });
       $scope.noClusterAvailible = false;
     }else{
-      $scope.clusters.push("No Clusters");
+      $scope.clusters.push($t('common.noClusters'));
     }
     $scope.cluster = $scope.clusters[0];
   });
@@ -220,7 +221,7 @@ angular.module('ambariAdminConsole')
         }
       })
       .catch(function(data) {
-        Alert.error('Cannot save settings', data.data.message);
+        Alert.error($t('views.alerts.cannotSaveSettings'), data.data.message);
       });
     }
   };
@@ -252,7 +253,7 @@ angular.module('ambariAdminConsole')
         }
       })
       .catch(function(data) {
-        Alert.error('Cannot save settings', data.data.message);
+        Alert.error($t('views.alerts.cannotSaveSettings'), data.data.message);
       });
     }
   };
@@ -313,10 +314,10 @@ angular.module('ambariAdminConsole')
               }
             });
           } catch (e) {
-            console.error('Unable to parse error message:', data.message);
+            console.error($t('views.alerts.unableToParseError', {message: data.message}));
           }
         }
-        Alert.error('Cannot save properties', errorMessage);
+        Alert.error($t('views.alerts.cannotSaveProperties'), errorMessage);
       });
     }
   };
@@ -347,7 +348,7 @@ angular.module('ambariAdminConsole')
     .then(reloadViewPrivileges)
     .catch(function(data) {
       reloadViewPrivileges();
-      Alert.error('Cannot save permissions', data.data.message);
+      Alert.error($t('common.alerts.cannotSavePermissions'), data.data.message);
     });
   };
 
@@ -360,13 +361,21 @@ angular.module('ambariAdminConsole')
   }, true);
 
   $scope.deleteInstance = function(instance) {
-    ConfirmationModal.show('Delete View Instance', 'Are you sure you want to delete View Instance '+ instance.ViewInstanceInfo.label +'?').then(function() {
+    ConfirmationModal.show(
+      $t('common.delete', {
+        term: $t('views.viewInstance')
+      }),
+      $t('common.deleteConfirmation', {
+        instanceType: $t('views.viewInstance'),
+        instanceName: instance.ViewInstanceInfo.label
+      })
+    ).then(function() {
       View.deleteInstance(instance.ViewInstanceInfo.view_name, instance.ViewInstanceInfo.version, instance.ViewInstanceInfo.instance_name)
       .then(function() {
         $location.path('/views');
       })
       .catch(function(data) {
-        Alert.error('Cannot delete instance', data.data.message);
+        Alert.error($t('views.alerts.cannotDeleteInstance'), data.data.message);
       });
     });
   };

+ 4 - 3
ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/ambariViews/ViewsListCtrl.js

@@ -18,8 +18,9 @@
 'use strict';
 
 angular.module('ambariAdminConsole')
-.controller('ViewsListCtrl',['$scope', 'View', '$modal', 'Alert', 'ConfirmationModal', '$location', function($scope, View, $modal, Alert, ConfirmationModal, $location) {
-  var deferredList = [];
+.controller('ViewsListCtrl',['$scope', 'View', '$modal', 'Alert', 'ConfirmationModal', '$location', '$translate', function($scope, View, $modal, Alert, ConfirmationModal, $location, $translate) {
+  var deferredList = [],
+    $t = $translate.instant;
   $scope.$on('$locationChangeStart', function() {
     deferredList.forEach(function(def) {
       def.reject();
@@ -59,7 +60,7 @@ angular.module('ambariAdminConsole')
         });
       })
     }).catch(function(data) {
-      Alert.error('Cannot load views', data.data.message);
+      Alert.error($t('views.alerts.cannotLoadViews'), data.data.message);
     });
   }
 

+ 4 - 3
ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/clusters/ClustersManageAccessCtrl.js

@@ -18,7 +18,8 @@
 'use strict';
 
 angular.module('ambariAdminConsole')
-.controller('ClustersManageAccessCtrl', ['$scope', '$location', 'Cluster', '$routeParams', 'Alert', 'PermissionLoader', 'PermissionSaver', function($scope, $location, Cluster, $routeParams, Alert, PermissionLoader, PermissionSaver) {
+.controller('ClustersManageAccessCtrl', ['$scope', '$location', 'Cluster', '$routeParams', 'Alert', 'PermissionLoader', 'PermissionSaver', '$translate', function($scope, $location, Cluster, $routeParams, Alert, PermissionLoader, PermissionSaver, $translate) {
+  var $t = $translate.instant;
   $scope.identity = angular.identity;
   function reloadClusterData(){
     PermissionLoader.getClusterPermissions({
@@ -41,7 +42,7 @@ angular.module('ambariAdminConsole')
       $scope.permissions = pms;
     })
     .catch(function(data) {
-      Alert.error('Cannot load cluster data', data.data.message);
+      Alert.error($t('clusters.alerts.cannotLoadClusterData'), data.data.message);
     });
   }
  
@@ -68,7 +69,7 @@ angular.module('ambariAdminConsole')
       }
     ).then(reloadClusterData)
     .catch(function(data) {
-      Alert.error('Cannot save permissions', data.data.message);
+      Alert.error($t('common.alerts.cannotSavePermissions'), data.data.message);
       reloadClusterData();
     });
     $scope.isEditMode = false;

+ 13 - 12
ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/clusters/UserAccessListCtrl.js

@@ -18,8 +18,9 @@
 'use strict';
 
 angular.module('ambariAdminConsole')
-.controller('UserAccessListCtrl',['$scope', '$location', 'Cluster', '$modal', '$rootScope', '$routeParams', 'PermissionSaver', 'Alert',
-function($scope, $location, Cluster, $modal, $rootScope, $routeParams, PermissionSaver, Alert) {
+.controller('UserAccessListCtrl',['$scope', '$location', 'Cluster', '$modal', '$rootScope', '$routeParams', 'PermissionSaver', 'Alert', '$translate',
+function($scope, $location, Cluster, $modal, $rootScope, $routeParams, PermissionSaver, Alert, $translate) {
+  var $t = $translate.instant;
   $scope.users = [];
   $scope.usersPerPage = 10;
   $scope.currentPage = 1;
@@ -88,7 +89,7 @@ function($scope, $location, Cluster, $modal, $rootScope, $routeParams, Permissio
           $scope.loadUsers();
         })
         .catch(function(data) {
-          Alert.error('Cannot save permissions', data.data.message);
+          Alert.error($t('common.alerts.cannotSavePermissions'), data.data.message);
           $scope.loadUsers();
         });
       }
@@ -102,20 +103,20 @@ function($scope, $location, Cluster, $modal, $rootScope, $routeParams, Permissio
   };
 
   $scope.roleFilterOptions = [
-    {label: 'All', value: ''},
-    {label: 'Cluster User', value: 'CLUSTER.USER'},
-    {label:'Cluster Administrator', value: 'CLUSTER.ADMINISTRATOR'},
-    {label:'Cluster Operator', value: 'CLUSTER.OPERATOR'},
-    {label:'Service Administrator', value: 'SERVICE.ADMINISTRATOR'},
-    {label:'Service Operator', value: 'SERVICE.OPERATOR'}
+    {label: $t('common.all'), value: ''},
+    {label: $t('users.roles.clusterUser'), value: 'CLUSTER.USER'},
+    {label: $t('users.roles.clusterAdministrator'), value: 'CLUSTER.ADMINISTRATOR'},
+    {label: $t('users.roles.clusterOperator'), value: 'CLUSTER.OPERATOR'},
+    {label: $t('users.roles.serviceAdministrator'), value: 'SERVICE.ADMINISTRATOR'},
+    {label: $t('users.roles.serviceOperator'), value: 'SERVICE.OPERATOR'}
   ];
   $scope.currentRoleFilter = $scope.roleFilterOptions[0];
 
 
   $scope.typeFilterOptions = [
-    {label:'All', value:''},
-    {label:'Group', value:'GROUP'},
-    {label:'User', value:'USER'}
+    {label: $t('common.all'), value: ''},
+    {label:$t('common.group'), value: 'GROUP'},
+    {label: $t('common.user'), value: 'USER'}
   ];
   $scope.currentTypeFilter = $scope.typeFilterOptions[0];
 

+ 4 - 3
ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/groups/GroupsCreateCtrl.js

@@ -18,7 +18,8 @@
 'use strict';
 
 angular.module('ambariAdminConsole')
-.controller('GroupsCreateCtrl',['$scope', 'Group', '$location', 'Alert', 'UnsavedDialog', function($scope, Group, $location, Alert, UnsavedDialog) {
+.controller('GroupsCreateCtrl',['$scope', 'Group', '$location', 'Alert', 'UnsavedDialog', '$translate', function($scope, Group, $location, Alert, UnsavedDialog, $translate) {
+  var $t = $translate.instant;
   $scope.group = new Group();
   var targetUrl = '/groups';
 
@@ -26,12 +27,12 @@ angular.module('ambariAdminConsole')
     $scope.form.submitted = true;
     if ($scope.form.$valid){
       $scope.group.save().then(function() {
-        Alert.success('Created group <a href="#/groups/' + $scope.group.group_name + '/edit">' + $scope.group.group_name + '</a>');
+        Alert.success($t('groups.alerts.groupCreated', {groupName: $scope.group.group_name}));
         $scope.form.$setPristine();
         $location.path(targetUrl);
       })
       .catch(function(data) {
-        Alert.error('Group creation error', data.data.message);
+        Alert.error($t('groups.alerts.groupCreationError'), data.data.message);
       });
     }
   };

+ 14 - 5
ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/groups/GroupsEditCtrl.js

@@ -18,7 +18,8 @@
 'use strict';
 
 angular.module('ambariAdminConsole')
-.controller('GroupsEditCtrl',['$scope', 'Group', '$routeParams', 'Alert', 'ConfirmationModal', '$location', function($scope, Group, $routeParams, Alert, ConfirmationModal, $location) {
+.controller('GroupsEditCtrl',['$scope', 'Group', '$routeParams', 'Alert', 'ConfirmationModal', '$location', '$translate', function($scope, Group, $routeParams, Alert, ConfirmationModal, $location, $translate) {
+  var $t = $translate.instant;
   $scope.editMode = false;
   $scope.group = new Group($routeParams.id);
   $scope.group.editingUsers = [];
@@ -52,7 +53,7 @@ angular.module('ambariAdminConsole')
     );
     $scope.group.members = newMembers;
     $scope.group.saveMembers().catch(function(data) {
-        Alert.error('Cannot update group members', "<div class='break-word'>" + data.message + "</div>");
+        Alert.error($t('groups.alerts.cannotUpdateGroupMembers'), "<div class='break-word'>" + data.message + "</div>");
       }).finally(function() {
         loadMembers();
       });
@@ -73,7 +74,15 @@ angular.module('ambariAdminConsole')
   });
 
   $scope.deleteGroup = function(group) {
-    ConfirmationModal.show('Delete Group', 'Are you sure you want to delete group "'+ group.group_name +'"?').then(function() {
+    ConfirmationModal.show(
+      $t('common.delete', {
+        term: $t('common.group')
+      }),
+      $t('common.deleteConfirmation', {
+        instanceType: $t('common.group').toLowerCase(),
+        instanceName: '"' + group.group_name + '"'
+      })
+    ).then(function() {
       group.destroy().then(function() {
         $location.path('/groups');
       }).catch(function() {
@@ -104,10 +113,10 @@ angular.module('ambariAdminConsole')
 
     $scope.privileges = data.data.items.length ? privileges : null;
     $scope.noClusterPriv = $.isEmptyObject(privileges.clusters);
-    $scope.noViewPriv = $.isEmptyObject(privileges.views)
+    $scope.noViewPriv = $.isEmptyObject(privileges.views);
     $scope.hidePrivileges = $scope.noClusterPriv && $scope.noViewPriv;    $scope.dataLoaded = true;
   }).catch(function(data) {
-    Alert.error('Cannot load privileges', data.data.message);
+    Alert.error($t('common.alerts.cannotLoadPrivileges'), data.data.message);
   });
 
 

+ 6 - 5
ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/groups/GroupsListCtrl.js

@@ -18,7 +18,8 @@
 'use strict';
 
 angular.module('ambariAdminConsole')
-.controller('GroupsListCtrl',['$scope', 'Group', '$modal', 'ConfirmationModal', '$rootScope', function($scope, Group, $modal, ConfirmationModal, $rootScope) {
+.controller('GroupsListCtrl',['$scope', 'Group', '$modal', 'ConfirmationModal', '$rootScope', '$translate', function($scope, Group, $modal, ConfirmationModal, $rootScope, $translate) {
+  var $t = $translate.instant;
   $scope.groups = [];
 
   $scope.groupsPerPage = 10;
@@ -50,14 +51,14 @@ angular.module('ambariAdminConsole')
       $scope.groups = groups;
     })
     .catch(function(data) {
-      console.error('Get groups list error');
+      console.error($t('groups.alerts.getGroupsListError'));
     });
   }
 
   $scope.typeFilterOptions = [
-    {label:'All', value:'*'},
-    {label:'Local', value: false},
-    {label:'LDAP', value:true}
+    {label: $t('common.all'), value:'*'},
+    {label: $t('common.local'), value: false},
+    {label: $t('common.ldap'), value:true}
   ];
   $scope.currentTypeFilter = $scope.typeFilterOptions[0];
   

+ 6 - 5
ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/mainCtrl.js

@@ -18,7 +18,8 @@
 'use strict';
 
 angular.module('ambariAdminConsole')
-.controller('MainCtrl',['$scope','$rootScope','$window','Auth', 'Alert', '$modal', 'Cluster', 'View', function($scope, $rootScope, $window, Auth, Alert, $modal, Cluster, View) {
+.controller('MainCtrl',['$scope','$rootScope','$window','Auth', 'Alert', '$modal', 'Cluster', 'View', '$translate', function($scope, $rootScope, $window, Auth, Alert, $modal, Cluster, View, $translate) {
+  var $t = $translate.instant;
   $scope.signOut = function() {
     Auth.signout().finally(function() {
       $window.location.pathname = '';
@@ -59,7 +60,7 @@ angular.module('ambariAdminConsole')
         setTimeout(loadClusterData, 1000);
       }
     }).catch(function(data) {
-      Alert.error('Cannot load cluster status', data.statusText);
+      Alert.error($t('common.alerts.cannotLoadClusterStatus'), data.statusText);
     });
   }
   loadClusterData();
@@ -111,9 +112,9 @@ angular.module('ambariAdminConsole')
           backdrop: false,
           controller: ['$scope', 'Auth', function($scope, Auth) {
             $scope.remainTime = 60;
-            $scope.title = 'Automatic Logout';
-            $scope.primaryText = 'Remain Logged In';
-            $scope.secondaryText = 'Log Out Now';
+            $scope.title = $t('main.autoLogOut');
+            $scope.primaryText = $t('main.controls.remainLoggedIn');
+            $scope.secondaryText = $t('main.controls.logOut');
             $scope.remain = function() {
               $rootScope.timeoutModal.close();
               delete $rootScope.timeoutModal;

+ 6 - 8
ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/stackVersions/StackVersionsCreateCtrl.js

@@ -18,7 +18,8 @@
 'use strict';
 
 angular.module('ambariAdminConsole')
-.controller('StackVersionsCreateCtrl', ['$scope', 'Stack', '$routeParams', '$location', 'Alert', function($scope, Stack, $routeParams, $location, Alert) {
+.controller('StackVersionsCreateCtrl', ['$scope', 'Stack', '$routeParams', '$location', 'Alert', '$translate', function($scope, Stack, $routeParams, $location, Alert, $translate) {
+  var $t = $translate.instant;
   $scope.createController = true;
   $scope.osList = [];
   $scope.skipValidation = false;
@@ -45,7 +46,7 @@ angular.module('ambariAdminConsole')
       $scope.afterStackVersionChange();
     })
     .catch(function (data) {
-      Alert.error('Fetch stack version filter list error', data.message);
+      Alert.error($t('versions.alerts.filterListError'), data.message);
     });
   };
   $scope.fetchStackVersionFilterList();
@@ -57,14 +58,11 @@ angular.module('ambariAdminConsole')
           .success(function () {
             var versionName = $scope.upgradeStack.selected.stack_version + '.' + $scope.repoSubversion;
             var stackName = $scope.upgradeStack.selected.stack_name;
-            Alert.success('Created version ' +
-            '<a href="#/stackVersions/' + stackName + '/' + versionName + '/edit">'
-              + stackName + '-' + versionName +
-            '</a>');
+            Alert.success($t('versions.alerts.versionCreated'), {stackName: stackName, versionName: versionName});
             $location.path('/stackVersions');
           })
           .error(function (data) {
-              Alert.error('Version creation error', data.message);
+              Alert.error($t('versions.alerts.versionCreationError'), data.message);
           });
       } else {
         Stack.highlightInvalidUrls(invalidUrls);
@@ -85,7 +83,7 @@ angular.module('ambariAdminConsole')
         });
     })
     .catch(function (data) {
-      Alert.error('getSupportedOSList error', data.message);
+      Alert.error($t('versions.alerts.osListError'), data.message);
     });
   };
 

+ 22 - 8
ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/stackVersions/StackVersionsEditCtrl.js

@@ -18,7 +18,8 @@
 'use strict';
 
 angular.module('ambariAdminConsole')
-.controller('StackVersionsEditCtrl', ['$scope', '$location', 'Cluster', 'Stack', '$routeParams', 'ConfirmationModal', 'Alert', function($scope, $location, Cluster, Stack, $routeParams, ConfirmationModal, Alert) {
+.controller('StackVersionsEditCtrl', ['$scope', '$location', 'Cluster', 'Stack', '$routeParams', 'ConfirmationModal', 'Alert', '$translate', function($scope, $location, Cluster, Stack, $routeParams, ConfirmationModal, Alert, $translate) {
+  var $t = $translate.instant;
   $scope.editController = true;
   $scope.osList = [];
   $scope.skipValidation = false;
@@ -104,7 +105,7 @@ angular.module('ambariAdminConsole')
       $scope.osList = osList;
     })
     .catch(function (data) {
-      Alert.error('getSupportedOSList error', data.message);
+      Alert.error($t('versions.alerts.osListError'), data.message);
     });
   };
 
@@ -129,7 +130,11 @@ angular.module('ambariAdminConsole')
       }
     });
     if (updateRepoUrl && !$scope.deleteEnabled) {
-      ConfirmationModal.show('Confirm Base URL Change', 'You are about to change repository Base URLs that are already in use. Please confirm that you intend to make this change and that the new Base URLs point to the same exact Stack version and build', "Confirm Change").then(function() {
+      ConfirmationModal.show(
+          $t('versions.changeBaseURLConfirmation.title'),
+          $t('versions.changeBaseURLConfirmationTip.message'),
+          $t('common.controls.confirmChange')
+      ).then(function() {
         $scope.updateRepoVersions();
       });
     } else {
@@ -145,10 +150,14 @@ angular.module('ambariAdminConsole')
     return Stack.validateBaseUrls($scope.skipValidation, $scope.osList, upgradeStack).then(function (invalidUrls) {
       if (invalidUrls.length === 0) {
         Stack.updateRepo($scope.stackName, $scope.stackVersion, $scope.id, $scope.updateObj).then(function () {
-          Alert.success('Edited version <a href="#/stackVersions/' + $scope.stackName + '/' + $scope.versionName + '/edit">' + $scope.displayName + '</a>');
+          Alert.success($t('versions.alerts.versionEdited', {
+            stackName: $scope.stackName,
+            versionName: $scope.versionName,
+            displayName: $scope.displayName
+          }));
           $location.path('/stackVersions');
         }).catch(function (data) {
-          Alert.error('Version update error', data.message);
+          Alert.error($t('versions.alerts.versionUpdateError'), data.message);
         });
       } else {
         Stack.highlightInvalidUrls(invalidUrls);
@@ -174,12 +183,17 @@ angular.module('ambariAdminConsole')
   };
 
   $scope.delete = function () {
-    ConfirmationModal.show('Deregister Version', { "url": 'views/modals/BodyForDeregisterVersion.html',
-      "scope": {"displayName": $scope.displayName }}).then(function() {
+    ConfirmationModal.show(
+      $t('versions.deregister'),
+      {
+        "url": 'views/modals/BodyForDeregisterVersion.html',
+        "scope": {"displayName": $scope.displayName }
+      }
+    ).then(function() {
       Stack.deleteRepo($scope.stackName, $scope.stackVersion, $scope.id).then( function () {
         $location.path('/stackVersions');
       }).catch(function (data) {
-        Alert.error('Version delete error', data.message);
+        Alert.error($t('versions.alerts.versionDeleteError'), data.message);
       });
     });
   };

+ 3 - 2
ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/stackVersions/StackVersionsListCtrl.js

@@ -18,7 +18,8 @@
 'use strict';
 
 angular.module('ambariAdminConsole')
-.controller('StackVersionsListCtrl', ['$scope', 'Cluster', 'Stack', '$routeParams', function ($scope, Cluster, Stack, $routeParams) {
+.controller('StackVersionsListCtrl', ['$scope', 'Cluster', 'Stack', '$routeParams', '$translate', function ($scope, Cluster, Stack, $routeParams, $translate) {
+  var $t = $translate.instant;
   $scope.clusterName = $routeParams.clusterName;
   $scope.filter = {
     version: '',
@@ -91,7 +92,7 @@ angular.module('ambariAdminConsole')
 
     $scope.fillClusters = function (clusters) {
       $scope.dropDownClusters = [].concat(clusters);
-      var options = [{label: "All", value: ''}];
+      var options = [{label: $t('common.all'), value: ''}];
       angular.forEach(clusters, function (cluster) {
         options.push({
           label: cluster.Clusters.cluster_name,

+ 7 - 3
ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/users/UsersCreateCtrl.js

@@ -18,7 +18,8 @@
 'use strict';
 
 angular.module('ambariAdminConsole')
-.controller('UsersCreateCtrl',['$scope', '$routeParams', 'User', '$location', 'Alert', 'UnsavedDialog', function($scope, $routeParams, User, $location, Alert, UnsavedDialog) {
+.controller('UsersCreateCtrl',['$scope', '$routeParams', 'User', '$location', 'Alert', 'UnsavedDialog', '$translate', function($scope, $routeParams, User, $location, Alert, UnsavedDialog, $translate) {
+  var $t = $translate.instant;
   $scope.user = {
     active: true
   };
@@ -33,11 +34,14 @@ angular.module('ambariAdminConsole')
         'Users/active': !!$scope.user.active,
         'Users/admin': !!$scope.user.admin
       }).then(function() {
-        Alert.success('Created user <a href="#/users/' + encodeURIComponent($scope.user.user_name) + '">' + $scope.user.user_name + "</a>");
+        Alert.success($t('users.alerts.userCreated', {
+          userName: $scope.user.user_name,
+          encUserName: encodeURIComponent($scope.user.user_name)
+        }));
         $scope.form.$setPristine();
         $location.path(targetUrl);
       }).catch(function(data) {
-        Alert.error('User creation error', data.data.message);
+        Alert.error($t('users.alerts.userCreationError'), data.data.message);
       });
     }
   };

+ 7 - 6
ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/users/UsersListCtrl.js

@@ -18,7 +18,8 @@
 'use strict';
 
 angular.module('ambariAdminConsole')
-  .controller('UsersListCtrl',['$scope', 'User', '$modal', '$rootScope', 'UserConstants', function($scope, User, $modal, $rootScope, UserConstants) {
+  .controller('UsersListCtrl',['$scope', 'User', '$modal', '$rootScope', 'UserConstants', '$translate', function($scope, User, $modal, $rootScope, UserConstants, $translate) {
+  var $t = $translate.instant;
   $scope.users = [];
   $scope.usersPerPage = 10;
   $scope.currentPage = 1;
@@ -53,16 +54,16 @@ angular.module('ambariAdminConsole')
   };
 
   $scope.actvieFilterOptions = [
-    {label: 'All', value: '*'}, 
-    {label: 'Active', value: true}, 
-    {label:'Inactive', value:false}
+    {label: $t('common.all'), value: '*'},
+    {label: $t('users.active'), value: true},
+    {label: $t('users.inactive'), value:false}
   ];
   $scope.currentActiveFilter = $scope.actvieFilterOptions[0];
 
-  $scope.typeFilterOptions = [{ label: 'All', value: '*'}]
+  $scope.typeFilterOptions = [{ label: $t('common.all'), value: '*'}]
     .concat(Object.keys(UserConstants.TYPES).map(function(key) {
       return {
-        label: UserConstants.TYPES[key].NAME,
+        label: $t(UserConstants.TYPES[key].LABEL_KEY),
         value: UserConstants.TYPES[key].VALUE
       };
     }));

+ 37 - 18
ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/users/UsersShowCtrl.js

@@ -18,7 +18,9 @@
 'use strict';
 
 angular.module('ambariAdminConsole')
-.controller('UsersShowCtrl', ['$scope', '$routeParams', 'User', '$modal', '$location', 'ConfirmationModal', 'Alert', 'Auth', 'getDifference', 'Group', '$q', function($scope, $routeParams, User, $modal, $location, ConfirmationModal, Alert, Auth, getDifference, Group, $q) {
+.controller('UsersShowCtrl', ['$scope', '$routeParams', 'User', '$modal', '$location', 'ConfirmationModal', 'Alert', 'Auth', 'getDifference', 'Group', '$q', '$translate', function($scope, $routeParams, User, $modal, $location, ConfirmationModal, Alert, Auth, getDifference, Group, $q, $translate) {
+
+  var $t = $translate.instant;
 
   function loadUserInfo(){
     User.get($routeParams.id).then(function(data) {
@@ -56,13 +58,13 @@ angular.module('ambariAdminConsole')
     // Remove user from groups
     angular.forEach(diff.del, function(groupName) {
       promises.push(Group.removeMemberFromGroup(groupName, $scope.user.user_name).catch(function(data) {
-        Alert.error('Removing from group error', data.data.message);
+        Alert.error($t('users.alerts.removeUserError'), data.data.message);
       }));
     });
     // Add user to groups
     angular.forEach(diff.add, function(groupName) {
       promises.push(Group.addMemberToGroup(groupName, $scope.user.user_name).catch(function(data) {
-        Alert.error('Cannot add user to group', data.data.message);
+        Alert.error($t('users.alert.cannotAddUser'), data.data.message);
       }));
     });
     $q.all(promises).then(function() {
@@ -111,16 +113,24 @@ angular.module('ambariAdminConsole')
 
     modalInstance.result.then(function(data) {
       User.setPassword($scope.user, data.password, data.currentUserPassword).then(function() {
-        Alert.success('Password changed.');
+        Alert.success($t('users.alerts.passwordChanged'));
       }).catch(function(data) {
-        Alert.error('Cannot change password', data.data.message);
+        Alert.error($t('users.alerts.cannotChangePassword'), data.data.message);
       });
     }); 
   };
 
   $scope.toggleUserActive = function() {
     if(!$scope.isCurrentUser){
-      ConfirmationModal.show('Change Status', 'Are you sure you want to change status for user "'+ $scope.user.user_name +'" to '+($scope.user.active ? 'inactive' : 'active')+'?').then(function() {
+      var newStatusKey = $scope.user.active ? 'inactive' : 'active',
+        newStatus = $t('users.' + newStatusKey).toLowerCase();
+      ConfirmationModal.show(
+        $t('users.changeStatusConfirmation.title'),
+        $t('users.changeStatusConfirmation.message', {
+          userName: $scope.user.user_name,
+          status: newStatus
+        })
+      ).then(function() {
         User.setActive($scope.user.user_name, $scope.user.active);
       })
       .catch(function() {
@@ -130,13 +140,14 @@ angular.module('ambariAdminConsole')
   };    
   $scope.toggleUserAdmin = function() {
     if(!$scope.isCurrentUser){
-      var message = '';
-      if( !$scope.user.admin ){
-        message = 'Are you sure you want to grant Admin privilege to user ';
-      } else {
-        message = 'Are you sure you want to revoke Admin privilege from user ';
-      }
-      ConfirmationModal.show('Change Admin Privilege', message + '"'+$scope.user.user_name+'"?').then(function() {
+      var action = $scope.user.admin ? 'revoke' : 'grant';
+      ConfirmationModal.show(
+        $t('users.changePrivilegeConfirmation.title'),
+        $t('users.changePrivilegeConfirmation.message', {
+          action: action,
+          userName: $scope.user.user_name
+        })
+      ).then(function() {
         User.setAdmin($scope.user.user_name, $scope.user.admin)
         .then(function() {
           loadPrivileges();
@@ -145,12 +156,20 @@ angular.module('ambariAdminConsole')
       .catch(function() {
         $scope.user.admin = !$scope.user.admin;
       });
-        
+
     }
-  };    
+  };
 
   $scope.deleteUser = function() {
-    ConfirmationModal.show('Delete User', 'Are you sure you want to delete user "'+ $scope.user.user_name +'"?').then(function() {
+    ConfirmationModal.show(
+      $t('common.delete', {
+        term: $t('common.user')
+      }),
+      $t('common.deleteConfirmation', {
+        instanceType: $t('common.user').toLowerCase(),
+        instanceName: '"' + $scope.user.user_name + '"'
+      })
+    ).then(function() {
       User.delete($scope.user.user_name).then(function() {
         $location.path('/users');
       });
@@ -181,12 +200,12 @@ angular.module('ambariAdminConsole')
 
       $scope.privileges = data.data.items.length ? privileges : null;
       $scope.noClusterPriv = $.isEmptyObject(privileges.clusters);
-      $scope.noViewPriv = $.isEmptyObject(privileges.views)
+      $scope.noViewPriv = $.isEmptyObject(privileges.views);
       $scope.hidePrivileges = $scope.noClusterPriv && $scope.noViewPriv;
       $scope.dataLoaded = true;
 
     }).catch(function(data) {
-      Alert.error('Cannot load privileges', data.data.message);
+      Alert.error($t('common.alerts.cannotLoadPrivileges'), data.data.message);
     });
   }
   loadPrivileges();

+ 4 - 4
ambari-admin/src/main/resources/ui/admin-web/app/scripts/directives/editableList.js

@@ -37,12 +37,12 @@ angular.module('ambariAdminConsole')
       };
 
       var isIE = function () {
-        var ua = window.navigator.userAgent
-        var msie = ua.indexOf("MSIE ")
+        var ua = window.navigator.userAgent;
+        var msie = ua.indexOf("MSIE ");
 
         // If Internet Explorer, return version number
         if (msie > 0)
-          return !!parseInt(ua.substring(msie + 5, ua.indexOf(".", msie)))
+          return !!parseInt(ua.substring(msie + 5, ua.indexOf(".", msie)));
 
         // If Internet Explorer 11 handling differently becaue UserAgent string updated by Microsoft
         else if (!!navigator.userAgent.match(/Trident\/7\./))
@@ -232,7 +232,7 @@ angular.module('ambariAdminConsole')
         }
         if( $scope.editMode && !angular.equals($scope.items, $scope.itemsSource)){
           var modalInstance = $modal.open({
-            template: '<div class="modal-header"><h3 class="modal-title">Warning</h3></div><div class="modal-body">You have unsaved changes. Save changes or discard?</div><div class="modal-footer"><div class="btn btn-default" ng-click="cancel()">Cancel</div><div class="btn btn-warning" ng-click="discard()">Discard</div><div class="btn btn-primary" ng-click="save()">Save</div></div>',
+            template: '<div class="modal-header"><h3 class="modal-title">{{"common.warning" | translate}}</h3></div><div class="modal-body">{{"common.alerts.unsavedChanges" | translate}}</div><div class="modal-footer"><div class="btn btn-default" ng-click="cancel()">{{"common.controls.cancel" | translate}}</div><div class="btn btn-warning" ng-click="discard()">{{"common.controls.discard" | translate}}</div><div class="btn btn-primary" ng-click="save()">{{"common.controls.save" | translate}}</div></div>',
             controller: ['$scope', '$modalInstance', function($scope, $modalInstance) {
               $scope.save = function() {
                 $modalInstance.close('save');

+ 274 - 1
ambari-admin/src/main/resources/ui/admin-web/app/scripts/i18n.config.js

@@ -22,7 +22,280 @@ angular.module('ambariAdminConsole')
   $translateProvider.translations('en',{
     'CLUSTER.ADMINISTRATOR': 'Operator',
     'CLUSTER.USER': 'Read-Only',
-    'VIEW.USER': 'Use'
+    'VIEW.USER': 'Use',
+
+    'common': {
+      'ambari': 'Ambari',
+      'apacheAmbari': 'Apache Ambari',
+      'about': 'About',
+      'version': 'Version',
+      'signOut': 'Sign out',
+      'clusters': 'Clusters',
+      'views': 'Views',
+      'roles': 'Roles',
+      'users': 'Users',
+      'groups': 'Groups',
+      'versions': 'Versions',
+      'details': 'Details',
+      'goToDashboard': 'Go to Dashboard',
+      'noClusters': 'No Clusters',
+      'view': 'View',
+      'displayLabel': 'Display label',
+      'search': 'Search',
+      'name': 'Name',
+      'any': 'Any',
+      'none': 'None',
+      'type': 'Type',
+      'add': 'Add {{term}}',
+      'delete': 'Delete {{term}}',
+      'cannotDelete': 'Cannot Delete {{term}}',
+      'privileges': 'Privileges',
+      'cluster': 'Cluster',
+      'clusterRole': 'Cluster Role',
+      'viewPermissions': 'View Permissions',
+      'getInvolved': 'Get involved!',
+      'license': 'Licensed under the Apache License, Version 2.0',
+      'tableFilterMessage': '{{showed}} of {{total}} {{term}} showing',
+      'yes': 'Yes',
+      'no': 'No',
+      'renameCluster': 'Rename Cluster',
+      'renameClusterTip': 'Only alpha-numeric characters, up to 80 characters',
+      'clusterCreationInProgress': 'Cluster creation in progress...',
+      'userGroupManagement': 'User + Group Management',
+      'all': 'All',
+      'group': 'Group',
+      'user': 'User',
+      'deleteConfirmation': 'Are you sure you want to delete {{instanceType}} {{instanceName}}?',
+      'local': 'Local',
+      'ldap': 'LDAP',
+      'jwt': 'JWT',
+      'warning': 'Warning',
+
+      'clusterNameChangeConfirmation': {
+        'title': 'Confirm Cluster Name Change',
+        'message': 'Are you sure you want to change the cluster name to {{clusterName}}?'
+      },
+
+      'controls': {
+        'cancel': 'Cancel',
+        'close': 'Close',
+        'ok': 'OK',
+        'save': 'Save',
+        'clearFilters': 'clear filters',
+        'confirmChange': 'Confirm Change',
+        'discard': 'Discard'
+      },
+
+      'alerts': {
+        'fieldRequired': 'Field required!',
+        'fieldIsRequired': 'This field is required.',
+        'noSpecialChars': 'Must no contain special characters!',
+        'instanceExists': 'Instance with this name already exists.',
+        'nothingToDisplay': 'No {{term}} to display.',
+        'noPrivileges': 'No {{term}} privileges',
+        'noPrivilegesDescription': 'This {{term}} does not have any privileges.',
+        'timeOut': 'You will be automatically logged out in <b>{{time}}</b> seconds due to inactivity.',
+        'isInvalid': '{{term}} Invalid.',
+        'cannotSavePermissions': 'Cannot save permissions',
+        'cannotLoadPrivileges': 'Cannot load privileges',
+        'cannotLoadClusterStatus': 'Cannot load cluster status',
+        'clusterRenamed': 'The cluster has been renamed to {{clusterName}}.',
+        'cannotRenameCluster': 'Cannot rename cluster to {{clusterName}}',
+        'unsavedChanges': 'You have unsaved changes. Save changes or discard?'
+      }
+    },
+
+    'main': {
+      'title': 'Welcome to Apache Ambari',
+      'noClusterDescription': 'Provision a cluster, manage who can access the cluster, and customize views for Ambari users.',
+      'hasClusterDescription': 'Monitor your cluster resources, manage who can access the cluster, and customize views for Ambari users.',
+      'autoLogOut': 'Automatic Logout',
+
+      'operateCluster': {
+        'title': 'Operate Your Cluster',
+        'description': 'Manage the configuration of your cluster and monitor the health of your services',
+        'manageRoles': 'Manage Roles'
+      },
+
+      'createCluster': {
+        'title': 'Create a Cluster',
+        'description': 'Use the Install Wizard to select services and configure your cluster',
+        'launchInstallWizard': 'Launch Install Wizard'
+      },
+
+      'manageUsersAndGroups': {
+        'title': 'Manage Users + Groups',
+        'description': 'Manage the users and groups that can access Ambari'
+      },
+
+      'deployViews': {
+        'title': 'Deploy Views',
+        'description': 'Create view instances and grant permissions'
+      },
+
+      'controls': {
+        'remainLoggedIn': 'Remain Logged In',
+        'logOut': 'Log Out Now'
+      }
+    },
+
+    'views': {
+      'viewInstance': 'View Instance',
+      'create': 'Create Instance',
+      'createViewInstance': 'Create View Instance',
+      'edit': 'Edit',
+      'viewName': 'View Name',
+      'instances': 'Instances',
+      'instanceName': 'Instance Name',
+      'instanceId': 'Instance ID',
+      'displayName': 'Display Name',
+      'settings': 'Settings',
+      'advanced': 'Advanced',
+      'visible': 'Visible',
+      'description': 'Description',
+      'instanceDescription': 'Instance Description',
+      'clusterConfiguration': 'Cluster Configuration',
+      'localCluster': 'Local Ambari Managed Cluster',
+      'clusterName': 'Cluster Name',
+      'custom': 'Custom',
+      'icon': 'Icon',
+      'icon64': 'Icon64',
+      'permissions': 'Permissions',
+      'permission': 'Permission',
+      'grantUsers': 'Grant permission to these users',
+      'grantGroups': 'Grant permission to these groups',
+      'configuration': 'Configuration',
+      'goToInstance': 'Go to instance',
+      'pending': 'Pending...',
+      'deploying': 'Deploying...',
+
+      'alerts': {
+        'noSpecialChars': 'Must not contain any special characters.',
+        'noSpecialCharsOrSpaces': 'Must not contain any special characters or spaces.',
+        'noProperties': 'There are no properties defined for this view.',
+        'noPermissions': 'There are no permissions defined for this view.',
+        'cannotEditInstance': 'Cannot Edit Static Instances',
+        'cannotDeleteStaticInstance': 'Cannot Delete Static Instances',
+        'deployError': 'Error deploying. Check Ambari Server log.',
+        'unableToCreate': 'Unable to create view instances',
+        'onlySimpleChars': 'Must contain only simple characters.',
+        'cannotUseOption': 'This view cannot use this option',
+        'unableToResetErrorMessage': 'Unable to reset error message for prop: {{key}}',
+        'instanceCreated': 'Created View Instance {{instanceName}}',
+        'unableToParseError': 'Unable to parse error message: {{message}}',
+        'cannotCreateInstance': 'Cannot create instance',
+        'cannotLoadInstanceInfo': 'Cannot load instance info',
+        'cannotLoadPermissions': 'Cannot load permissions',
+        'cannotSaveSettings': 'Cannot save settings',
+        'cannotSaveProperties': 'Cannot save properties',
+        'cannotDeleteInstance': 'Cannot delete instance',
+        'cannotLoadViews': 'Cannot load views'
+      }
+    },
+
+    'clusters': {
+      'switchToList': 'Switch&nbsp;to&nbsp;list&nbsp;view',
+      'switchToBlock': 'Switch&nbsp;to&nbsp;block&nbsp;view',
+      'role': 'Role',
+
+      'alerts': {
+        'cannotLoadClusterData': 'Cannot load cluster data'
+      }
+    },
+
+    'groups': {
+      'createLocal': 'Create Local Group',
+      'name': 'Group name',
+      'members': 'Members',
+
+      'alerts': {
+        'groupCreated': 'Created group <a href="#/groups/{{groupName}}/edit">{{groupName}}</a>',
+        'groupCreationError': 'Group creation error',
+        'cannotUpdateGroupMembers': 'Cannot update group members',
+        'getGroupsListError': 'Get groups list error'
+      }
+    },
+
+    'users': {
+      'username': 'Username',
+      'userName': 'User name',
+      'ambariAdmin': 'Ambari Admin',
+      'changePassword': 'Change Password',
+      'changePasswordFor': 'Change Password for {{userName}}',
+      'yourPassword': 'Your Password',
+      'newPassword': 'New User Password',
+      'newPasswordConfirmation': 'New User Password Confirmation',
+      'create': 'Create Local User',
+      'active': 'Active',
+      'inactive': 'Inactive',
+      'status': 'Status',
+      'password': 'Password',
+      'passwordConfirmation': 'Password сonfirmation',
+      'userIsAdmin': 'This user is an Ambari Admin and has all privileges.',
+
+      'changeStatusConfirmation': {
+        'title': 'Change Status',
+        'message': 'Are you sure you want to change status for user "{{userName}}" to {{status}}?'
+      },
+
+      'changePrivilegeConfirmation': {
+        'title': 'Change Admin Privilege',
+        'message': 'Are you sure you want to {{action}} Admin privilege to user "{{userName}}"?'
+      },
+
+      'roles': {
+        'clusterUser': 'Cluster User',
+        'clusterAdministrator': 'Cluster Administrator',
+        'clusterOperator': 'Cluster Operator',
+        'serviceAdministrator': 'Service Administrator',
+        'serviceOperator': 'Service Operator'
+      },
+
+      'alerts': {
+        'passwordRequired': 'Password required!',
+        'wrongPassword': 'Password must match!',
+        'cannotChange': 'Cannot Change {{term}}',
+        'userCreated': 'Created user <a href="#/users/{{encUserName}}/edit">{{userName}}</a>',
+        'userCreationError': 'User creation error',
+        'removeUserError': 'Removing from group error',
+        'cannotAddUser': 'Cannot add user to group',
+        'passwordChanged': 'Password changed.',
+        'cannotChangePassword': 'Cannot change password'
+      }
+    },
+
+    'versions': {
+      'current': 'Current',
+      'inUse': 'In Use',
+      'installed': 'Installed',
+      'installOn': 'Install on...',
+      'register': 'Register Version',
+      'deregister': 'Deregister Version',
+      'deregisterConfirmation': 'Are you sure you want to deregister version <strong>{{versionName}}</strong> ?',
+      'placeholder': 'Version Number (0.0)',
+      'repos': 'Repositories',
+      'os': 'OS',
+      'baseURL': 'Base URL',
+      'skipValidation': 'Skip Repository Base URL validation (Advanced)',
+
+      'changeBaseURLConfirmation': {
+        'title': 'Confirm Base URL Change',
+        'message': 'You are about to change repository Base URLs that are already in use. Please confirm that you intend to make this change and that the new Base URLs point to the same exact Stack version and build'
+      },
+
+      'alerts': {
+        'baseURLs': 'Provide Base URLs for the Operating Systems you are configuring. Uncheck all other Operating Systems.',
+        'validationFailed': 'Some of the repositories failed validation. Make changes to the base url or skip validation if you are sure that urls are correct',
+        'skipValidationWarning': '<b>Warning:</b> This is for advanced users only. Use this option if you want to skip validation for Repository Base URLs.',
+        'filterListError': 'Fetch stack version filter list error',
+        'versionCreated': 'Created version <a href="#/stackVersions/{{stackName}}/{{versionName}}/edit">{{stackName}}-{{versionName}}</a>',
+        'versionCreationError': 'Version creation error',
+        'osListError': 'getSupportedOSList error',
+        'versionEdited': 'Edited version <a href="#/stackVersions/{{stackName}}/{{versionName}}/edit">{{displayName}}</a>',
+        'versionUpdateError': 'Version update error',
+        'versionDeleteError': 'Version delete error'
+      }
+    }
   });
 
   $translateProvider.preferredLanguage('en');

+ 1 - 1
ambari-admin/src/main/resources/ui/admin-web/app/scripts/services/Alert.js

@@ -48,7 +48,7 @@ angular.module('ambariAdminConsole')
       elem.append('<div class="more">'+moreInfo.replace(/\./g, '.<wbr />')+'</div>');
     }
 
-    $('<button type="button" class="close"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>')
+    $('<button type="button" class="close"><span aria-hidden="true">&times;</span><span class="sr-only">{{"common.controls.close" | translate}}</span></button>')
       .appendTo(elem)
       .on('click', function() {
         var $box = $(this).closest('.ambariAlert');

+ 5 - 3
ambari-admin/src/main/resources/ui/admin-web/app/scripts/services/ConfirmationModal.js

@@ -18,7 +18,9 @@
 'use strict';
 
 angular.module('ambariAdminConsole')
-.factory('ConfirmationModal', ['$modal', '$q', function($modal, $q) {
+.factory('ConfirmationModal', ['$modal', '$q', '$translate', function($modal, $q, $translate) {
+
+  var $t = $translate.instant;
 
 	return {
 		show: function(header, body, confirmText, cancelText) {
@@ -31,8 +33,8 @@ angular.module('ambariAdminConsole')
           $scope.isTempalte = !!body.url;
 					$scope.body = body;
           $scope.innerScope = body.scope;
-          $scope.confirmText = confirmText || "OK";
-          $scope.cancelText = cancelText || "Cancel";
+          $scope.confirmText = confirmText || $t('common.controls.ok');
+          $scope.cancelText = cancelText || $t('common.controls.cancel');
 
 					$scope.ok = function() {
 						$modalInstance.close();

+ 16 - 15
ambari-admin/src/main/resources/ui/admin-web/app/scripts/services/Stack.js

@@ -18,20 +18,21 @@
 'use strict';
 
 angular.module('ambariAdminConsole')
-.factory('Stack', ['$http', '$q', 'Settings', function ($http, $q, Settings) {
-  var statusMap = {
-    'INSTALLED': {
-      label: 'Installed',
-      class: 'label-default'
-    },
-    'IN_USE': {
-      label: 'In Use',
-      class: 'label-info'
-    },
-    'CURRENT': {
-      label: 'Current',
-      class: 'label-success'
-    }
+.factory('Stack', ['$http', '$q', 'Settings', '$translate', function ($http, $q, Settings,$translate) {
+  var $t = $translate.instant,
+    statusMap = {
+      'INSTALLED': {
+        label: $t('versions.installed'),
+        class: 'label-default'
+      },
+      'IN_USE': {
+        label: $t('versions.inUse'),
+        class: 'label-info'
+      },
+      'CURRENT': {
+        label: $t('versions.current'),
+        class: 'label-success'
+      }
   };
   /**
    * parse raw json to formatted objects
@@ -199,7 +200,7 @@ angular.module('ambariAdminConsole')
     },
 
     getSupportedOSList: function (stackName, stackVersion) {
-      var url = Settings.baseUrl + '/stacks/' + stackName + '/versions/' + stackVersion + '?fields=operating_systems/repositories/Repositories'
+      var url = Settings.baseUrl + '/stacks/' + stackName + '/versions/' + stackVersion + '?fields=operating_systems/repositories/Repositories';
       var deferred = $q.defer();
       $http.get(url, {mock: 'stack/operatingSystems.json'})
       .success(function (data) {

+ 1 - 1
ambari-admin/src/main/resources/ui/admin-web/app/scripts/services/UnsavedDialog.js

@@ -22,7 +22,7 @@ angular.module('ambariAdminConsole')
 
 	return function(){
 		var modalInstance = $modal.open({
-      template: '<div class="modal-header"><h3 class="modal-title">Warning</h3></div><div class="modal-body">You have unsaved changes. Save changes or discard?</div><div class="modal-footer"><div class="btn btn-default" ng-click="cancel()">Cancel</div><div class="btn btn-warning" ng-click="discard()">Discard</div><div class="btn btn-primary" ng-click="save()">Save</div></div>',
+      template: '<div class="modal-header"><h3 class="modal-title">{{"common.warning" | translate}}</h3></div><div class="modal-body">{{"common.alerts.unsavedChanges" | translate}}</div><div class="modal-footer"><div class="btn btn-default" ng-click="cancel()">{{"common.controls.cancel" | translate}}</div><div class="btn btn-warning" ng-click="discard()">{{"common.controls.discard" | translate}}</div><div class="btn btn-primary" ng-click="save()">{{"common.controls.save" | translate}}</div></div>',
       controller: ['$scope', '$modalInstance', function($scope, $modalInstance) {
         $scope.save = function() {
           $modalInstance.close('save');

+ 3 - 3
ambari-admin/src/main/resources/ui/admin-web/app/scripts/services/UserConstants.js

@@ -24,15 +24,15 @@ angular.module('ambariAdminConsole').constant('UserConstants', {
   TYPES: {
     LOCAL: {
       VALUE: 'LOCAL',
-      NAME: 'Local'
+      LABEL_KEY: 'common.local'
     },
     LDAP: {
       VALUE: 'LDAP',
-      NAME: 'LDAP'
+      LABEL_KEY: 'common.ldap'
     },
     JWT: {
       VALUE: 'JWT',
-      NAME: 'JWT'
+      LABEL_KEY: 'common.jwt'
     }
   }
 });