diff --git a/api/cmd/portainer/main.go b/api/cmd/portainer/main.go index aced452a7..58904e19d 100644 --- a/api/cmd/portainer/main.go +++ b/api/cmd/portainer/main.go @@ -125,6 +125,7 @@ func initSettings(settingsService portainer.SettingsService, flags *portainer.CL portainer.LDAPSearchSettings{}, }, }, + Language: "en", } if *flags.Templates != "" { diff --git a/api/http/handler/settings.go b/api/http/handler/settings.go index 52e957f6d..64c66ebe0 100644 --- a/api/http/handler/settings.go +++ b/api/http/handler/settings.go @@ -57,6 +57,7 @@ type ( DisplayExternalContributors bool `valid:""` AuthenticationMethod int `valid:"required"` LDAPSettings portainer.LDAPSettings `valid:""` + Language string `valid:"required"` } putSettingsLDAPCheckRequest struct { @@ -114,6 +115,7 @@ func (handler *SettingsHandler) handlePutSettings(w http.ResponseWriter, r *http BlackListedLabels: req.BlackListedLabels, DisplayExternalContributors: req.DisplayExternalContributors, LDAPSettings: req.LDAPSettings, + Language: req.Language, } if req.AuthenticationMethod == 1 { diff --git a/api/portainer.go b/api/portainer.go index 69d8e9290..1ccff97f4 100644 --- a/api/portainer.go +++ b/api/portainer.go @@ -75,6 +75,7 @@ type ( DisplayExternalContributors bool `json:"DisplayExternalContributors"` AuthenticationMethod AuthenticationMethod `json:"AuthenticationMethod"` LDAPSettings LDAPSettings `json:"LDAPSettings"` + Language string `json:"Language"` } // User represents a user account. diff --git a/app/components/dashboard/dashboard.html b/app/components/dashboard/dashboard.html index b513c54ff..063ec3090 100644 --- a/app/components/dashboard/dashboard.html +++ b/app/components/dashboard/dashboard.html @@ -8,24 +8,24 @@
- + - + - + - + - + diff --git a/app/components/settings/settings.html b/app/components/settings/settings.html index f5215edb1..55003ac71 100644 --- a/app/components/settings/settings.html +++ b/app/components/settings/settings.html @@ -11,6 +11,20 @@
+ +
+ Language +
+
+ +
+ +
+
+
Logo diff --git a/app/components/settings/settingsController.js b/app/components/settings/settingsController.js index f74f7def7..cfea8a9da 100644 --- a/app/components/settings/settingsController.js +++ b/app/components/settings/settingsController.js @@ -55,6 +55,7 @@ function ($scope, $state, Notifications, SettingsService, StateManager, DEFAULT_ .then(function success(data) { Notifications.success('Settings updated'); StateManager.updateLogo(settings.LogoURL); + StateManager.updateLang(settings.Language); StateManager.updateExternalContributions(settings.DisplayExternalContributors); if (resetForm) { resetFormValues(); diff --git a/app/directives/widget-header.js b/app/directives/widget-header.js index 9e047aaa1..0741ee7dd 100644 --- a/app/directives/widget-header.js +++ b/app/directives/widget-header.js @@ -9,7 +9,7 @@ angular classes: '@?' }, transclude: true, - template: '
{{title}}
', + template: '
{{title}}
', restrict: 'E' }; return directive; diff --git a/app/models/api/settings/settings.js b/app/models/api/settings/settings.js index b8d473172..9b7ce086c 100644 --- a/app/models/api/settings/settings.js +++ b/app/models/api/settings/settings.js @@ -5,4 +5,5 @@ function SettingsViewModel(data) { this.DisplayExternalContributors = data.DisplayExternalContributors; this.AuthenticationMethod = data.AuthenticationMethod; this.LDAPSettings = data.LDAPSettings; + this.Language = data.Language; } diff --git a/app/services/stateManager.js b/app/services/stateManager.js index 9385237a7..07595e59a 100644 --- a/app/services/stateManager.js +++ b/app/services/stateManager.js @@ -1,5 +1,5 @@ angular.module('portainer.services') -.factory('StateManager', ['$q', 'SystemService', 'InfoHelper', 'LocalStorage', 'SettingsService', 'StatusService', function StateManagerFactory($q, SystemService, InfoHelper, LocalStorage, SettingsService, StatusService) { +.factory('StateManager', ['$q', 'TranslationService', 'SystemService', 'InfoHelper', 'LocalStorage', 'SettingsService', 'StatusService', function StateManagerFactory($q, TranslationService, SystemService, InfoHelper, LocalStorage, SettingsService, StatusService) { 'use strict'; var manager = {}; @@ -24,6 +24,12 @@ angular.module('portainer.services') LocalStorage.storeApplicationState(state.application); }; + manager.updateLang = function(lang) { + state.application.lang = lang; + LocalStorage.storeApplicationState(state.application); + TranslationService.setLang(state.application.lang); + }; + manager.updateExternalContributions = function(displayExternalContributors) { state.application.displayExternalContributors = displayExternalContributors; LocalStorage.storeApplicationState(state.application); @@ -41,6 +47,7 @@ angular.module('portainer.services') if (applicationState) { state.application = applicationState; state.loading = false; + TranslationService.setLang(state.application.lang); deferred.resolve(state); } else { $q.all({ @@ -55,8 +62,10 @@ angular.module('portainer.services') state.application.endpointManagement = status.EndpointManagement; state.application.version = status.Version; state.application.logo = settings.LogoURL; + state.application.lang = settings.Language; state.application.displayExternalContributors = settings.DisplayExternalContributors; LocalStorage.storeApplicationState(state.application); + TranslationService.setLang(state.application.lang); deferred.resolve(state); }) .catch(function error(err) { diff --git a/app/services/translationService.js b/app/services/translationService.js new file mode 100644 index 000000000..f7efaf795 --- /dev/null +++ b/app/services/translationService.js @@ -0,0 +1,12 @@ +angular.module('portainer.services') +.factory('TranslationService', ['$translate', function TranslationServiceFactory($translate) { + 'use strict'; + + var service = {}; + + service.setLang = function(lang) { + $translate.use(lang); + }; + + return service; +}]); diff --git a/assets/i18n/en.json b/assets/i18n/en.json index c75f6af1c..13069e092 100644 --- a/assets/i18n/en.json +++ b/assets/i18n/en.json @@ -1,5 +1,11 @@ { - "DASHBOARD": { - "NODE_NAME": "Name" + "DASHBOARD": { + "WIDGET_NODE": { + "TITLE": "Node info", + "NODE_NAME": "Name", + "DOCKER_VERSION": "Docker version", + "CPU": "CPU", + "MEMORY": "Memory" } + } } diff --git a/assets/i18n/fr.json b/assets/i18n/fr.json index aeb3fd421..0e8edf45e 100644 --- a/assets/i18n/fr.json +++ b/assets/i18n/fr.json @@ -1,5 +1,11 @@ { - "DASHBOARD": { - "NODE_NAME": "Nom" + "DASHBOARD": { + "WIDGET_NODE": { + "TITLE": "Informations à propos de l'hôte", + "NODE_NAME": "Nom", + "DOCKER_VERSION": "Version de Docker", + "CPU": "Processeurs", + "MEMORY": "Mémoire" } + } }
{{ 'DASHBOARD.NODE_NAME' | translate }}DASHBOARD.WIDGET_NODE.NODE_NAME {{ infoData.Name }}
Docker versionDASHBOARD.WIDGET_NODE.DOCKER_VERSION {{ infoData.ServerVersion }}
CPUDASHBOARD.WIDGET_NODE.CPU {{ infoData.NCPU }}
MemoryDASHBOARD.WIDGET_NODE.MEMORY {{ infoData.MemTotal|humansize }}