You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ro...@apache.org on 2020/06/13 06:01:22 UTC

[cloudstack-primate] branch master updated: config: fix translation key usage for API actions and elsewhere (#407)

This is an automated email from the ASF dual-hosted git repository.

rohit pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cloudstack-primate.git


The following commit(s) were added to refs/heads/master by this push:
     new a608b37  config: fix translation key usage for API actions and elsewhere (#407)
a608b37 is described below

commit a608b3761ec59bccda35e66286a0a40314ce8ed4
Author: davidjumani <dj...@gmail.com>
AuthorDate: Sat Jun 13 11:31:14 2020 +0530

    config: fix translation key usage for API actions and elsewhere (#407)
    
    - Adds API messages
    - Fixes English strings to use keys
    - Fixes/adds missing keys to en.json
    - Fixes locale load/store issue across logout/login
    
    FIxes #410
    
    Signed-off-by: Rohit Yadav <ro...@shapeblue.com>
    Co-authored-by: Rohit Yadav <ro...@shapeblue.com>
---
 src/components/header/HeaderNotice.vue             |  4 +--
 src/components/header/TranslationMenu.vue          |  6 +++-
 src/components/header/UserMenu.vue                 |  6 ++--
 src/components/view/DedicateData.vue               | 24 +++++++-------
 src/components/view/DedicateModal.vue              | 24 +++++++-------
 src/components/view/DetailSettings.vue             |  6 ++--
 src/components/view/DetailsTab.vue                 |  2 +-
 src/components/view/FormView.vue                   | 12 +++----
 src/components/view/InfoCard.vue                   |  9 +++---
 src/components/view/ListView.vue                   | 22 +++++++++----
 src/components/view/SettingsTab.vue                |  2 +-
 src/components/view/TreeView.vue                   |  2 +-
 src/config/section/account.js                      |  5 +++
 src/config/section/compute.js                      | 11 +++++++
 src/config/section/config.js                       | 11 +++----
 src/config/section/domain.js                       |  1 +
 src/config/section/event.js                        |  2 ++
 src/config/section/image.js                        |  2 ++
 src/config/section/infra.js                        |  4 ++-
 src/config/section/infra/clusters.js               |  9 ++++++
 src/config/section/infra/hosts.js                  | 14 ++++++++
 src/config/section/infra/ilbvms.js                 |  1 +
 src/config/section/infra/nsp.js                    |  2 ++
 src/config/section/infra/phynetworks.js            |  3 +-
 src/config/section/infra/pods.js                   |  3 ++
 src/config/section/infra/primaryStorages.js        |  2 ++
 src/config/section/infra/routers.js                |  5 +++
 src/config/section/infra/secondaryStorages.js      |  1 +
 src/config/section/infra/systemVms.js              |  4 +++
 src/config/section/infra/zones.js                  |  9 ++++++
 src/config/section/network.js                      | 20 ++++++++++--
 src/config/section/offering.js                     | 10 ++++++
 src/config/section/project.js                      |  3 ++
 src/config/section/role.js                         |  1 +
 src/config/section/storage.js                      | 18 +++++++++--
 src/config/section/user.js                         |  4 +++
 src/locales/ar.json                                |  2 +-
 src/locales/ca.json                                |  2 +-
 src/locales/de_DE.json                             |  2 +-
 src/locales/en.json                                | 37 ++++++++++++++++++++--
 src/locales/es.json                                |  2 +-
 src/locales/fr_FR.json                             |  2 +-
 src/locales/hu.json                                |  2 +-
 src/locales/index.js                               |  2 +-
 src/locales/it_IT.json                             |  2 +-
 src/locales/ja_JP.json                             |  2 +-
 src/locales/ko_KR.json                             |  2 +-
 src/locales/nb_NO.json                             |  2 +-
 src/locales/nl_NL.json                             |  2 +-
 src/locales/pl.json                                |  2 +-
 src/locales/pt_BR.json                             |  2 +-
 src/locales/ru_RU.json                             |  2 +-
 src/locales/zh_CN.json                             |  2 +-
 src/utils/plugins.js                               |  3 +-
 src/views/AutogenView.vue                          | 28 ++++++++--------
 src/views/auth/Login.vue                           |  6 ++--
 src/views/compute/AssignInstance.vue               |  2 +-
 src/views/compute/DeployVM.vue                     |  4 +--
 src/views/compute/MigrateWizard.vue                |  2 +-
 src/views/compute/backup/FormSchedule.vue          |  6 ++--
 .../compute/wizard/AffinityGroupSelection.vue      |  2 +-
 .../compute/wizard/ComputeOfferingSelection.vue    |  2 +-
 src/views/compute/wizard/DiskOfferingSelection.vue |  2 +-
 src/views/compute/wizard/NetworkSelection.vue      |  2 +-
 src/views/compute/wizard/SshKeyPairSelection.vue   |  2 +-
 src/views/compute/wizard/TemplateIsoSelection.vue  |  2 +-
 src/views/iam/AddLdapAccount.vue                   |  6 ++--
 src/views/iam/RolePermissionTab.vue                |  2 +-
 src/views/image/IsoZones.vue                       |  6 ++--
 src/views/image/RegisterOrUploadIso.vue            | 14 ++++----
 src/views/image/RegisterOrUploadTemplate.vue       | 26 +++++++--------
 src/views/image/TemplateZones.vue                  |  6 ++--
 src/views/infra/AddPrimaryStorage.vue              | 34 ++++++++++----------
 src/views/infra/AddSecondaryStorage.vue            | 20 ++++++------
 src/views/infra/ClusterAdd.vue                     |  6 ++--
 src/views/infra/CpuSockets.vue                     |  6 ++++
 src/views/infra/HostAdd.vue                        |  6 ++--
 src/views/infra/InfraSummary.vue                   | 28 ++++++++--------
 src/views/infra/PodAdd.vue                         | 16 +++++-----
 src/views/infra/network/DedicatedVLANTab.vue       |  8 ++---
 src/views/infra/network/IpRangesTabManagement.vue  | 10 +++---
 src/views/infra/network/IpRangesTabPublic.vue      |  8 ++---
 src/views/infra/network/IpRangesTabStorage.vue     | 10 +++---
 .../infra/zone/ZoneWizardNetworkSetupStep.vue      | 22 ++++++-------
 .../zone/ZoneWizardPhysicalNetworkSetupStep.vue    |  4 +--
 src/views/network/AclListRulesTab.vue              | 14 ++++----
 src/views/network/CreateIsolatedNetworkForm.vue    |  6 ++--
 src/views/network/CreateL2NetworkForm.vue          |  4 +--
 src/views/network/CreateSharedNetworkForm.vue      |  8 ++---
 src/views/network/CreateVpnCustomerGateway.vue     |  8 ++---
 src/views/network/EnableStaticNat.vue              |  2 +-
 src/views/network/FirewallRules.vue                |  2 +-
 src/views/network/IngressEgressRuleConfigure.vue   |  2 +-
 src/views/network/InternalLBAssignVmForm.vue       |  6 +++-
 src/views/network/LoadBalancing.vue                | 34 ++++++++++----------
 src/views/network/VpcTab.vue                       | 24 +++++++-------
 src/views/network/VpcTiersTab.vue                  | 10 +++---
 src/views/offering/AddNetworkOffering.vue          |  4 +--
 src/views/offering/AddVpcOffering.vue              |  2 +-
 src/views/offering/ImportBackupOffering.vue        |  2 +-
 src/views/offering/UpdateOfferingAccess.vue        |  2 +-
 src/views/project/InvitationTokenTemplate.vue      |  4 +--
 src/views/project/InvitationsTemplate.vue          |  2 +-
 src/views/storage/FormSchedule.vue                 |  8 ++---
 src/views/storage/MigrateVolume.vue                |  8 +++--
 src/views/storage/ResizeVolume.vue                 |  2 +-
 src/views/storage/RestoreAttachBackupVolume.vue    |  4 +--
 src/views/storage/UploadLocalVolume.vue            |  6 ++--
 108 files changed, 492 insertions(+), 306 deletions(-)

diff --git a/src/components/header/HeaderNotice.vue b/src/components/header/HeaderNotice.vue
index 897c88c..ab9247e 100644
--- a/src/components/header/HeaderNotice.vue
+++ b/src/components/header/HeaderNotice.vue
@@ -27,9 +27,9 @@
       <a-spin :spinning="loading">
         <a-list style="min-width: 200px; max-width: 300px">
           <a-list-item>
-            <a-list-item-meta title="Notifications">
+            <a-list-item-meta :title="$t('label.notifications')">
               <a-avatar :style="{backgroundColor: '#6887d0', verticalAlign: 'middle'}" icon="notification" slot="avatar"/>
-              <a-button size="small" slot="description" @click="clearJobs">Clear All</a-button>
+              <a-button size="small" slot="description" @click="clearJobs">{{ $t('label.clear.list') }}</a-button>
             </a-list-item-meta>
           </a-list-item>
           <a-list-item v-for="(job, index) in jobs" :key="index">
diff --git a/src/components/header/TranslationMenu.vue b/src/components/header/TranslationMenu.vue
index a365208..7d49735 100644
--- a/src/components/header/TranslationMenu.vue
+++ b/src/components/header/TranslationMenu.vue
@@ -93,6 +93,10 @@ export default {
       hi
     }
   },
+  mounted () {
+    this.language = Vue.ls.get('LOCALE') || 'en'
+    this.setLocale(this.language)
+  },
   methods: {
     moment,
     onClick (e) {
@@ -107,7 +111,7 @@ export default {
       this.$i18n.locale = localeValue
       this.language = localeValue
       moment.locale(localeValue)
-      Vue.ls.set('current_locale', localeValue)
+      Vue.ls.set('LOCALE', localeValue)
     }
   }
 }
diff --git a/src/components/header/UserMenu.vue b/src/components/header/UserMenu.vue
index 1f33a0f..b697f29 100644
--- a/src/components/header/UserMenu.vue
+++ b/src/components/header/UserMenu.vue
@@ -29,20 +29,20 @@
         <a-menu-item class="user-menu-item" key="0">
           <router-link :to="{ path: '/accountuser/' + $store.getters.userInfo.id }">
             <a-icon class="user-menu-item-icon" type="user"/>
-            <span class="user-menu-item-name">Profile</span>
+            <span class="user-menu-item-name">{{ $t('label.profilename') }}</span>
           </router-link>
         </a-menu-item>
         <a-menu-item class="user-menu-item" key="1" disabled>
           <a :href="docBase" target="_blank">
             <a-icon class="user-menu-item-icon" type="question-circle-o"></a-icon>
-            <span class="user-menu-item-name">Help</span>
+            <span class="user-menu-item-name">{{ $t('label.help') }}</span>
           </a>
         </a-menu-item>
         <a-menu-divider/>
         <a-menu-item class="user-menu-item" key="2">
           <a href="javascript:;" @click="handleLogout">
             <a-icon class="user-menu-item-icon" type="logout"/>
-            <span class="user-menu-item-name">Logout</span>
+            <span class="user-menu-item-name">{{ $t('label.logout') }}</span>
           </a>
         </a-menu-item>
       </a-menu>
diff --git a/src/components/view/DedicateData.vue b/src/components/view/DedicateData.vue
index 9c5a93a..3adc7c7 100644
--- a/src/components/view/DedicateData.vue
+++ b/src/components/view/DedicateData.vue
@@ -169,12 +169,12 @@ export default {
       }).then(response => {
         this.$pollJob({
           jobId: response.releasededicatedzoneresponse.jobid,
-          successMessage: `Successfully released dedicated zone`,
+          successMessage: this.$t('message.dedicated.zone.released'),
           successMethod: () => {
             this.parentFetchData()
             this.dedicatedDomainId = null
             this.$store.dispatch('AddAsyncJob', {
-              title: 'Successfully released dedicated zone',
+              title: this.$t('message.dedicated.zone.released'),
               jobid: response.releasededicatedzoneresponse.jobid,
               status: 'progress'
             })
@@ -183,7 +183,7 @@ export default {
           errorMethod: () => {
             this.parentFetchData()
           },
-          loadingMessage: `Releasing dedicated zone...`,
+          loadingMessage: this.$t('message.releasing.dedicated.zone'),
           catchMessage: 'Error encountered while fetching async job result',
           catchMethod: () => {
             this.parentFetchData()
@@ -199,12 +199,12 @@ export default {
       }).then(response => {
         this.$pollJob({
           jobId: response.releasededicatedpodresponse.jobid,
-          successMessage: `Successfully released dedicated pod`,
+          successMessage: this.$t('message.pod.dedication.released'),
           successMethod: () => {
             this.parentFetchData()
             this.dedicatedDomainId = null
             this.$store.dispatch('AddAsyncJob', {
-              title: 'Successfully released dedicated pod',
+              title: this.$t('message.pod.dedication.released'),
               jobid: response.releasededicatedpodresponse.jobid,
               status: 'progress'
             })
@@ -213,7 +213,7 @@ export default {
           errorMethod: () => {
             this.parentFetchData()
           },
-          loadingMessage: `Releasing dedicated pod...`,
+          loadingMessage: this.$t('message.releasing.dedicated.pod'),
           catchMessage: 'Error encountered while fetching async job result',
           catchMethod: () => {
             this.parentFetchData()
@@ -229,12 +229,12 @@ export default {
       }).then(response => {
         this.$pollJob({
           jobId: response.releasededicatedclusterresponse.jobid,
-          successMessage: `Successfully released dedicated cluster`,
+          successMessage: this.$t('message.cluster.dedication.released'),
           successMethod: () => {
             this.parentFetchData()
             this.dedicatedDomainId = null
             this.$store.dispatch('AddAsyncJob', {
-              title: 'Successfully released dedicated cluster',
+              title: this.$t('message.cluster.dedication.released'),
               jobid: response.releasededicatedclusterresponse.jobid,
               status: 'progress'
             })
@@ -243,7 +243,7 @@ export default {
           errorMethod: () => {
             this.parentFetchData()
           },
-          loadingMessage: `Releasing dedicated cluster...`,
+          loadingMessage: this.$t('message.releasing.dedicated.cluster'),
           catchMessage: 'Error encountered while fetching async job result',
           catchMethod: () => {
             this.parentFetchData()
@@ -259,12 +259,12 @@ export default {
       }).then(response => {
         this.$pollJob({
           jobId: response.releasededicatedhostresponse.jobid,
-          successMessage: `Successfully released dedicated host`,
+          successMessage: this.$t('message.host.dedication.released'),
           successMethod: () => {
             this.parentFetchData()
             this.dedicatedDomainId = null
             this.$store.dispatch('AddAsyncJob', {
-              title: 'Successfully released dedicated host',
+              title: this.$t('message.host.dedication.released'),
               jobid: response.releasededicatedhostresponse.jobid,
               status: 'progress'
             })
@@ -273,7 +273,7 @@ export default {
           errorMethod: () => {
             this.parentFetchData()
           },
-          loadingMessage: `Releasing dedicated host...`,
+          loadingMessage: this.$t('message.releasing.dedicated.host'),
           catchMessage: 'Error encountered while fetching async job result',
           catchMethod: () => {
             this.parentFetchData()
diff --git a/src/components/view/DedicateModal.vue b/src/components/view/DedicateModal.vue
index 73b0e43..a518520 100644
--- a/src/components/view/DedicateModal.vue
+++ b/src/components/view/DedicateModal.vue
@@ -90,14 +90,14 @@ export default {
       }).then(response => {
         this.$pollJob({
           jobId: response.dedicatezoneresponse.jobid,
-          successMessage: `Successfully dedicated zone`,
+          successMessage: this.$t('label.zone.dedicated'),
           successMethod: () => {
             this.parentFetchData()
             this.fetchParentData()
             this.dedicatedDomainId = this.domainId
             this.dedicatedDomainModal = false
             this.$store.dispatch('AddAsyncJob', {
-              title: 'Successfully dedicated zone',
+              title: this.$t('label.zone.dedicated'),
               jobid: response.dedicatezoneresponse.jobid,
               description: `Domain ID: ${this.dedicatedDomainId}`,
               status: 'progress'
@@ -109,7 +109,7 @@ export default {
             this.fetchParentData()
             this.dedicatedDomainModal = false
           },
-          loadingMessage: `Dedicating zone...`,
+          loadingMessage: this.$t('message.dedicating.zone'),
           catchMessage: 'Error encountered while fetching async job result',
           catchMethod: () => {
             this.parentFetchData()
@@ -134,14 +134,14 @@ export default {
       }).then(response => {
         this.$pollJob({
           jobId: response.dedicatepodresponse.jobid,
-          successMessage: `Successfully dedicated pod`,
+          successMessage: this.$t('label.pod.dedicated'),
           successMethod: () => {
             this.parentFetchData()
             this.fetchParentData()
             this.dedicatedDomainId = this.domainId
             this.dedicatedDomainModal = false
             this.$store.dispatch('AddAsyncJob', {
-              title: 'Successfully dedicated pod',
+              title: this.$t('label.pod.dedicated'),
               jobid: response.dedicatepodresponse.jobid,
               description: `Domain ID: ${this.dedicatedDomainId}`,
               status: 'progress'
@@ -153,7 +153,7 @@ export default {
             this.fetchParentData()
             this.dedicatedDomainModal = false
           },
-          loadingMessage: `Dedicating pod...`,
+          loadingMessage: this.$t('message.dedicating.pod'),
           catchMessage: 'Error encountered while fetching async job result',
           catchMethod: () => {
             this.parentFetchData()
@@ -178,14 +178,14 @@ export default {
       }).then(response => {
         this.$pollJob({
           jobId: response.dedicateclusterresponse.jobid,
-          successMessage: `Successfully dedicated cluster`,
+          successMessage: this.$t('message.cluster.dedicated'),
           successMethod: () => {
             this.parentFetchData()
             this.fetchParentData()
             this.dedicatedDomainId = this.domainId
             this.dedicatedDomainModal = false
             this.$store.dispatch('AddAsyncJob', {
-              title: 'Successfully dedicated cluster',
+              title: this.$t('message.cluster.dedicated'),
               jobid: response.dedicateclusterresponse.jobid,
               description: `Domain ID: ${this.dedicatedDomainId}`,
               status: 'progress'
@@ -197,7 +197,7 @@ export default {
             this.fetchParentData()
             this.dedicatedDomainModal = false
           },
-          loadingMessage: `Dedicating cluster...`,
+          loadingMessage: this.$t('message.dedicating.cluster'),
           catchMessage: 'Error encountered while fetching async job result',
           catchMethod: () => {
             this.parentFetchData()
@@ -222,14 +222,14 @@ export default {
       }).then(response => {
         this.$pollJob({
           jobId: response.dedicatehostresponse.jobid,
-          successMessage: `Successfully dedicated host`,
+          successMessage: this.$t('message.host.dedicated'),
           successMethod: () => {
             this.parentFetchData()
             this.fetchParentData()
             this.dedicatedDomainId = this.domainId
             this.dedicatedDomainModal = false
             this.$store.dispatch('AddAsyncJob', {
-              title: 'Successfully dedicated host',
+              title: this.$t('message.host.dedicated'),
               jobid: response.dedicatehostresponse.jobid,
               description: `Domain ID: ${this.dedicatedDomainId}`,
               status: 'progress'
@@ -241,7 +241,7 @@ export default {
             this.fetchParentData()
             this.dedicatedDomainModal = false
           },
-          loadingMessage: `Dedicating host...`,
+          loadingMessage: this.$t('message.dedicating.host'),
           catchMessage: 'Error encountered while fetching async job result',
           catchMethod: () => {
             this.parentFetchData()
diff --git a/src/components/view/DetailSettings.vue b/src/components/view/DetailSettings.vue
index d7e049f..0b02dbb 100644
--- a/src/components/view/DetailSettings.vue
+++ b/src/components/view/DetailSettings.vue
@@ -20,7 +20,7 @@
     <a-alert
       v-if="disableSettings"
       banner
-      message="Please stop the virtual machine to access settings" />
+      :message="$t('message.action.settings.warning.vm.running')" />
     <div v-else>
       <div v-show="!showAddDetail">
         <a-button type="dashed" style="width: 100%" icon="plus" @click="showAddDetail = true">{{ $t('label.add.setting') }}</a-button>
@@ -31,14 +31,14 @@
           :filterOption="filterOption"
           :value="newKey"
           :dataSource="Object.keys(detailOptions)"
-          placeholder="Name"
+          :placeholder="$t('label.name')"
           @change="e => onAddInputChange(e, 'newKey')" />
         <a-auto-complete
           style="width: 100%"
           :filterOption="filterOption"
           :value="newValue"
           :dataSource="detailOptions[newKey]"
-          placeholder="Value"
+          :placeholder="$t('label.value')"
           @change="e => onAddInputChange(e, 'newValue')" />
         <a-button type="primary" style="width: 25%" icon="plus" @click="addDetail">{{ $t('label.add.setting') }}</a-button>
         <a-button type="dashed" style="width: 25%" icon="close" @click="showAddDetail = false">{{ $t('label.cancel') }}</a-button>
diff --git a/src/components/view/DetailsTab.vue b/src/components/view/DetailsTab.vue
index be553ac..250eace 100644
--- a/src/components/view/DetailsTab.vue
+++ b/src/components/view/DetailsTab.vue
@@ -21,7 +21,7 @@
     :dataSource="$route.meta.details">
     <a-list-item slot="renderItem" slot-scope="item" v-if="item in resource">
       <div>
-        <strong>{{ item === 'service' ? $t('label.supportedservices') : $t('label.' + item) }}</strong>
+        <strong>{{ item === 'service' ? $t('label.supportedservices') : $t('label.' + String(item).toLowerCase()) }}</strong>
         <br/>
         <div v-if="Array.isArray(resource[item]) && item === 'service'">
           <div v-for="(service, idx) in resource[item]" :key="idx">
diff --git a/src/components/view/FormView.vue b/src/components/view/FormView.vue
index ef4e5a9..485ad39 100644
--- a/src/components/view/FormView.vue
+++ b/src/components/view/FormView.vue
@@ -41,7 +41,7 @@
           <span v-if="field.type==='boolean'">
             <a-switch
               v-decorator="[field.name, {
-                rules: [{ required: field.required, message: 'Please provide input' }]
+                rules: [{ required: field.required, message: `${this.$t('message.error.required.input')}` }]
               }]"
               :placeholder="field.description"
             />
@@ -50,7 +50,7 @@
             <a-select
               :loading="field.loading"
               v-decorator="[field.name, {
-                rules: [{ required: field.required, message: 'Please select option' }]
+                rules: [{ required: field.required, message: `${this.$t('message.error.select')}` }]
               }]"
               :placeholder="field.description"
 
@@ -63,7 +63,7 @@
           <span v-else-if="field.type==='long'">
             <a-input-number
               v-decorator="[field.name, {
-                rules: [{ required: field.required, message: 'Please enter a number' }]
+                rules: [{ required: field.required, message: `${this.$t('message.validate.number')}` }]
               }]"
               :placeholder="field.description"
             />
@@ -71,15 +71,15 @@
           <span v-else-if="field.name==='password'">
             <a-input-password
               v-decorator="[field.name, {
-                rules: [{ required: field.required, message: 'Please enter input' }]
+                rules: [{ required: field.required, message: `${this.$t('message.error.required.input')}` }]
               }]"
               :placeholder="field.description"
             />
           </span>
-          <span v-else">
+          <span v-else>
             <a-input
               v-decorator="[field.name, {
-                rules: [{ required: field.required, message: 'Please enter input' }]
+                rules: [{ required: field.required, message: `${this.$t('message.error.required.input')}` }]
               }]"
               :placeholder="field.description"
             />
diff --git a/src/components/view/InfoCard.vue b/src/components/view/InfoCard.vue
index 612e413..daa7e6f 100644
--- a/src/components/view/InfoCard.vue
+++ b/src/components/view/InfoCard.vue
@@ -105,6 +105,7 @@
                 icon="barcode"
                 type="dashed"
                 size="small"
+                @click="$message.success('Copied to clipboard')"
                 v-clipboard:copy="resource.id" />
             </a-tooltip>
             <span style="margin-left: 10px;">{{ resource.id }}</span>
@@ -498,13 +499,13 @@
               <template slot="title">
                 <span>Copy {{ $t('label.apikey') }}</span>
               </template>
-              <a-button shape="circle" type="dashed" size="small" v-clipboard:copy="resource.apikey">
+              <a-button shape="circle" type="dashed" size="small" @click="$message.success('Copied to clipboard')" v-clipboard:copy="resource.apikey">
                 <a-icon type="copy"/>
               </a-button>
             </a-tooltip>
           </strong>
           <div>
-            {{ resource.apikey }}
+            {{ resource.apikey.substring(0, 20) }}...
           </div>
         </div> <br/>
         <div class="user-keys">
@@ -515,13 +516,13 @@
               <template slot="title">
                 <span>Copy {{ $t('label.secretkey') }}</span>
               </template>
-              <a-button shape="circle" type="dashed" size="small" v-clipboard:copy="resource.secretkey">
+              <a-button shape="circle" type="dashed" size="small" @click="$message.success('Copied to clipboard')" v-clipboard:copy="resource.secretkey">
                 <a-icon type="copy"/>
               </a-button>
             </a-tooltip>
           </strong>
           <div>
-            {{ resource.secretkey }}
+            {{ resource.secretkey.substring(0, 20) }}...
           </div>
         </div>
       </div>
diff --git a/src/components/view/ListView.vue b/src/components/view/ListView.vue
index 59b679a..a31c177 100644
--- a/src/components/view/ListView.vue
+++ b/src/components/view/ListView.vue
@@ -60,17 +60,21 @@
     </div>
     -->
 
-    <a slot="name" slot-scope="text, record" href="javascript:;">
+    <span slot="name" slot-scope="text, record">
       <div style="min-width: 120px">
         <span v-if="$route.path.startsWith('/project')" style="margin-right: 5px">
           <a-button type="dashed" size="small" shape="circle" icon="login" @click="changeProject(record)" />
         </span>
         <os-logo v-if="record.ostypename" :osName="record.ostypename" size="1x" style="margin-right: 5px" />
         <console :resource="record" size="small" style="margin-right: 5px" />
-        <router-link :to="{ path: $route.path + '/' + record.id }" v-if="record.id">{{ text }}</router-link>
-        <router-link :to="{ path: $route.path + '/' + record.name }" v-else>{{ text }}</router-link>
+
+        <span v-if="$route.name === 'globalsetting'">{{ text }}</span>
+        <span v-else>
+          <router-link :to="{ path: $route.path + '/' + record.id }" v-if="record.id">{{ text }}</router-link>
+          <router-link :to="{ path: $route.path + '/' + record.name }" v-else>{{ text }}</router-link>
+        </span>
       </div>
-    </a>
+    </span>
     <a slot="displayname" slot-scope="text, record" href="javascript:;">
       <router-link :to="{ path: $route.path + '/' + record.id }">{{ text }}</router-link>
     </a>
@@ -93,6 +97,12 @@
     <a slot="vmname" slot-scope="text, record" href="javascript:;">
       <router-link :to="{ path: '/vm/' + record.virtualmachineid }">{{ text }}</router-link>
     </a>
+    <span slot="hypervisor" slot-scope="text, record">
+      <span v-if="$route.name === 'hypervisorcapability'">
+        <router-link :to="{ path: $route.path + '/' + record.id }">{{ text }}</router-link>
+      </span>
+      <span v-else>{{ text }}</span>
+    </span>
     <template slot="state" slot-scope="text">
       <status :text="text ? text : ''" displayText />
     </template>
@@ -286,8 +296,8 @@ export default {
           !json.updateconfigurationresponse.configuration.isdynamic &&
           ['Admin'].includes(this.$store.getters.userInfo.roletype)) {
           this.$notification.warning({
-            message: 'Status',
-            description: 'Please restart your management server(s) for your new settings to take effect.'
+            message: this.$t('label.status'),
+            description: this.$t('message.restart.mgmt.server')
           })
         }
       }).catch(error => {
diff --git a/src/components/view/SettingsTab.vue b/src/components/view/SettingsTab.vue
index 89b934b..85fafdd 100644
--- a/src/components/view/SettingsTab.vue
+++ b/src/components/view/SettingsTab.vue
@@ -131,7 +131,7 @@ export default {
         console.error(error)
         this.$message.error('There was an error saving this setting.')
         this.$notification.error({
-          message: 'Error',
+          message: this.$t('label.error'),
           description: 'There was an error saving this setting. Please try again later.'
         })
       }).finally(() => {
diff --git a/src/components/view/TreeView.vue b/src/components/view/TreeView.vue
index cd82a81..f3e838e 100644
--- a/src/components/view/TreeView.vue
+++ b/src/components/view/TreeView.vue
@@ -21,7 +21,7 @@
       <a-card :bordered="false">
         <a-input-search
           size="default"
-          placeholder="Search"
+          :placeholder="$t('label.search')"
           v-model="searchQuery"
           @search="onSearch"
         >
diff --git a/src/config/section/account.js b/src/config/section/account.js
index c10bbab..5f4bf8b 100644
--- a/src/config/section/account.js
+++ b/src/config/section/account.js
@@ -85,6 +85,7 @@ export default {
       api: 'updateResourceCount',
       icon: 'sync',
       label: 'label.action.update.resource.count',
+      message: 'message.update.resource.count',
       dataView: true,
       args: ['account', 'domainid'],
       mapping: {
@@ -100,6 +101,7 @@ export default {
       api: 'enableAccount',
       icon: 'play-circle',
       label: 'label.action.enable.account',
+      message: 'message.enable.account',
       dataView: true,
       show: (record) => { return record.state === 'disabled' || record.state === 'locked' },
       params: { lock: 'false' }
@@ -108,6 +110,7 @@ export default {
       api: 'disableAccount',
       icon: 'pause-circle',
       label: 'label.action.disable.account',
+      message: 'message.disable.account',
       dataView: true,
       show: (record) => { return record.state === 'enabled' },
       args: ['lock'],
@@ -121,6 +124,7 @@ export default {
       api: 'disableAccount',
       icon: 'lock',
       label: 'label.action.lock.account',
+      message: 'message.lock.account',
       dataView: true,
       show: (record) => { return record.state === 'enabled' },
       args: ['lock'],
@@ -150,6 +154,7 @@ export default {
       api: 'deleteAccount',
       icon: 'delete',
       label: 'label.action.delete.account',
+      message: 'message.delete.account',
       dataView: true,
       hidden: (record) => { return record.name === 'admin' }
     }
diff --git a/src/config/section/compute.js b/src/config/section/compute.js
index 1c6ce34..1dd82e1 100644
--- a/src/config/section/compute.js
+++ b/src/config/section/compute.js
@@ -83,6 +83,7 @@ export default {
           api: 'startVirtualMachine',
           icon: 'caret-right',
           label: 'label.action.start.instance',
+          message: 'message.action.start.instance',
           docHelp: 'adminguide/virtual_machines.html#stopping-and-starting-vms',
           dataView: true,
           groupAction: true,
@@ -113,6 +114,7 @@ export default {
           api: 'restoreVirtualMachine',
           icon: 'sync',
           label: 'label.reinstall.vm',
+          message: 'message.reinstall.vm',
           dataView: true,
           args: ['virtualmachineid', 'templateid'],
           show: (record) => { return ['Running', 'Stopped'].includes(record.state) },
@@ -142,6 +144,7 @@ export default {
           api: 'assignVirtualMachineToBackupOffering',
           icon: 'folder-add',
           label: 'label.backup.offering.assign',
+          message: 'label.backup.offering.assign',
           dataView: true,
           args: ['virtualmachineid', 'backupofferingid'],
           show: (record) => { return !record.backupofferingid },
@@ -185,6 +188,7 @@ export default {
           api: 'removeVirtualMachineFromBackupOffering',
           icon: 'scissor',
           label: 'label.backup.offering.remove',
+          message: 'label.backup.offering.remove',
           dataView: true,
           args: ['virtualmachineid', 'forced'],
           show: (record) => { return record.backupofferingid },
@@ -214,6 +218,7 @@ export default {
           api: 'detachIso',
           icon: 'link',
           label: 'label.action.detach.iso',
+          message: 'message.detach.iso.confirm',
           dataView: true,
           args: ['virtualmachineid'],
           show: (record) => { return ['Running', 'Stopped'].includes(record.state) && 'isoid' in record && record.isoid },
@@ -267,6 +272,7 @@ export default {
           api: 'migrateVirtualMachine',
           icon: 'drag',
           label: 'label.migrate.instance.to.ps',
+          message: 'message.migrate.instance.to.ps',
           dataView: true,
           show: (record, store) => { return ['Stopped'].includes(record.state) && ['Admin'].includes(store.userInfo.roletype) },
           args: ['storageid', 'virtualmachineid'],
@@ -283,6 +289,7 @@ export default {
           api: 'resetPasswordForVirtualMachine',
           icon: 'key',
           label: 'label.action.reset.password',
+          message: 'message.action.instance.reset.password',
           dataView: true,
           show: (record) => { return ['Running', 'Stopped'].includes(record.state) },
           response: (result) => { return result.virtualmachine && result.virtualmachine.password ? `Password of the VM is ${result.virtualmachine.password}` : null }
@@ -319,6 +326,7 @@ export default {
           api: 'recoverVirtualMachine',
           icon: 'medicine-box',
           label: 'label.recover.vm',
+          message: 'message.recover.vm',
           dataView: true,
           show: (record, store) => { return ['Destroyed'].includes(record.state) && store.features.allowuserexpungerecovervm }
         },
@@ -334,6 +342,7 @@ export default {
           api: 'expungeVirtualMachine',
           icon: 'delete',
           label: 'label.action.expunge.instance',
+          message: 'message.action.expunge.instance',
           dataView: true,
           show: (record, store) => { return ['Destroyed', 'Expunging'].includes(record.state) && store.features.allowuserexpungerecovervm }
         },
@@ -341,6 +350,7 @@ export default {
           api: 'destroyVirtualMachine',
           icon: 'delete',
           label: 'label.action.destroy.instance',
+          message: 'message.action.destroy.instance',
           args: ['expunge', 'volumeids'],
           mapping: {
             volumeids: {
@@ -523,6 +533,7 @@ export default {
           api: 'deleteAffinityGroup',
           icon: 'delete',
           label: 'label.delete.affinity.group',
+          message: 'message.delete.affinity.group',
           dataView: true
         }
       ]
diff --git a/src/config/section/config.js b/src/config/section/config.js
index bd64078..1e6531b 100644
--- a/src/config/section/config.js
+++ b/src/config/section/config.js
@@ -26,8 +26,7 @@ export default {
       title: 'label.global.settings',
       icon: 'setting',
       permission: ['listConfigurations'],
-      columns: ['name', 'description', 'category', 'value', 'actions'],
-      details: ['name', 'category', 'description', 'value']
+      columns: ['name', 'description', 'category', 'value', 'actions']
     },
     {
       name: 'ldapsetting',
@@ -50,6 +49,7 @@ export default {
           api: 'deleteLdapConfiguration',
           icon: 'delete',
           label: 'label.remove.ldap',
+          message: 'message.remove.ldap',
           dataView: true,
           args: ['hostname'],
           mapping: {
@@ -65,16 +65,15 @@ export default {
       title: 'label.hypervisor.capabilities',
       icon: 'database',
       permission: ['listHypervisorCapabilities'],
-      columns: ['hypervisor', 'hypervisorversion', 'maxguestslimit', 'maxdatavolumeslimit', 'maxhostspercluster'],
+      columns: ['hypervisor', 'hypervisorversion', 'maxguestslimit', 'maxhostspercluster'],
+      details: ['hypervisor', 'hypervisorversion', 'maxguestslimit', 'maxdatavolumeslimit', 'maxhostspercluster', 'securitygroupenabled', 'storagemotionenabled'],
       actions: [
         {
           api: 'updateHypervisorCapabilities',
           icon: 'edit',
           label: 'label.edit',
           dataView: true,
-          args: [
-            'id', 'maxguestslimit'
-          ]
+          args: ['maxguestslimit']
         }
       ]
     }
diff --git a/src/config/section/domain.js b/src/config/section/domain.js
index 004f2c3..72a17de 100644
--- a/src/config/section/domain.js
+++ b/src/config/section/domain.js
@@ -76,6 +76,7 @@ export default {
       api: 'updateResourceCount',
       icon: 'sync',
       label: 'label.action.update.resource.count',
+      message: 'message.update.resource.count',
       listView: true,
       dataView: true,
       args: ['domainid'],
diff --git a/src/config/section/event.js b/src/config/section/event.js
index 36ef1f0..d0ccea7 100644
--- a/src/config/section/event.js
+++ b/src/config/section/event.js
@@ -32,6 +32,7 @@ export default {
       api: 'archiveEvents',
       icon: 'book',
       label: 'label.archive.events',
+      message: 'message.confirm.archive.selected.events',
       listView: false,
       dataView: true,
       args: ['ids'],
@@ -45,6 +46,7 @@ export default {
       api: 'deleteEvents',
       icon: 'delete',
       label: 'label.delete.events',
+      message: 'message.confirm.remove.selected.events',
       listView: false,
       dataView: true,
       args: ['ids'],
diff --git a/src/config/section/image.js b/src/config/section/image.js
index 046d3a3..82a12dc 100644
--- a/src/config/section/image.js
+++ b/src/config/section/image.js
@@ -75,6 +75,7 @@ export default {
           api: 'extractTemplate',
           icon: 'cloud-download',
           label: 'label.action.download.template',
+          message: 'message.action.download.template',
           dataView: true,
           show: (record) => { return record && record.isextractable },
           args: ['zoneid', 'mode'],
@@ -149,6 +150,7 @@ export default {
           api: 'extractIso',
           icon: 'cloud-download',
           label: 'label.action.download.iso',
+          message: 'message.action.download.iso',
           dataView: true,
           show: (record) => { return record && record.isextractable },
           args: ['zoneid', 'mode'],
diff --git a/src/config/section/infra.js b/src/config/section/infra.js
index fc12b12..2372b0c 100644
--- a/src/config/section/infra.js
+++ b/src/config/section/infra.js
@@ -77,6 +77,7 @@ export default {
           api: 'archiveAlerts',
           icon: 'book',
           label: 'label.archive.alerts',
+          message: 'message.confirm.archive.selected.alerts',
           dataView: true,
           args: ['ids'],
           mapping: {
@@ -88,7 +89,8 @@ export default {
         {
           api: 'deleteAlerts',
           icon: 'delete',
-          label: 'label.delete.events',
+          label: 'label.delete.alerts',
+          message: 'message.confirm.remove.selected.alerts',
           dataView: true,
           args: ['ids'],
           mapping: {
diff --git a/src/config/section/infra/clusters.js b/src/config/section/infra/clusters.js
index 955cfb2..ac3868d 100644
--- a/src/config/section/infra/clusters.js
+++ b/src/config/section/infra/clusters.js
@@ -47,6 +47,7 @@ export default {
       api: 'updateCluster',
       icon: 'play-circle',
       label: 'label.action.enable.cluster',
+      message: 'message.action.enable.cluster',
       dataView: true,
       defaultArgs: { allocationstate: 'Enabled' },
       show: (record) => { return record.allocationstate === 'Disabled' }
@@ -55,6 +56,7 @@ export default {
       api: 'updateCluster',
       icon: 'pause-circle',
       label: 'label.action.disable.cluster',
+      message: 'message.action.disable.cluster',
       dataView: true,
       defaultArgs: { allocationstate: 'Disabled' },
       show: (record) => { return record.allocationstate === 'Enabled' }
@@ -63,6 +65,7 @@ export default {
       api: 'updateCluster',
       icon: 'plus-square',
       label: 'label.action.manage.cluster',
+      message: 'message.action.manage.cluster',
       dataView: true,
       defaultArgs: { managedstate: 'Managed' },
       show: (record) => { return record.clustertype === 'CloudManaged' && ['PrepareUnmanaged', 'Unmanaged'].includes(record.state) }
@@ -71,6 +74,7 @@ export default {
       api: 'updateCluster',
       icon: 'minus-square',
       label: 'label.action.unmanage.cluster',
+      message: 'message.action.unmanage.cluster',
       dataView: true,
       defaultArgs: { managedstate: 'Unmanaged' },
       show: (record) => { return record.clustertype === 'CloudManaged' && record.state === 'Enabled' }
@@ -79,6 +83,7 @@ export default {
       api: 'enableOutOfBandManagementForCluster',
       icon: 'plus-circle',
       label: 'label.outofbandmanagement.enable',
+      message: 'label.outofbandmanagement.enable',
       dataView: true,
       show: (record) => {
         return !record.resourcedetails || !record.resourcedetails.outOfBandManagementEnabled ||
@@ -95,6 +100,7 @@ export default {
       api: 'disableOutOfBandManagementForCluster',
       icon: 'minus-circle',
       label: 'label.outofbandmanagement.disable',
+      message: 'label.outofbandmanagement.disable',
       dataView: true,
       show: (record) => {
         return record.resourcedetails && record.resourcedetails.outOfBandManagementEnabled &&
@@ -111,6 +117,7 @@ export default {
       api: 'enableHAForCluster',
       icon: 'eye',
       label: 'label.ha.enable',
+      message: 'label.ha.enable',
       dataView: true,
       show: (record) => {
         return !record.resourcedetails || !record.resourcedetails.resourceHAEnabled ||
@@ -127,6 +134,7 @@ export default {
       api: 'disableHAForCluster',
       icon: 'eye-invisible',
       label: 'label.ha.disable',
+      message: 'label.ha.disable',
       dataView: true,
       show: (record) => {
         return record.resourcedetails && record.resourcedetails.resourceHAEnabled &&
@@ -143,6 +151,7 @@ export default {
       api: 'deleteCluster',
       icon: 'delete',
       label: 'label.action.delete.cluster',
+      message: 'message.action.delete.cluster',
       dataView: true
     }
   ]
diff --git a/src/config/section/infra/hosts.js b/src/config/section/infra/hosts.js
index ed10e66..e06a7d7 100644
--- a/src/config/section/infra/hosts.js
+++ b/src/config/section/infra/hosts.js
@@ -61,6 +61,7 @@ export default {
       api: 'provisionCertificate',
       icon: 'safety-certificate',
       label: 'label.action.secure.host',
+      message: 'message.action.secure.host',
       dataView: true,
       show: (record) => { return record.hypervisor === 'KVM' },
       args: ['hostid'],
@@ -74,6 +75,7 @@ export default {
       api: 'reconnectHost',
       icon: 'forward',
       label: 'label.action.force.reconnect',
+      message: 'message.confirm.action.force.reconnect',
       dataView: true,
       show: (record) => { return ['Disconnected', 'Up'].includes(record.state) }
     },
@@ -81,6 +83,7 @@ export default {
       api: 'updateHost',
       icon: 'pause-circle',
       label: 'label.disable.host',
+      message: 'message.confirm.disable.host',
       dataView: true,
       defaultArgs: { allocationstate: 'Disable' },
       show: (record) => { return record.resourcestate === 'Enabled' }
@@ -89,6 +92,7 @@ export default {
       api: 'updateHost',
       icon: 'play-circle',
       label: 'label.enable.host',
+      message: 'message.confirm.enable.host',
       dataView: true,
       defaultArgs: { allocationstate: 'Enable' },
       show: (record) => { return record.resourcestate === 'Disabled' }
@@ -97,6 +101,7 @@ export default {
       api: 'prepareHostForMaintenance',
       icon: 'plus-square',
       label: 'label.action.enable.maintenance.mode',
+      message: 'message.action.host.enable.maintenance.mode',
       dataView: true,
       show: (record) => { return record.resourcestate === 'Enabled' }
     },
@@ -104,6 +109,7 @@ export default {
       api: 'cancelHostMaintenance',
       icon: 'minus-square',
       label: 'label.action.cancel.maintenance.mode',
+      message: 'message.action.cancel.maintenance.mode',
       dataView: true,
       show: (record) => { return record.resourcestate === 'Maintenance' || record.resourcestate === 'ErrorInMaintenance' || record.resourcestate === 'PrepareForMaintenance' }
     },
@@ -111,6 +117,7 @@ export default {
       api: 'configureOutOfBandManagement',
       icon: 'setting',
       label: 'label.outofbandmanagement.configure',
+      message: 'label.outofbandmanagement.configure',
       dataView: true,
       args: ['hostid', 'address', 'port', 'username', 'password', 'driver'],
       mapping: {
@@ -126,6 +133,7 @@ export default {
       api: 'enableOutOfBandManagementForHost',
       icon: 'plus-circle',
       label: 'label.outofbandmanagement.enable',
+      message: 'label.outofbandmanagement.enable',
       dataView: true,
       show: (record) => {
         return !record.outofbandmanagement || !record.outofbandmanagement.enabled ||
@@ -142,6 +150,7 @@ export default {
       api: 'disableOutOfBandManagementForHost',
       icon: 'minus-circle',
       label: 'label.outofbandmanagement.disable',
+      message: 'label.outofbandmanagement.disable',
       dataView: true,
       show: (record) => {
         return record.outofbandmanagement && record.outofbandmanagement.enabled &&
@@ -158,6 +167,7 @@ export default {
       api: 'issueOutOfBandManagementPowerAction',
       icon: 'login',
       label: 'label.outofbandmanagement.action.issue',
+      message: 'label.outofbandmanagement.action.issue',
       dataView: true,
       show: (record) => {
         return record.outofbandmanagement && record.outofbandmanagement.enabled &&
@@ -174,6 +184,7 @@ export default {
       api: 'changeOutOfBandManagementPassword',
       icon: 'key',
       label: 'label.outofbandmanagement.changepassword',
+      message: 'label.outofbandmanagement.changepassword',
       dataView: true,
       show: (record) => {
         return record.outofbandmanagement && record.outofbandmanagement.enabled &&
@@ -190,6 +201,7 @@ export default {
       api: 'configureHAForHost',
       icon: 'tool',
       label: 'label.ha.configure',
+      message: 'label.ha.configure',
       dataView: true,
       args: ['hostid', 'provider'],
       mapping: {
@@ -205,6 +217,7 @@ export default {
       api: 'enableHAForHost',
       icon: 'eye',
       label: 'label.ha.enable',
+      message: 'label.ha.enable',
       dataView: true,
       show: (record) => {
         return !record.hostha || !record.hostha.haenable || record.hostha.haenable === false
@@ -220,6 +233,7 @@ export default {
       api: 'disableHAForHost',
       icon: 'eye-invisible',
       label: 'label.ha.disable',
+      message: 'label.ha.disable',
       dataView: true,
       show: (record) => {
         return record.hostha && record.hostha.haenable &&
diff --git a/src/config/section/infra/ilbvms.js b/src/config/section/infra/ilbvms.js
index e000d69..01a6ce7 100644
--- a/src/config/section/infra/ilbvms.js
+++ b/src/config/section/infra/ilbvms.js
@@ -28,6 +28,7 @@ export default {
       api: 'startInternalLoadBalancerVM',
       icon: 'caret-right',
       label: 'label.action.start.router',
+      message: 'message.confirm.start.lb.vm',
       dataView: true,
       show: (record) => { return record.state === 'Stopped' }
     },
diff --git a/src/config/section/infra/nsp.js b/src/config/section/infra/nsp.js
index 3884d11..4b21713 100644
--- a/src/config/section/infra/nsp.js
+++ b/src/config/section/infra/nsp.js
@@ -32,6 +32,7 @@ export default {
       api: 'updateNetworkServiceProvider',
       icon: 'stop',
       label: 'label.disable.provider',
+      message: 'message.confirm.disable.provider',
       dataView: true,
       args: ['state'],
       show: (record) => { return record.state === 'Enabled' },
@@ -45,6 +46,7 @@ export default {
       api: 'updateNetworkServiceProvider',
       icon: 'right-circle',
       label: 'label.enable.provider',
+      message: 'message.confirm.enable.provider',
       dataView: true,
       args: ['state'],
       show: (record) => { return record.state === 'Disabled' },
diff --git a/src/config/section/infra/phynetworks.js b/src/config/section/infra/phynetworks.js
index b772fe8..0045cee 100644
--- a/src/config/section/infra/phynetworks.js
+++ b/src/config/section/infra/phynetworks.js
@@ -17,7 +17,7 @@
 
 export default {
   name: 'physicalnetwork',
-  title: 'label.physical.networks',
+  title: 'label.physical.network',
   icon: 'api',
   hidden: true,
   permission: ['listPhysicalNetworks'],
@@ -122,6 +122,7 @@ export default {
       api: 'deletePhysicalNetwork',
       icon: 'delete',
       label: 'label.action.delete.physical.network',
+      message: 'message.action.delete.physical.network',
       dataView: true
     }
   ]
diff --git a/src/config/section/infra/pods.js b/src/config/section/infra/pods.js
index e8c8ebc..09d69c7 100644
--- a/src/config/section/infra/pods.js
+++ b/src/config/section/infra/pods.js
@@ -51,6 +51,7 @@ export default {
       api: 'updatePod',
       icon: 'play-circle',
       label: 'label.action.enable.pod',
+      message: 'message.action.enable.pod',
       dataView: true,
       show: (record) => { return record.allocationstate === 'Disabled' },
       args: ['allocationstate'],
@@ -64,6 +65,7 @@ export default {
       api: 'updatePod',
       icon: 'pause-circle',
       label: 'label.action.disable.pod',
+      message: 'message.action.disable.pod',
       dataView: true,
       show: (record) => { return record.allocationstate === 'Enabled' },
       args: ['allocationstate'],
@@ -77,6 +79,7 @@ export default {
       api: 'deletePod',
       icon: 'delete',
       label: 'label.action.delete.pod',
+      message: 'message.action.delete.pod',
       dataView: true
     }
   ]
diff --git a/src/config/section/infra/primaryStorages.js b/src/config/section/infra/primaryStorages.js
index a4e209a..28ae6c4 100644
--- a/src/config/section/infra/primaryStorages.js
+++ b/src/config/section/infra/primaryStorages.js
@@ -54,6 +54,7 @@ export default {
       api: 'enableStorageMaintenance',
       icon: 'plus-square',
       label: 'label.action.enable.maintenance.mode',
+      message: 'message.action.primarystorage.enable.maintenance.mode',
       dataView: true,
       show: (record) => { return ['Up', 'Connecting', 'Down', 'ErrorInMaintenance'].includes(record.state) }
     },
@@ -61,6 +62,7 @@ export default {
       api: 'cancelStorageMaintenance',
       icon: 'minus-square',
       label: 'label.action.cancel.maintenance.mode',
+      message: 'message.action.cancel.maintenance.mode',
       dataView: true,
       show: (record) => { return ['Maintenance', 'PrepareForMaintenance', 'ErrorInMaintenance'].includes(record.state) }
     },
diff --git a/src/config/section/infra/routers.js b/src/config/section/infra/routers.js
index 0ba9d32..fcb8254 100644
--- a/src/config/section/infra/routers.js
+++ b/src/config/section/infra/routers.js
@@ -28,6 +28,7 @@ export default {
       api: 'startRouter',
       icon: 'caret-right',
       label: 'label.action.start.router',
+      message: 'message.action.start.router',
       dataView: true,
       show: (record) => { return record.state === 'Stopped' }
     },
@@ -44,6 +45,7 @@ export default {
       api: 'rebootRouter',
       icon: 'sync',
       label: 'label.action.reboot.router',
+      message: 'message.action.reboot.router',
       dataView: true,
       hidden: (record) => { return record.state === 'Running' }
     },
@@ -51,6 +53,7 @@ export default {
       api: 'scaleSystemVm',
       icon: 'arrows-alt',
       label: 'label.change.service.offering',
+      message: 'message.confirm.scale.up.router.vm',
       dataView: true,
       args: ['serviceofferingid'],
       show: (record) => { return record.hypervisor !== 'KVM' }
@@ -59,6 +62,7 @@ export default {
       api: 'upgradeRouterTemplate',
       icon: 'fullscreen',
       label: 'label.upgrade.router.newer.template',
+      message: 'message.confirm.upgrade.router.newer.template',
       dataView: true,
       groupAction: true,
       show: (record) => { return record.requiresupgrade }
@@ -111,6 +115,7 @@ export default {
       api: 'destroyRouter',
       icon: 'delete',
       label: 'label.destroy.router',
+      message: 'message.confirm.destroy.router',
       dataView: true,
       show: (record) => { return ['Running', 'Error', 'Stopped'].includes(record.state) }
     }
diff --git a/src/config/section/infra/secondaryStorages.js b/src/config/section/infra/secondaryStorages.js
index 0359a52..ca65bfa 100644
--- a/src/config/section/infra/secondaryStorages.js
+++ b/src/config/section/infra/secondaryStorages.js
@@ -42,6 +42,7 @@ export default {
       api: 'deleteImageStore',
       icon: 'delete',
       label: 'label.action.delete.secondary.storage',
+      message: 'message.action.delete.secondary.storage',
       dataView: true
     }
   ]
diff --git a/src/config/section/infra/systemVms.js b/src/config/section/infra/systemVms.js
index 60429aa..1d0b5cd 100644
--- a/src/config/section/infra/systemVms.js
+++ b/src/config/section/infra/systemVms.js
@@ -27,6 +27,7 @@ export default {
       api: 'startSystemVm',
       icon: 'caret-right',
       label: 'label.action.start.systemvm',
+      message: 'message.action.start.systemvm',
       dataView: true,
       show: (record) => { return record.state === 'Stopped' }
     },
@@ -43,6 +44,7 @@ export default {
       api: 'rebootSystemVm',
       icon: 'sync',
       label: 'label.action.reboot.systemvm',
+      message: 'message.action.reboot.systemvm',
       dataView: true,
       show: (record) => { return record.state === 'Running' }
     },
@@ -50,6 +52,7 @@ export default {
       api: 'scaleSystemVm',
       icon: 'arrows-alt',
       label: 'label.change.service.offering',
+      message: 'message.confirm.scale.up.system.vm',
       dataView: true,
       show: (record) => { return record.hypervisor !== 'KVM' },
       args: ['serviceofferingid']
@@ -102,6 +105,7 @@ export default {
       api: 'destroySystemVm',
       icon: 'delete',
       label: 'label.action.destroy.systemvm',
+      message: 'message.action.destroy.systemvm',
       dataView: true,
       show: (record) => { return ['Running', 'Error', 'Stopped'].includes(record.state) }
     }
diff --git a/src/config/section/infra/zones.js b/src/config/section/infra/zones.js
index 0e92514..3b76934 100644
--- a/src/config/section/infra/zones.js
+++ b/src/config/section/infra/zones.js
@@ -88,6 +88,7 @@ export default {
       api: 'updateZone',
       icon: 'pause-circle',
       label: 'label.action.disable.zone',
+      message: 'message.action.disable.zone',
       dataView: true,
       defaultArgs: { allocationstate: 'Disabled' },
       show: (record) => { return record.allocationstate === 'Enabled' }
@@ -96,6 +97,7 @@ export default {
       api: 'updateZone',
       icon: 'play-circle',
       label: 'label.action.enable.zone',
+      message: 'message.action.enable.zone',
       dataView: true,
       defaultArgs: { allocationstate: 'Enabled' },
       show: (record) => { return record.allocationstate === 'Disabled' }
@@ -104,6 +106,7 @@ export default {
       api: 'enableOutOfBandManagementForZone',
       icon: 'plus-circle',
       label: 'label.outofbandmanagement.enable',
+      message: 'label.outofbandmanagement.enable',
       dataView: true,
       show: (record) => {
         return !record.resourcedetails || !record.resourcedetails.outOfBandManagementEnabled ||
@@ -120,6 +123,7 @@ export default {
       api: 'disableOutOfBandManagementForZone',
       icon: 'minus-circle',
       label: 'label.outofbandmanagement.disable',
+      message: 'label.outofbandmanagement.disable',
       dataView: true,
       show: (record) => {
         return record.resourcedetails && record.resourcedetails.outOfBandManagementEnabled &&
@@ -136,6 +140,7 @@ export default {
       api: 'enableHAForZone',
       icon: 'eye',
       label: 'label.ha.enable',
+      message: 'label.ha.enable',
       dataView: true,
       show: (record) => {
         return !record.resourcedetails || !record.resourcedetails.resourceHAEnabled ||
@@ -152,6 +157,7 @@ export default {
       api: 'disableHAForZone',
       icon: 'eye-invisible',
       label: 'label.ha.disable',
+      message: 'label.ha.disable',
       dataView: true,
       show: (record) => {
         return record.resourcedetails && record.resourcedetails.resourceHAEnabled &&
@@ -181,6 +187,7 @@ export default {
       api: 'updateVmwareDc',
       icon: 'block',
       label: 'label.update.vmware.datacenter',
+      message: 'label.update.vmware.datacenter',
       dataView: true,
       show: record => record.vmwaredc,
       args: ['zoneid', 'name', 'vcenter', 'username', 'password'],
@@ -194,6 +201,7 @@ export default {
       api: 'removeVmwareDc',
       icon: 'minus-square',
       label: 'label.remove.vmware.datacenter',
+      message: 'message.confirm.remove.vmware.datacenter',
       dataView: true,
       show: record => record.vmwaredc,
       args: ['zoneid'],
@@ -207,6 +215,7 @@ export default {
       api: 'deleteZone',
       icon: 'delete',
       label: 'label.action.delete.zone',
+      message: 'message.action.delete.zone',
       dataView: true
     }
   ]
diff --git a/src/config/section/network.js b/src/config/section/network.js
index fe02c68..1ca76cd 100644
--- a/src/config/section/network.js
+++ b/src/config/section/network.js
@@ -78,6 +78,7 @@ export default {
           api: 'replaceNetworkACLList',
           icon: 'swap',
           label: 'label.replace.acl.list',
+          message: 'message.confirm.replace.acl.new.one',
           dataView: true,
           show: (record) => { return record.vpcid },
           args: ['aclid', 'networkid'],
@@ -95,6 +96,7 @@ export default {
           api: 'deleteNetwork',
           icon: 'delete',
           label: 'label.action.delete.network',
+          message: 'message.action.delete.network',
           dataView: true
         }
       ]
@@ -143,6 +145,7 @@ export default {
           api: 'restartVPC',
           icon: 'sync',
           label: 'label.restart.vpc',
+          message: 'message.restart.vpc',
           dataView: true,
           args: ['makeredundant', 'cleanup']
         },
@@ -150,6 +153,7 @@ export default {
           api: 'deleteVPC',
           icon: 'delete',
           label: 'label.remove.vpc',
+          message: 'message.remove.vpc',
           dataView: true
         }
       ]
@@ -184,6 +188,7 @@ export default {
           api: 'deleteSecurityGroup',
           icon: 'delete',
           label: 'label.action.delete.security.group',
+          message: 'message.action.delete.security.group',
           dataView: true,
           show: (record) => { return record.name !== 'default' }
         }
@@ -238,6 +243,7 @@ export default {
           api: 'disableStaticNat',
           icon: 'minus-circle',
           label: 'label.action.disable.static.nat',
+          message: 'message.action.disable.static.nat',
           dataView: true,
           show: (record) => { return record.virtualmachineid },
           args: ['ipaddressid'],
@@ -251,6 +257,7 @@ export default {
           api: 'disassociateIpAddress',
           icon: 'delete',
           label: 'label.action.release.ip',
+          message: 'message.action.release.ip',
           dataView: true,
           show: (record) => { return !record.issourcenat }
         }
@@ -289,6 +296,7 @@ export default {
           api: 'replaceNetworkACLList',
           icon: 'swap',
           label: 'label.replace.acl.list',
+          message: 'message.confirm.replace.acl.new.one',
           dataView: true,
           args: ['aclid', 'gatewayid'],
           mapping: {
@@ -305,13 +313,14 @@ export default {
           api: 'deletePrivateGateway',
           icon: 'delete',
           label: 'label.delete.gateway',
+          message: 'message.delete.gateway',
           dataView: true
         }
       ]
     },
     {
       name: 's2svpn',
-      title: 'label.site-to-site.vpns',
+      title: 'label.site.to.site.vpn',
       icon: 'lock',
       hidden: true,
       permission: ['listVpnGateways'],
@@ -329,13 +338,14 @@ export default {
           api: 'deleteVpnGateway',
           icon: 'delete',
           label: 'label.delete.vpn.gateway',
+          message: 'message.delete.vpn.gateway',
           dataView: true
         }
       ]
     },
     {
       name: 's2svpnconn',
-      title: 'label.site-to-site.vpn.connections',
+      title: 'label.site.to.site.vpn.connections',
       icon: 'sync',
       hidden: true,
       permission: ['listVpnConnections'],
@@ -361,12 +371,14 @@ export default {
           api: 'resetVpnConnection',
           icon: 'reload',
           label: 'label.reset.vpn.connection',
+          message: 'message.reset.vpn.connection',
           dataView: true
         },
         {
           api: 'deleteVpnConnection',
           icon: 'delete',
           label: 'label.delete.vpn.connection',
+          message: 'message.delete.vpn.connection',
           dataView: true
         }
       ]
@@ -406,6 +418,7 @@ export default {
           api: 'deleteNetworkACLList',
           icon: 'delete',
           label: 'label.delete.acl.list',
+          message: 'message.confirm.delete.acl.list',
           dataView: true
         }
       ]
@@ -462,6 +475,7 @@ export default {
           api: 'deleteLoadBalancer',
           icon: 'delete',
           label: 'label.delete.internal.lb',
+          message: 'message.confirm.delete.internal.lb',
           dataView: true
         }
       ]
@@ -485,6 +499,7 @@ export default {
           api: 'removeVpnUser',
           icon: 'delete',
           label: 'label.delete.vpn.user',
+          message: 'message.action.delete.vpn.user',
           dataView: true,
           args: ['username', 'domainid', 'account'],
           mapping: {
@@ -528,6 +543,7 @@ export default {
           api: 'deleteVpnCustomerGateway',
           icon: 'delete',
           label: 'label.delete.vpn.customer.gateway',
+          message: 'message.delete.vpn.customer.gateway',
           dataView: true
         }
       ]
diff --git a/src/config/section/offering.js b/src/config/section/offering.js
index 878a3ca..bd1e702 100644
--- a/src/config/section/offering.js
+++ b/src/config/section/offering.js
@@ -58,6 +58,7 @@ export default {
         api: 'deleteServiceOffering',
         icon: 'delete',
         label: 'label.action.delete.service.offering',
+        message: 'message.action.delete.service.offering',
         dataView: true
       }]
     },
@@ -88,6 +89,7 @@ export default {
         api: 'deleteServiceOffering',
         icon: 'delete',
         label: 'label.action.delete.system.service.offering',
+        message: 'message.action.delete.system.service.offering',
         dataView: true,
         params: { issystem: 'true' }
       }]
@@ -129,6 +131,7 @@ export default {
         api: 'deleteDiskOffering',
         icon: 'delete',
         label: 'label.action.delete.disk.offering',
+        message: 'message.action.delete.disk.offering',
         dataView: true
       }]
     },
@@ -150,6 +153,7 @@ export default {
         api: 'deleteBackupOffering',
         icon: 'delete',
         label: 'label.action.delete.backup.offering',
+        message: 'message.action.delete.backup.offering',
         dataView: true
       }]
     },
@@ -183,6 +187,7 @@ export default {
         api: 'updateNetworkOffering',
         icon: 'play-circle',
         label: 'label.enable.network.offering',
+        message: 'message.confirm.enable.network.offering',
         dataView: true,
         show: (record) => { return record.state === 'Disabled' },
         args: ['state'],
@@ -195,6 +200,7 @@ export default {
         api: 'updateNetworkOffering',
         icon: 'pause-circle',
         label: 'label.disable.network.offering',
+        message: 'message.confirm.disable.network.offering',
         dataView: true,
         show: (record) => { return record.state === 'Enabled' },
         args: ['state'],
@@ -214,6 +220,7 @@ export default {
         api: 'deleteNetworkOffering',
         icon: 'delete',
         label: 'label.remove.network.offering',
+        message: 'message.confirm.remove.network.offering',
         dataView: true
       }]
     },
@@ -248,6 +255,7 @@ export default {
         api: 'updateVPCOffering',
         icon: 'play-circle',
         label: 'label.enable.vpc.offering',
+        message: 'message.confirm.enable.vpc.offering',
         dataView: true,
         show: (record) => { return record.state === 'Disabled' },
         args: ['state'],
@@ -260,6 +268,7 @@ export default {
         api: 'updateVPCOffering',
         icon: 'pause-circle',
         label: 'label.disable.vpc.offering',
+        message: 'message.confirm.disable.vpc.offering',
         dataView: true,
         show: (record) => { return record.state === 'Enabled' },
         args: ['state'],
@@ -279,6 +288,7 @@ export default {
         api: 'deleteVPCOffering',
         icon: 'delete',
         label: 'label.remove.vpc.offering',
+        message: 'message.confirm.remove.vpc.offering',
         dataView: true
       }]
     }
diff --git a/src/config/section/project.js b/src/config/section/project.js
index eb67db3..7d47a35 100644
--- a/src/config/section/project.js
+++ b/src/config/section/project.js
@@ -79,6 +79,7 @@ export default {
       api: 'activateProject',
       icon: 'play-circle',
       label: 'label.activate.project',
+      message: 'message.activate.project',
       dataView: true,
       show: (record) => { return record.state === 'Suspended' }
     },
@@ -86,6 +87,7 @@ export default {
       api: 'suspendProject',
       icon: 'pause-circle',
       label: 'label.suspend.project',
+      message: 'message.suspend.project',
       dataView: true,
       show: (record) => { return record.state !== 'Suspended' }
     },
@@ -106,6 +108,7 @@ export default {
       api: 'deleteProject',
       icon: 'delete',
       label: 'label.delete.project',
+      message: 'message.delete.project',
       dataView: true
     }
   ]
diff --git a/src/config/section/role.js b/src/config/section/role.js
index f68253b..9959412 100644
--- a/src/config/section/role.js
+++ b/src/config/section/role.js
@@ -58,6 +58,7 @@ export default {
       api: 'deleteRole',
       icon: 'delete',
       label: 'label.delete.role',
+      message: 'label.delete.role',
       dataView: true
     }
   ]
diff --git a/src/config/section/storage.js b/src/config/section/storage.js
index a79af77..27eb8e9 100644
--- a/src/config/section/storage.js
+++ b/src/config/section/storage.js
@@ -66,6 +66,7 @@ export default {
           api: 'attachVolume',
           icon: 'paper-clip',
           label: 'label.action.attach.disk',
+          message: 'message.confirm.attach.disk',
           args: ['virtualmachineid'],
           dataView: true,
           show: (record) => { return record.type !== 'ROOT' && record.state !== 'Destroy' && !('virtualmachineid' in record) }
@@ -74,6 +75,7 @@ export default {
           api: 'detachVolume',
           icon: 'link',
           label: 'label.action.detach.disk',
+          message: 'message.detach.disk',
           dataView: true,
           show: (record) => { return record.type !== 'ROOT' && 'virtualmachineid' in record && record.virtualmachineid }
         },
@@ -134,6 +136,7 @@ export default {
           api: 'extractVolume',
           icon: 'cloud-download',
           label: 'label.action.download.volume',
+          message: 'message.download.volume.confirm',
           dataView: true,
           show: (record) => { return record && record.state === 'Ready' && (record.vmstate === 'Stopped' || record.virtualmachineid == null) && record.state !== 'Destroy' },
           args: ['zoneid', 'mode'],
@@ -164,6 +167,7 @@ export default {
           api: 'recoverVolume',
           icon: 'medicine-box',
           label: 'label.action.recover.volume',
+          message: 'message.action.recover.volume',
           dataView: true,
           show: (record, store) => {
             return (['Admin', 'DomainAdmin'].includes(store.userInfo.roletype) || store.features.allowuserexpungerecovervolume) && record.state === 'Destroy'
@@ -173,6 +177,7 @@ export default {
           api: 'deleteVolume',
           icon: 'delete',
           label: 'label.action.delete.volume',
+          message: 'message.action.delete.volume',
           dataView: true,
           groupAction: true,
           show: (record, store) => {
@@ -184,6 +189,7 @@ export default {
           api: 'destroyVolume',
           icon: 'delete',
           label: 'label.action.destroy.volume',
+          message: 'message.action.destroy.volume',
           dataView: true,
           args: (record, store) => {
             return (!['Admin', 'DomainAdmin'].includes(store.userInfo.roletype) && !store.features.allowuserexpungerecovervolumestore) ? [] : ['expunge']
@@ -233,6 +239,7 @@ export default {
           api: 'revertSnapshot',
           icon: 'sync',
           label: 'label.action.revert.snapshot',
+          message: 'message.action.revert.snapshot',
           dataView: true,
           show: (record) => { return record.revertable }
         },
@@ -240,6 +247,7 @@ export default {
           api: 'deleteSnapshot',
           icon: 'delete',
           label: 'label.action.delete.snapshot',
+          message: 'message.action.delete.snapshot',
           dataView: true
         }
       ]
@@ -257,6 +265,7 @@ export default {
           api: 'revertToVMSnapshot',
           icon: 'sync',
           label: 'label.action.vmsnapshot.revert',
+          message: 'label.action.vmsnapshot.revert',
           dataView: true,
           show: (record) => { return record.state === 'Ready' },
           args: ['vmsnapshotid'],
@@ -270,6 +279,7 @@ export default {
           api: 'deleteVMSnapshot',
           icon: 'delete',
           label: 'label.action.vmsnapshot.delete',
+          message: 'message.action.vmsnapshot.delete',
           dataView: true,
           args: ['vmsnapshotid'],
           mapping: {
@@ -292,12 +302,14 @@ export default {
           api: 'restoreBackup',
           icon: 'sync',
           label: 'label.backup.restore',
+          message: 'message.backup.restore',
           dataView: true
         },
         {
           api: 'restoreVolumeFromBackupAndAttachToVM',
           icon: 'paper-clip',
-          label: 'Restore Volume and Attach',
+          label: 'label.backup.attach.restore',
+          message: 'message.backup.attach.restore',
           dataView: true,
           popup: true,
           component: () => import('@/views/storage/RestoreAttachBackupVolume.vue')
@@ -306,6 +318,7 @@ export default {
           api: 'removeVirtualMachineFromBackupOffering',
           icon: 'scissor',
           label: 'label.backup.offering.remove',
+          message: 'message.backup.offering.remove',
           dataView: true,
           args: ['forced', 'virtualmachineid'],
           mapping: {
@@ -320,7 +333,8 @@ export default {
         {
           api: 'deleteBackup',
           icon: 'delete',
-          label: 'Delete Backup',
+          label: 'label.delete.backup',
+          message: 'message.delete.backup',
           dataView: true
         }
       ]
diff --git a/src/config/section/user.js b/src/config/section/user.js
index e58d65e..5f667b0 100644
--- a/src/config/section/user.js
+++ b/src/config/section/user.js
@@ -50,12 +50,14 @@ export default {
       api: 'registerUserKeys',
       icon: 'file-protect',
       label: 'label.action.generate.keys',
+      message: 'message.generate.keys',
       dataView: true
     },
     {
       api: 'enableUser',
       icon: 'play-circle',
       label: 'label.action.enable.user',
+      message: 'message.enable.user',
       dataView: true,
       show: (record) => { return record.state === 'disabled' }
     },
@@ -63,6 +65,7 @@ export default {
       api: 'disableUser',
       icon: 'pause-circle',
       label: 'label.action.disable.user',
+      message: 'message.disable.user',
       dataView: true,
       show: (record) => { return record.state === 'enabled' }
     },
@@ -70,6 +73,7 @@ export default {
       api: 'deleteUser',
       icon: 'delete',
       label: 'label.action.delete.user',
+      message: 'message.delete.user',
       dataView: true
     }
   ]
diff --git a/src/locales/ar.json b/src/locales/ar.json
index d51d04a..15a1588 100644
--- a/src/locales/ar.json
+++ b/src/locales/ar.json
@@ -861,7 +861,7 @@
 "label.instanceport": "Instance Port",
 "label.instances": "\u0627\u0644\u062d\u0627\u0644\u0627\u062a",
 "label.instanciate.template.associate.profile.blade": "Instanciate Template and Associate Profile to Blade",
-"label.intermediate.certificate": "Intermediate certificate {0}",
+"label.intermediate.certificate": "Intermediate certificate",
 "label.internal.dns.1": "Internal DNS 1",
 "label.internal.dns.2": "Internal DNS 2",
 "label.internal.lb": "Internal LB",
diff --git a/src/locales/ca.json b/src/locales/ca.json
index 244a9cb..302a698 100644
--- a/src/locales/ca.json
+++ b/src/locales/ca.json
@@ -861,7 +861,7 @@
 "label.instanceport": "Instance Port",
 "label.instances": "Instances",
 "label.instanciate.template.associate.profile.blade": "Instanciate Template and Associate Profile to Blade",
-"label.intermediate.certificate": "Intermediate certificate {0}",
+"label.intermediate.certificate": "Intermediate certificate",
 "label.internal.dns.1": "Internal DNS 1",
 "label.internal.dns.2": "Internal DNS 2",
 "label.internal.lb": "Internal LB",
diff --git a/src/locales/de_DE.json b/src/locales/de_DE.json
index 3498733..89f25d9 100644
--- a/src/locales/de_DE.json
+++ b/src/locales/de_DE.json
@@ -862,7 +862,7 @@
 "label.instanceport": "Instanz-Port",
 "label.instances": "Instanzen",
 "label.instanciate.template.associate.profile.blade": "Vorlage instanzieren und Profil zu Blade assoziieren",
-"label.intermediate.certificate": "Intermediate Zertifikat {0}",
+"label.intermediate.certificate": "Intermediate Zertifikat",
 "label.internal.dns.1": "Interner DNS 1",
 "label.internal.dns.2": "Interner DNS 2",
 "label.internal.lb": "Interne LB",
diff --git a/src/locales/en.json b/src/locales/en.json
index 4b10163..c93f111 100644
--- a/src/locales/en.json
+++ b/src/locales/en.json
@@ -430,11 +430,13 @@
 "label.available.public.ips": "Available Public IP Addresses",
 "label.back": "Back",
 "label.backup": "Backups",
+"label.backup.attach.restore": "Restore and Attach Backup Volume",
 "label.backup.offering.assign": "Assign VM to backup offering",
 "label.backup.offering.remove": "Remove VM from backup offering",
 "label.backup.offerings": "Backup Offerings",
 "label.backup.restore": "Restore VM Backup",
 "label.backupofferingid": "Backup Offering",
+"label.backupofferingname": "Backup Offering",
 "label.balance": "Balance",
 "label.bandwidth": "Bandwidth",
 "label.baremetal.dhcp.devices": "Baremetal DHCP Devices",
@@ -484,6 +486,7 @@
 "label.capacity.iops": "Capacity IOPS",
 "label.capacitybytes": "Capacity Bytes",
 "label.capacityiops": "IOPS Total",
+"label.category": "Category",
 "label.certchain": "Chain",
 "label.certificate": "Certificate",
 "label.certificate.details": "Certificate Details",
@@ -606,6 +609,7 @@
 "label.delete.acl.list": "Delete ACL List",
 "label.delete.affinity.group": "Delete Affinity Group",
 "label.delete.alerts": "Delete alerts",
+"label.delete.backup" : "Delete Backup",
 "label.delete.baremetal.rack.configuration": "Delete Baremetal Rack Configuration",
 "label.delete.bigswitchbcf": "Remove BigSwitch BCF Controller",
 "label.delete.brocadevcs": "Remove Brocade Vcs Switch",
@@ -696,6 +700,7 @@
 "label.disksizetotal": "Disk Total",
 "label.disksizetotalgb": "Total",
 "label.disksizeunallocatedgb": "Unallocated",
+"label.disksizeused": "Disk Size Used",
 "label.disksizeusedgb": "Used",
 "label.display.text": "Display Text",
 "label.displayname": "Display Name",
@@ -955,7 +960,7 @@
 "label.instanceport": "Instance Port",
 "label.instances": "Instances",
 "label.instanciate.template.associate.profile.blade": "Instanciate Template and Associate Profile to Blade",
-"label.intermediate.certificate": "Intermediate certificate {0}",
+"label.intermediate.certificate": "Intermediate certificate",
 "label.internal.dns.1": "Internal DNS 1",
 "label.internal.dns.2": "Internal DNS 2",
 "label.internal.lb": "Internal LB",
@@ -1151,8 +1156,10 @@
 "label.max.secondary.storage": "Max. secondary (GiB)",
 "label.maxcpu": "Max. CPU Cores",
 "label.maxcpunumber": "Max CPU Cores",
+"label.maxdatavolumeslimit": "Max data volumes limit",
 "label.maxerrorretry": "Max Error Retry",
 "label.maxguestslimit": "Max guest limit",
+"label.maxhostspercluster": "Max hosts per cluster",
 "label.maximum": "Maximum",
 "label.maxinstance": "Max Instances",
 "label.maxiops": "Max IOPS",
@@ -1264,6 +1271,7 @@
 "label.netscaler.details": "NetScaler details",
 "label.network": "Network",
 "label.network.acl": "Network ACL",
+"label.network.acl.lists": "Network ACL Lists",
 "label.network.acls": "Network ACLs",
 "label.network.addvm": "Add network to VM",
 "label.network.desc": "Network Desc",
@@ -1410,6 +1418,7 @@
 "label.ping.dir": "PING Directory",
 "label.ping.path": "Ping Path",
 "label.ping.storage.ip": "PING storage IP",
+"label.pkcs.private.certificate": "PKCS#8 Private certificate",
 "label.plannermode": "Planner mode",
 "label.please.complete.the.following.fields": "Please complete the following fields",
 "label.please.specify.netscaler.info": "Please specify Netscaler info",
@@ -1463,6 +1472,7 @@
 "label.project.invite": "Invite to project",
 "label.project.name": "Project name",
 "label.project.view": "Project View",
+"label.projectaccountname": "Project Account Name",
 "label.projectid": "Project ID",
 "label.projects": "Projects",
 "label.promiscuousmode": "Promiscuous Mode",
@@ -1682,7 +1692,9 @@
 "label.security.groups": "Security Groups",
 "label.security.groups.enabled": "Security Groups Enabled",
 "label.securitygroup": "Security Group",
+"label.securitygroupenabled": "Security Groups Enabled",
 "label.securitygroups": "Security Groups",
+"label.securitygroupsenabled": "Security Groups Enabled",
 "label.select": "Select",
 "label.select-view": "Select view",
 "label.select.a.zone": "Select a zone",
@@ -1696,12 +1708,14 @@
 "label.select.region": "Select region",
 "label.select.tier": "Select Tier",
 "label.select.vm.for.static.nat": "Select VM for static NAT",
+"label.select.zones": "Select zones",
 "label.self": "Mine",
 "label.selfexecutable": "Self",
 "label.semanticversion": "Semantic version",
 "label.sent": "Date",
 "label.sentbytes": "Bytes Sent",
 "label.server": "Server",
+"label.server.certificate": "Server certificate",
 "label.service.connectivity.distributedroutercapabilitycheckbox": "Distributed Router",
 "label.service.connectivity.regionlevelvpccapabilitycheckbox": "Region Level VPC",
 "label.service.lb.elasticlbcheckbox": "Elastic LB",
@@ -1737,6 +1751,7 @@
 "label.shutdown.provider": "Shutdown provider",
 "label.simplified.chinese.keyboard": "Simplified Chinese keyboard",
 "label.site.to.site.vpn": "Site-to-site VPN",
+"label.site.to.site.vpn.connections": "Site-to-site VPN Connections",
 "label.size": "Size",
 "label.sizegb": "Size",
 "label.skip.guide": "I have used CloudStack before, skip this guide",
@@ -1759,6 +1774,7 @@
 "label.sourcecidr": "Source CIDR",
 "label.sourceipaddress": "Source IP Address",
 "label.sourcenat": "Source NAT",
+"label.sourcenatsupported": "Source NAT Supported",
 "label.sourcenattype": "Supported Source NAT type",
 "label.sourceport": "Source Port",
 "label.specify.vxlan": "Specify VXLAN",
@@ -1810,6 +1826,7 @@
 "label.sticky.holdtime": "Hold time",
 "label.sticky.indirect": "Indirect",
 "label.sticky.length": "Length",
+"label.sticky.mode": "Mode",
 "label.sticky.name": "Sticky Name",
 "label.sticky.nocache": "No cache",
 "label.sticky.postonly": "Post only",
@@ -1823,6 +1840,7 @@
 "label.storage.tags": "Storage Tags",
 "label.storage.traffic": "Storage Traffic",
 "label.storageid": "Primary Storage",
+"label.storagemotionenabled": "Storage Motion Enabled",
 "label.storagepolicy": "Storage policy",
 "label.storagepool": "Storage Pool",
 "label.storagetags": "Storage Tags",
@@ -1836,6 +1854,7 @@
 "label.summary": "Summary",
 "label.sunday": "Sunday",
 "label.supportedservices": "Supported Services",
+"label.supportsha": "Supports HA",
 "label.supportspublicaccess": "Supports Public Access",
 "label.supportsregionlevelvpc": "Supports Region Level VPC",
 "label.supportsstrechedl2subnet": "Supports Streched L2 Subnet",
@@ -1988,6 +2007,7 @@
 "label.virtual.routers.group.zone": "Virtual Routers group by zone",
 "label.virtualmachinedisplayname": "VM name",
 "label.virtualmachineid": "VM ID",
+"label.virtualmachinename": "VM name",
 "label.virtualsize": "Virtual Size",
 "label.vlan": "VLAN/VNI",
 "label.vlan.range": "VLAN/VNI Range",
@@ -2048,6 +2068,7 @@
 "label.vpclimit": "VPC limits",
 "label.vpcname": "VPC",
 "label.vpcoffering": "VPC Offering",
+"label.vpctotal": "Total VPCs",
 "label.vpn": "VPN",
 "label.vpn.connection": "VPN Connection",
 "label.vpn.gateway": "VPN Gateway",
@@ -2236,6 +2257,9 @@
 "message.assign.instance.another": "Please specify the account type, domain, account name and network (optional) of the new account. <br> If the default nic of the vm is on a shared network, CloudStack will check if the network can be used by the new account if you do not specify one network. <br> If the default nic of the vm is on a isolated network, and the new account has more one isolated networks, you should specify one.",
 "message.attach.iso.confirm": "Please confirm that you want to attach the ISO to this virtual instance.",
 "message.attach.volume": "Please fill in the following data to attach a new volume. If you are attaching a disk volume to a Windows based virtual machine, you will need to reboot the instance to see the attached disk.",
+"message.backup.attach.restore": "Please confirm that you want to restore and attach the volume from the backup?",
+"message.backup.offering.remove": "Are you sure you want to remove VM from backup offering and delete the backup chain?",
+"message.backup.restore": "Please confirm that you want to restore the vm backup?",
 "message.basic.mode.desc": "Choose this network model if you do <b>*<u>not</u>*</b> want to enable any VLAN support.  All virtual instances created under this network model will be assigned an IP directly from the network and security groups are used to provide security and segregation.",
 "message.change.offering.confirm": "Please confirm that you wish to change the service offering of this virtual instance.",
 "message.change.password": "Please change your password.",
@@ -2278,7 +2302,7 @@
 "message.confirm.delete.srx": "Please confirm that you would like to delete SRX",
 "message.confirm.delete.ucs.manager": "Please confirm that you want to delete UCS Manager",
 "message.confirm.destroy.kubernetes.cluster": "Please confirm that you want to destroy this Kubernetes cluster.",
-"message.confirm.destroy.router": "Please confirm that you would like to destroy this router",
+"message.confirm.destroy.router": "All services provided by this virtual router will be interrupted. Please confirm that you want to stop this router. Please confirm that you would like to destroy this router",
 "message.confirm.disable.host": "Please confirm that you want to disable the host",
 "message.confirm.disable.network.offering": "Are you sure you want to disable this network offering?",
 "message.confirm.disable.provider": "Please confirm that you would like to disable this provider",
@@ -2335,8 +2359,13 @@
 "message.creating.zone": "Creating zone",
 "message.dedicate.zone": "Dedicating zone",
 "message.dedicated.zone.released": "Zone dedication released",
+"message.dedicating.cluster": "Dedicating Cluster...",
+"message.dedicating.host": "Dedicating Host...",
+"message.dedicating.pod": "Dedicating Pod...",
+"message.dedicating.zone": "Dedicating Zone...",
 "message.delete.account": "Please confirm that you want to delete this account.",
 "message.delete.affinity.group": "Please confirm that you would like to remove this affinity group.",
+"message.delete.backup": "Are you sure you want to delete the backup?",
 "message.delete.gateway": "Please confirm you want to delete the gateway",
 "message.delete.project": "Are you sure you want to delete this project?",
 "message.delete.sslcertificate": "Please confirm that you would like to delete this certificate.",
@@ -2502,6 +2531,10 @@
 "message.register.failed": "Registration Failed",
 "message.register.succeeded": "Registration Succeeded",
 "message.reinstall.vm": "NOTE: Proceed with caution. This will cause the VM to be reinstalled from the template; data on the root disk will be lost. Extra data volumes, if any, will not be touched.",
+"message.releasing.dedicated.cluster": "Releasing dedicated cluster...",
+"message.releasing.dedicated.host": "Releasing dedicated host...",
+"message.releasing.dedicated.pod": "Releasing dedicated pod...",
+"message.releasing.dedicated.zone": "Releasing dedicated zone...",
 "message.remove.ldap": "Are you sure you want to delete the LDAP configuration?",
 "message.remove.region": "Are you sure you want to remove this region from this management server?",
 "message.remove.vpc": "Please confirm that you want to remove the VPC",
diff --git a/src/locales/es.json b/src/locales/es.json
index 8bb7301..c9a7b9b 100644
--- a/src/locales/es.json
+++ b/src/locales/es.json
@@ -861,7 +861,7 @@
 "label.instanceport": "Puerto de Instancia",
 "label.instances": "Instancias",
 "label.instanciate.template.associate.profile.blade": "Instanciar Plantilla y asociar al Perfil al Blade",
-"label.intermediate.certificate": "Certificado intermedio {0}",
+"label.intermediate.certificate": "Certificado intermedio",
 "label.internal.dns.1": "DNS interno una",
 "label.internal.dns.2": "DNS interno 2",
 "label.internal.lb": "LB interno",
diff --git a/src/locales/fr_FR.json b/src/locales/fr_FR.json
index 0b0f09a..21c03e3 100644
--- a/src/locales/fr_FR.json
+++ b/src/locales/fr_FR.json
@@ -861,7 +861,7 @@
 "label.instanceport": "Port Instance",
 "label.instances": "Instances",
 "label.instanciate.template.associate.profile.blade": "Instancier Mod\u00e8le et Profil associ\u00e9 \u00e0 la Lame",
-"label.intermediate.certificate": "Certificat interm\u00e9diaire {0}",
+"label.intermediate.certificate": "Certificat interm\u00e9diaire",
 "label.internal.dns.1": "DNS interne 1",
 "label.internal.dns.2": "DNS interne 2",
 "label.internal.lb": "R\u00e9partiteur interne",
diff --git a/src/locales/hu.json b/src/locales/hu.json
index 5c6c063..5c155ee 100644
--- a/src/locales/hu.json
+++ b/src/locales/hu.json
@@ -860,7 +860,7 @@
 "label.instanceport": "P\u00e9ld\u00e1ny port",
 "label.instances": "P\u00e9ld\u00e1nyok",
 "label.instanciate.template.associate.profile.blade": "Instanciate Template and Associate Profile to Blade",
-"label.intermediate.certificate": "K\u00f6zb\u00fcls\u0151 tan\u00fas\u00edtv\u00e1ny {0}",
+"label.intermediate.certificate": "K\u00f6zb\u00fcls\u0151 tan\u00fas\u00edtv\u00e1ny",
 "label.internal.dns.1": "1. bels\u0151 DNS",
 "label.internal.dns.2": "2. bels\u0151 DNS",
 "label.internal.lb": "Bels\u0151 LB",
diff --git a/src/locales/index.js b/src/locales/index.js
index 28d2076..b256318 100644
--- a/src/locales/index.js
+++ b/src/locales/index.js
@@ -34,7 +34,7 @@ function loadLocaleMessages () {
 Vue.use(VueI18n)
 
 export default new VueI18n({
-  locale: Vue.ls ? Vue.ls.get('current_locale') || 'en' : 'en',
+  locale: Vue.ls ? Vue.ls.get('LOCALE') || 'en' : 'en',
   fallbackLocale: 'en',
   silentTranslationWarn: true,
   messages: loadLocaleMessages()
diff --git a/src/locales/it_IT.json b/src/locales/it_IT.json
index 763c699..46d81bf 100644
--- a/src/locales/it_IT.json
+++ b/src/locales/it_IT.json
@@ -861,7 +861,7 @@
 "label.instanceport": "Instance Port",
 "label.instances": "Istanze",
 "label.instanciate.template.associate.profile.blade": "Instanciate Template and Associate Profile to Blade",
-"label.intermediate.certificate": "Intermediate certificate {0}",
+"label.intermediate.certificate": "Intermediate certificate",
 "label.internal.dns.1": "DNS 1 Interno",
 "label.internal.dns.2": "DNS2 Interno",
 "label.internal.lb": "Internal LB",
diff --git a/src/locales/ja_JP.json b/src/locales/ja_JP.json
index e24dbd3..5e8dd5b 100644
--- a/src/locales/ja_JP.json
+++ b/src/locales/ja_JP.json
@@ -860,7 +860,7 @@
 "label.instanceport": "\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9 \u30dd\u30fc\u30c8",
 "label.instances": "\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9",
 "label.instanciate.template.associate.profile.blade": "\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u4f5c\u6210\u304a\u3088\u3073\u30d7\u30ed\u30d5\u30a1\u30a4\u30eb\u3068\u30d6\u30ec\u30fc\u30c9\u306e\u95a2\u9023\u4ed8\u3051",
-"label.intermediate.certificate": "\u4e2d\u9593\u8a3c\u660e\u66f8 {0}",
+"label.intermediate.certificate": "\u4e2d\u9593\u8a3c\u660e\u66f8",
 "label.internal.dns.1": "\u5185\u90e8 DNS 1",
 "label.internal.dns.2": "\u5185\u90e8 DNS 2",
 "label.internal.lb": "\u5185\u90e8 LB",
diff --git a/src/locales/ko_KR.json b/src/locales/ko_KR.json
index 0ebf10d..e737e6b 100644
--- a/src/locales/ko_KR.json
+++ b/src/locales/ko_KR.json
@@ -860,7 +860,7 @@
 "label.instanceport": "Instance Port",
 "label.instances": "\uc778\uc2a4\ud134\uc2a4",
 "label.instanciate.template.associate.profile.blade": "Instanciate Template and Associate Profile to Blade",
-"label.intermediate.certificate": "Intermediate certificate {0}",
+"label.intermediate.certificate": "Intermediate certificate",
 "label.internal.dns.1": "\ub0b4\ubd80 DNS 1",
 "label.internal.dns.2": "\ub0b4\ubd80 DNS 2",
 "label.internal.lb": "Internal LB",
diff --git a/src/locales/nb_NO.json b/src/locales/nb_NO.json
index f07e9c9..69258a5 100644
--- a/src/locales/nb_NO.json
+++ b/src/locales/nb_NO.json
@@ -861,7 +861,7 @@
 "label.instanceport": "Instansport",
 "label.instances": "Instanser",
 "label.instanciate.template.associate.profile.blade": "Instansier mal og assosier malen med Blade",
-"label.intermediate.certificate": "Intermediate sertifikat {0}",
+"label.intermediate.certificate": "Intermediate sertifikat",
 "label.internal.dns.1": "Intern DNS 1",
 "label.internal.dns.2": "Intern DNS 2",
 "label.internal.lb": "Intern LB",
diff --git a/src/locales/nl_NL.json b/src/locales/nl_NL.json
index 533506f..8ed354c 100644
--- a/src/locales/nl_NL.json
+++ b/src/locales/nl_NL.json
@@ -861,7 +861,7 @@
 "label.instanceport": "instantie poort",
 "label.instances": "Instanties",
 "label.instanciate.template.associate.profile.blade": "Initieer Template en verbind Profiel met Blade",
-"label.intermediate.certificate": "Intermediair certificaat {0}",
+"label.intermediate.certificate": "Intermediair certificaat",
 "label.internal.dns.1": "Interne DNS 1",
 "label.internal.dns.2": "Interne DNS 2",
 "label.internal.lb": "interne LB",
diff --git a/src/locales/pl.json b/src/locales/pl.json
index c2ce64e..b1943b8 100644
--- a/src/locales/pl.json
+++ b/src/locales/pl.json
@@ -861,7 +861,7 @@
 "label.instanceport": "Instance Port",
 "label.instances": "Instancje",
 "label.instanciate.template.associate.profile.blade": "Instanciate Template and Associate Profile to Blade",
-"label.intermediate.certificate": "Intermediate certificate {0}",
+"label.intermediate.certificate": "Intermediate certificate",
 "label.internal.dns.1": "Internal DNS 1",
 "label.internal.dns.2": "Internal DNS 2",
 "label.internal.lb": "Internal LB",
diff --git a/src/locales/pt_BR.json b/src/locales/pt_BR.json
index d2a0524..616ec15 100644
--- a/src/locales/pt_BR.json
+++ b/src/locales/pt_BR.json
@@ -860,7 +860,7 @@
 "label.instanceport": "Instanciar Porta",
 "label.instances": "Inst\u00e2ncias",
 "label.instanciate.template.associate.profile.blade": "Instancia Template e Associa Perfil \u00e0 L\u00e2mina",
-"label.intermediate.certificate": "Certificado intermedi\u00e1rio {0}",
+"label.intermediate.certificate": "Certificado intermedi\u00e1rio",
 "label.internal.dns.1": "DNS 1 Interno",
 "label.internal.dns.2": "DNS 2 Interno",
 "label.internal.lb": "LB interno",
diff --git a/src/locales/ru_RU.json b/src/locales/ru_RU.json
index 51fbe7f..2029203 100644
--- a/src/locales/ru_RU.json
+++ b/src/locales/ru_RU.json
@@ -860,7 +860,7 @@
 "label.instanceport": "Instance Port",
 "label.instances": "\u041c\u0430\u0448\u0438\u043d\u044b",
 "label.instanciate.template.associate.profile.blade": "Instanciate Template and Associate Profile to Blade",
-"label.intermediate.certificate": "Intermediate certificate {0}",
+"label.intermediate.certificate": "Intermediate certificate",
 "label.internal.dns.1": "\u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 DNS 1",
 "label.internal.dns.2": "\u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 DNS 2",
 "label.internal.lb": "Internal LB",
diff --git a/src/locales/zh_CN.json b/src/locales/zh_CN.json
index 0f74984..b046a6d 100644
--- a/src/locales/zh_CN.json
+++ b/src/locales/zh_CN.json
@@ -860,7 +860,7 @@
 "label.instanceport": "\u5b9e\u4f8b\u7aef\u53e3",
 "label.instances": "\u5b9e\u4f8b",
 "label.instanciate.template.associate.profile.blade": "\u5c06\u6a21\u677f\u5b9e\u4f8b\u5316\u5e76\u5c06\u914d\u7f6e\u6587\u4ef6\u4e0e\u5200\u7247\u5f0f\u670d\u52a1\u5668\u5173\u8054",
-"label.intermediate.certificate": "\u4e2d\u95f4\u8bc1\u4e66 {0}",
+"label.intermediate.certificate": "\u4e2d\u95f4\u8bc1\u4e66",
 "label.internal.dns.1": "\u5185\u90e8 DNS 1",
 "label.internal.dns.2": "\u5185\u90e8 DNS 2",
 "label.internal.lb": "\u5185\u90e8\u8d1f\u8f7d\u5747\u8861\u5668",
diff --git a/src/utils/plugins.js b/src/utils/plugins.js
index 388270e..0e3e7f9 100644
--- a/src/utils/plugins.js
+++ b/src/utils/plugins.js
@@ -99,7 +99,7 @@ export const pollJobPlugin = {
       }).catch(e => {
         console.error(`${catchMessage} - ${e}`)
         notification.error({
-          message: 'Error',
+          message: this.$t('label.error'),
           description: catchMessage,
           duration: 0
         })
@@ -114,6 +114,7 @@ export const notifierPlugin = {
 
   install (Vue) {
     Vue.prototype.$notifyError = function (error) {
+      console.log(error)
       var msg = 'Request Failed'
       var desc = ''
       if (error && error.response) {
diff --git a/src/views/AutogenView.vue b/src/views/AutogenView.vue
index 76b715b..b8a6280 100644
--- a/src/views/AutogenView.vue
+++ b/src/views/AutogenView.vue
@@ -51,7 +51,7 @@
               @exec-action="execAction"/>
             <a-select
               v-if="filters && filters.length > 0"
-              placeholder="Filter By"
+              :placeholder="$t('label.filterby')"
               :value="$t('label.' + selectedFilter)"
               style="min-width: 100px; margin-left: 10px"
               @change="changeFilter">
@@ -62,7 +62,7 @@
             </a-select>
             <a-input-search
               style="width: 20vw; margin-left: 10px"
-              placeholder="Search"
+              :placeholder="$t('label.search')"
               v-model="searchQuery"
               v-if="!dataView && !treeView"
               allowClear
@@ -118,7 +118,9 @@
         </span>
         <a-spin :spinning="currentAction.loading">
           <span v-if="currentAction.message">
-            <a-alert :message="$t(currentAction.message)" type="warning" />
+            <a-alert type="warning">
+              <span slot="message" v-html="$t(currentAction.message)" />
+            </a-alert>
             <br v-if="currentAction.paramFields.length > 0"/>
           </span>
           <a-form
@@ -141,7 +143,7 @@
               <span v-if="field.type==='boolean'">
                 <a-switch
                   v-decorator="[field.name, {
-                    rules: [{ required: field.required, message: 'Please provide input' }]
+                    rules: [{ required: field.required, message: `${$t('message.error.required.input')}` }]
                   }]"
                   v-model="formModel[field.name]"
                   :placeholder="field.description"
@@ -151,7 +153,7 @@
                 <a-select
                   :loading="field.loading"
                   v-decorator="[field.name, {
-                    rules: [{ required: field.required, message: 'Please select option' }]
+                    rules: [{ required: field.required, message: `${$t('message.error.select')}` }]
                   }]"
                   :placeholder="field.description"
                 >
@@ -167,7 +169,7 @@
                   showSearch
                   optionFilterProp="children"
                   v-decorator="[field.name, {
-                    rules: [{ required: field.required, message: 'Please select option' }]
+                    rules: [{ required: field.required, message: `${$t('message.error.select')}` }]
                   }]"
                   :loading="field.loading"
                   :placeholder="field.description"
@@ -186,7 +188,7 @@
                   showSearch
                   optionFilterProp="children"
                   v-decorator="[field.name, {
-                    rules: [{ required: field.required, message: 'Please select option' }]
+                    rules: [{ required: field.required, message: `${$t('message.error.select')}` }]
                   }]"
                   :loading="field.loading"
                   :placeholder="field.description"
@@ -204,7 +206,7 @@
                   :loading="field.loading"
                   mode="multiple"
                   v-decorator="[field.name, {
-                    rules: [{ required: field.required, message: 'Please select option' }]
+                    rules: [{ required: field.required, message: `${$t('message.error.select')}` }]
                   }]"
                   :placeholder="field.description"
                 >
@@ -216,7 +218,7 @@
               <span v-else-if="field.type==='long'">
                 <a-input-number
                   v-decorator="[field.name, {
-                    rules: [{ required: field.required, message: 'Please enter a number' }]
+                    rules: [{ required: field.required, message: `${$t('message.validate.number')}` }]
                   }]"
                   :placeholder="field.description"
                 />
@@ -224,7 +226,7 @@
               <span v-else-if="field.name==='password' || field.name==='currentpassword'">
                 <a-input-password
                   v-decorator="[field.name, {
-                    rules: [{ required: field.required, message: 'Please enter input' }]
+                    rules: [{ required: field.required, message: `${$t('message.error.required.input')}` }]
                   }]"
                   :placeholder="field.description"
                 />
@@ -233,7 +235,7 @@
                 <a-textarea
                   rows="2"
                   v-decorator="[field.name, {
-                    rules: [{ required: field.required, message: 'Please enter input' }]
+                    rules: [{ required: field.required, message: `${$t('message.error.required.input')}` }]
                   }]"
                   :placeholder="field.description"
                 />
@@ -241,7 +243,7 @@
               <span v-else>
                 <a-input
                   v-decorator="[field.name, {
-                    rules: [{ required: field.required, message: 'Please enter input' }]
+                    rules: [{ required: field.required, message: `${$t('message.error.required.input')}` }]
                   }]"
                   :placeholder="field.description" />
               </span>
@@ -487,7 +489,7 @@ export default {
           customRender[key] = columnKey[key]
         }
         this.columns.push({
-          title: this.$t('label.' + key),
+          title: this.$t('label.' + String(key).toLowerCase()),
           dataIndex: key,
           scopedSlots: { customRender: key },
           sorter: function (a, b) { return genericCompare(a[this.dataIndex] || '', b[this.dataIndex] || '') }
diff --git a/src/views/auth/Login.vue b/src/views/auth/Login.vue
index acfa06d..0434f33 100644
--- a/src/views/auth/Login.vue
+++ b/src/views/auth/Login.vue
@@ -39,7 +39,7 @@
           <a-input
             size="large"
             type="text"
-            placeholder="Username"
+            :placeholder="$t('label.username')"
             v-decorator="[
               'username',
               {rules: [{ required: true, message: 'Enter your username' }, { validator: handleUsernameOrEmail }], validateTrigger: 'change'}
@@ -54,7 +54,7 @@
             size="large"
             type="password"
             autocomplete="false"
-            placeholder="Password"
+            :placeholder="$t('label.password')"
             v-decorator="[
               'password',
               {rules: [{ required: true, message: 'Enter your password' }], validateTrigger: 'blur'}
@@ -68,7 +68,7 @@
           <a-input
             size="large"
             type="text"
-            placeholder="Domain"
+            :placeholder="$t('label.domain')"
             v-decorator="[
               'domain',
               {rules: [{ required: false, message: 'Enter your domain, leave empty for ROOT domain' }], validateTrigger: 'change'}
diff --git a/src/views/compute/AssignInstance.vue b/src/views/compute/AssignInstance.vue
index 99519a4..e0aa888 100644
--- a/src/views/compute/AssignInstance.vue
+++ b/src/views/compute/AssignInstance.vue
@@ -210,7 +210,7 @@ export default {
         networkids: this.selectedNetwork
       }).then(response => {
         this.$notification.success({
-          message: 'Successfully assigned instance'
+          message: this.$t('label.loadbalancerinstance')
         })
         this.loading = false
         this.$parent.$parent.close()
diff --git a/src/views/compute/DeployVM.vue b/src/views/compute/DeployVM.vue
index 09d36a3..2027190 100644
--- a/src/views/compute/DeployVM.vue
+++ b/src/views/compute/DeployVM.vue
@@ -37,7 +37,7 @@
                     <a-form-item :label="this.$t('label.zoneid')">
                       <a-select
                         v-decorator="['zoneid', {
-                          rules: [{ required: true, message: 'Please select option' }]
+                          rules: [{ required: true, message: `${this.$t('message.error.select')}` }]
                         }]"
                         :options="zoneSelectOptions"
                         @change="onSelectZoneId"
@@ -127,7 +127,7 @@
                               initialValue: hypervisorSelectOptions && hypervisorSelectOptions.length > 0
                                 ? hypervisorSelectOptions[0].value
                                 : null,
-                              rules: [{ required: true, message: 'Please select option' }]
+                              rules: [{ required: true, message: `${this.$t('message.error.select')}` }]
                             }]"
                             :options="hypervisorSelectOptions"
                             @change="value => this.hypervisor = value" />
diff --git a/src/views/compute/MigrateWizard.vue b/src/views/compute/MigrateWizard.vue
index 3f9e227..74d7e65 100644
--- a/src/views/compute/MigrateWizard.vue
+++ b/src/views/compute/MigrateWizard.vue
@@ -18,7 +18,7 @@
 <template>
   <div class="form">
     <a-input-search
-      placeholder="Search"
+      :placeholder="$t('label.search')"
       v-model="searchQuery"
       style="margin-bottom: 10px;"
       @search="fetchData" />
diff --git a/src/views/compute/backup/FormSchedule.vue b/src/views/compute/backup/FormSchedule.vue
index 3dd7bea..0a2654c 100644
--- a/src/views/compute/backup/FormSchedule.vue
+++ b/src/views/compute/backup/FormSchedule.vue
@@ -87,7 +87,7 @@
                   v-decorator="['day-of-week', {
                     rules: [{
                       required: true,
-                      message: 'Please select option'
+                      message: `${this.$t('message.error.select')}`
                     }]
                   }]" >
                   <a-select-option v-for="(opt, optIndex) in dayOfWeek" :key="optIndex">
@@ -102,7 +102,7 @@
                   v-decorator="['day-of-month', {
                     rules: [{
                       required: true,
-                      message: 'Please select option'
+                      message: `${this.$t('message.error.select')}`
                     }]
                   }]">
                   <a-select-option v-for="opt in dayOfMonth" :key="opt.name">
@@ -118,7 +118,7 @@
                   v-decorator="['timezone', {
                     rules: [{
                       required: true,
-                      message: 'Please select option'
+                      messamessage: `${this.$t('message.error.select')}`
                     }]
                   }]"
                   :loading="fetching">
diff --git a/src/views/compute/wizard/AffinityGroupSelection.vue b/src/views/compute/wizard/AffinityGroupSelection.vue
index 2a6ef92..f429249 100644
--- a/src/views/compute/wizard/AffinityGroupSelection.vue
+++ b/src/views/compute/wizard/AffinityGroupSelection.vue
@@ -19,7 +19,7 @@
   <div>
     <a-input-search
       style="width: 25vw;float: right;margin-bottom: 10px; z-index: 8"
-      placeholder="Search"
+      :placeholder="$t('label.search')"
       v-model="filter"
       @search="handleSearch" />
     <a-table
diff --git a/src/views/compute/wizard/ComputeOfferingSelection.vue b/src/views/compute/wizard/ComputeOfferingSelection.vue
index 0ffd53b..1f6c0f0 100644
--- a/src/views/compute/wizard/ComputeOfferingSelection.vue
+++ b/src/views/compute/wizard/ComputeOfferingSelection.vue
@@ -19,7 +19,7 @@
   <div>
     <a-input-search
       style="width: 25vw;float: right;margin-bottom: 10px; z-index: 8"
-      placeholder="Search"
+      :placeholder="$t('label.search')"
       v-model="filter"
       @search="handleSearch" />
     <a-table
diff --git a/src/views/compute/wizard/DiskOfferingSelection.vue b/src/views/compute/wizard/DiskOfferingSelection.vue
index 65a40be..c2bdf50 100644
--- a/src/views/compute/wizard/DiskOfferingSelection.vue
+++ b/src/views/compute/wizard/DiskOfferingSelection.vue
@@ -19,7 +19,7 @@
   <div>
     <a-input-search
       style="width: 25vw;float: right;margin-bottom: 10px; z-index: 8"
-      placeholder="Search"
+      :placeholder="$t('label.search')"
       v-model="filter"
       @search="handleSearch" />
     <a-table
diff --git a/src/views/compute/wizard/NetworkSelection.vue b/src/views/compute/wizard/NetworkSelection.vue
index 1f14a59..171ef9a 100644
--- a/src/views/compute/wizard/NetworkSelection.vue
+++ b/src/views/compute/wizard/NetworkSelection.vue
@@ -19,7 +19,7 @@
   <div>
     <a-input-search
       style="width: 25vw; float: right; margin-bottom: 10px; z-index: 8"
-      placeholder="Search"
+      :placeholder="$t('label.search')"
       v-model="filter"
       @search="handleSearch" />
     <a-button type="primary" @click="showCreateForm = true" style="float: right; margin-right: 5px; z-index: 8">
diff --git a/src/views/compute/wizard/SshKeyPairSelection.vue b/src/views/compute/wizard/SshKeyPairSelection.vue
index 64110c2..fe830f8 100644
--- a/src/views/compute/wizard/SshKeyPairSelection.vue
+++ b/src/views/compute/wizard/SshKeyPairSelection.vue
@@ -19,7 +19,7 @@
   <div>
     <a-input-search
       style="width: 25vw;float: right;margin-bottom: 10px; z-index: 8"
-      placeholder="Search"
+      :placeholder="$t('label.search')"
       v-model="filter"
       @search="handleSearch" />
     <a-table
diff --git a/src/views/compute/wizard/TemplateIsoSelection.vue b/src/views/compute/wizard/TemplateIsoSelection.vue
index 0a055d2..a935c3e 100644
--- a/src/views/compute/wizard/TemplateIsoSelection.vue
+++ b/src/views/compute/wizard/TemplateIsoSelection.vue
@@ -20,7 +20,7 @@
     <span class="filter-group">
       <a-input-search
         class="search-input"
-        placeholder="Search"
+        :placeholder="$t('label.search')"
         v-model="filter"
         @search="filterDataSource">
         <a-popover
diff --git a/src/views/iam/AddLdapAccount.vue b/src/views/iam/AddLdapAccount.vue
index f8e753e..c80dc91 100644
--- a/src/views/iam/AddLdapAccount.vue
+++ b/src/views/iam/AddLdapAccount.vue
@@ -22,7 +22,7 @@
         <a-card :bordered="false">
           <a-input-search
             style="margin-bottom: 10px"
-            placeholder="Search"
+            :placeholder="$t('label.search')"
             v-model="searchQuery"
             @search="handleSearch" />
           <a-table
@@ -54,7 +54,7 @@
               <a-select
                 showSearch
                 v-decorator="['domainid', {
-                  rules: [{ required: true, message: 'Please select option' }]
+                  rules: [{ required: true, memessage: `${this.$t('message.error.select')}` }]
                 }]"
                 :placeholder="apiParams.domainid.description"
                 :loading="domainLoading">
@@ -73,7 +73,7 @@
               <a-select
                 showSearch
                 v-decorator="['roleid', {
-                  rules: [{ required: true, message: 'Please select option' }]
+                  rules: [{ required: true, message: `${this.$t('message.error.select')}` }]
                 }]"
                 :placeholder="apiParams.roleid.description"
                 :loading="roleLoading">
diff --git a/src/views/iam/RolePermissionTab.vue b/src/views/iam/RolePermissionTab.vue
index 7c102c6..bda9c24 100644
--- a/src/views/iam/RolePermissionTab.vue
+++ b/src/views/iam/RolePermissionTab.vue
@@ -34,7 +34,7 @@
             :dataSource="apis"
             :value="newRule"
             @change="val => newRule = val"
-            placeholder="Rule"
+            :placeholder="$t('label.rule')"
             :class="{'rule-dropdown-error' : newRuleSelectError}" />
         </div>
         <div class="rules-table__col rules-table__col--permission">
diff --git a/src/views/image/IsoZones.vue b/src/views/image/IsoZones.vue
index 34a8bcb..7852af7 100644
--- a/src/views/image/IsoZones.vue
+++ b/src/views/image/IsoZones.vue
@@ -42,7 +42,7 @@
           <a-popconfirm
             v-if="'deleteIso' in $store.getters.apis"
             placement="topRight"
-            title="Delete the ISO for this zone?"
+            :title="$t('message.action.delete.iso')"
             :ok-text="$t('label.yes')"
             :cancel-text="$t('label.no')"
             :loading="deleteLoading"
@@ -87,12 +87,12 @@
             <a-select
               id="zone-selection"
               mode="multiple"
-              placeholder="Select Zones"
+              :placeholder="$t('label.select.zones')"
               v-decorator="['zoneid', {
                 rules: [
                   {
                     required: true,
-                    message: 'Please select option'
+                    message: `${this.$t('message.error.select')}`
                   }
                 ]
               }]"
diff --git a/src/views/image/RegisterOrUploadIso.vue b/src/views/image/RegisterOrUploadIso.vue
index f03a028..c2ff36d 100644
--- a/src/views/image/RegisterOrUploadIso.vue
+++ b/src/views/image/RegisterOrUploadIso.vue
@@ -30,7 +30,7 @@
         <a-form-item v-if="currentForm === 'Create'" :label="$t('label.url')">
           <a-input
             v-decorator="['url', {
-              rules: [{ required: true, message: 'Please upload an ISO' }]
+              rules: [{ required: true, message: `${this.$t('label.upload.iso.from.local')}` }]
             }]"
             :placeholder="apiParams.url.description" />
         </a-form-item>
@@ -41,7 +41,7 @@
             :remove="handleRemove"
             :beforeUpload="beforeUpload"
             v-decorator="['file', {
-              rules: [{ required: true, message: 'Please enter input' }]
+              rules: [{ required: true, message: `${this.$t('message.error.required.input')}` }]
             }]">
             <p class="ant-upload-drag-icon">
               <a-icon type="cloud-upload" />
@@ -54,7 +54,7 @@
         <a-form-item :label="$t('label.name')">
           <a-input
             v-decorator="['name', {
-              rules: [{ required: true, message: 'Please enter input' }]
+              rules: [{ required: true, message: `${this.$t('message.error.required.input')}` }]
             }]"
             :placeholder="apiParams.name.description" />
         </a-form-item>
@@ -62,7 +62,7 @@
         <a-form-item :label="$t('label.displaytext')">
           <a-input
             v-decorator="['displaytext', {
-              rules: [{ required: true, message: 'Please enter input' }]
+              rules: [{ required: true, message: `${this.$t('message.error.required.input')}` }]
             }]"
             :placeholder="apiParams.displaytext.description" />
         </a-form-item>
@@ -78,7 +78,7 @@
               rules: [
                 {
                   required: true,
-                  message: 'Please select option'
+                  message: `${this.$t('message.error.select')}`
                 }
               ]
             }]"
@@ -115,7 +115,7 @@
           <a-select
             v-decorator="['ostypeid', {
               initialValue: defaultOsType,
-              rules: [{ required: true, message: 'Please select option' }]
+              rules: [{ required: true, message: `${this.$t('message.error.select')}` }]
             }]"
             showSearch
             optionFilterProp="children"
@@ -335,7 +335,7 @@ export default {
           api('registerIso', params).then(json => {
             this.$emit('refresh-data')
             this.$notification.success({
-              message: 'Register ISO',
+              message: 'label.action.register.iso',
               description: 'Sucessfully registered ISO ' + params.name
             })
           }).catch(error => {
diff --git a/src/views/image/RegisterOrUploadTemplate.vue b/src/views/image/RegisterOrUploadTemplate.vue
index 2a7dab1..b9a9268 100644
--- a/src/views/image/RegisterOrUploadTemplate.vue
+++ b/src/views/image/RegisterOrUploadTemplate.vue
@@ -32,7 +32,7 @@
             <a-form-item :label="$t('label.url')">
               <a-input
                 v-decorator="['url', {
-                  rules: [{ required: true, message: 'Please enter input' }]
+                  rules: [{ required: true, message: `${this.$t('message.error.required.input')}` }]
                 }]"
                 :placeholder="apiParams.url.description" />
             </a-form-item>
@@ -46,7 +46,7 @@
               :remove="handleRemove"
               :beforeUpload="beforeUpload"
               v-decorator="['file', {
-                rules: [{ required: true, message: 'Please enter input' }]
+                rules: [{ required: true, message: `${this.$t('message.error.required.input')}` }]
               }]">
               <p class="ant-upload-drag-icon">
                 <a-icon type="cloud-upload" />
@@ -61,7 +61,7 @@
           <a-form-item :label="$t('label.name')">
             <a-input
               v-decorator="['name', {
-                rules: [{ required: true, message: 'Please upload a template ' }]
+                rules: [{ required: true, message: `${this.$t('label.upload.template.from.local')}` }]
               }]"
               :placeholder="apiParams.name.description" />
           </a-form-item>
@@ -70,7 +70,7 @@
           <a-form-item :label="$t('label.displaytext')">
             <a-input
               v-decorator="['displaytext', {
-                rules: [{ required: true, message: 'Please enter input' }]
+                rules: [{ required: true, message: `${this.$t('message.error.required.input')}` }]
               }]"
               :placeholder="apiParams.displaytext.description" />
           </a-form-item>
@@ -87,7 +87,7 @@
                     rules: [
                       {
                         required: true,
-                        message: 'Please select option',
+                        message: `${this.$t('message.error.select')}`,
                         type: 'array'
                       }
                     ]
@@ -135,7 +135,7 @@
                   rules: [
                     {
                       required: true,
-                      message: 'Please select option'
+                      message: `${this.$t('message.error.select')}`
                     }
                   ]
                 }]"
@@ -155,7 +155,7 @@
                   rules: [
                     {
                       required: true,
-                      message: 'Please select option'
+                      message: `${this.$t('message.error.select')}`
                     }
                   ]
                 }]"
@@ -177,7 +177,7 @@
             <a-form-item :label="$t('label.checksum')">
               <a-input
                 v-decorator="['checksum', {
-                  rules: [{ required: false, message: 'Please enter input' }]
+                  rules: [{ required: false, message: `${this.$t('message.error.required.input')}` }]
                 }]"
                 :placeholder="apiParams.checksum.description" />
             </a-form-item>
@@ -200,7 +200,7 @@
                   rules: [
                     {
                       required: true,
-                      message: 'Please select option'
+                      message: `${this.$t('message.error.select')}`
                     }
                   ]
                 }]"
@@ -219,7 +219,7 @@
                   rules: [
                     {
                       required: false,
-                      message: 'Please select option'
+                      message: `${this.$t('message.error.select')}`
                     }
                   ]
                 }]"
@@ -238,7 +238,7 @@
                   rules: [
                     {
                       required: false,
-                      message: 'Please select option'
+                      message: `${this.$t('message.error.select')}`
                     }
                   ]
                 }]"
@@ -256,7 +256,7 @@
                   rules: [
                     {
                       required: false,
-                      message: 'Please select option'
+                      message: `${this.$t('message.error.select')}`
                     }
                   ]
                 }]"
@@ -278,7 +278,7 @@
                   rules: [
                     {
                       required: true,
-                      message: 'Please select option'
+                      message: `${this.$t('message.error.select')}`
                     }
                   ]
                 }]"
diff --git a/src/views/image/TemplateZones.vue b/src/views/image/TemplateZones.vue
index e8801b0..1c2e2b4 100644
--- a/src/views/image/TemplateZones.vue
+++ b/src/views/image/TemplateZones.vue
@@ -42,7 +42,7 @@
           <a-popconfirm
             v-if="'deleteTemplate' in $store.getters.apis"
             placement="topRight"
-            title="Delete the template for this zone?"
+            :title="$t('message.action.delete.template')"
             :ok-text="$t('label.yes')"
             :cancel-text="$t('label.no')"
             :loading="deleteLoading"
@@ -87,12 +87,12 @@
             <a-select
               id="zone-selection"
               mode="multiple"
-              placeholder="Select Zones"
+              :placeholder="$t('label.select.zones')"
               v-decorator="['zoneid', {
                 rules: [
                   {
                     required: true,
-                    message: 'Please select option'
+                    message: `${this.$t('message.error.select')}`
                   }
                 ]
               }]"
diff --git a/src/views/infra/AddPrimaryStorage.vue b/src/views/infra/AddPrimaryStorage.vue
index f8014cc..34c5554 100644
--- a/src/views/infra/AddPrimaryStorage.vue
+++ b/src/views/infra/AddPrimaryStorage.vue
@@ -38,7 +38,7 @@
         </div>
         <a-form-item :label="$t('label.zoneid')">
           <a-select
-            v-decorator="['zone', { initialValue: this.zoneSelected, rules: [{ required: true, message: 'required'}] }]"
+            v-decorator="['zone', { initialValue: this.zoneSelected, rules: [{ required: true, message: `${this.$t('label.required')}`}] }]"
             @change="val => changeZone(val)">
             <a-select-option :value="zone.id" v-for="(zone) in zones" :key="zone.id">
               {{ zone.name }}
@@ -48,7 +48,7 @@
         <div v-if="this.scope === 'cluster' || this.scope === 'host'">
           <a-form-item :label="$t('label.podid')">
             <a-select
-              v-decorator="['pod', { initialValue: this.podSelected, rules: [{ required: true, message: 'required'}] }]"
+              v-decorator="['pod', { initialValue: this.podSelected, rules: [{ required: true, message: `${this.$t('label.required')}`}] }]"
               @change="val => changePod(val)">
               <a-select-option :value="pod.id" v-for="(pod) in pods" :key="pod.id">
                 {{ pod.name }}
@@ -57,7 +57,7 @@
           </a-form-item>
           <a-form-item :label="$t('label.clusterid')">
             <a-select
-              v-decorator="['cluster', { initialValue: this.clusterSelected, rules: [{ required: true, message: 'required'}] }]"
+              v-decorator="['cluster', { initialValue: this.clusterSelected, rules: [{ required: true, message: `${this.$t('label.required')}`}] }]"
               @change="val => fetchHypervisor(val)">
               <a-select-option :value="cluster.id" v-for="cluster in clusters" :key="cluster.id">
                 {{ cluster.name }}
@@ -68,7 +68,7 @@
         <div v-if="this.scope === 'host'">
           <a-form-item :label="$t('label.hostid')">
             <a-select
-              v-decorator="['host', { initialValue: this.hostSelected, rules: [{ required: true, message: 'required'}] }]"
+              v-decorator="['host', { initialValue: this.hostSelected, rules: [{ required: true, message: `${this.$t('label.required')}`}] }]"
               @change="val => this.hostSelected = val">
               <a-select-option :value="host.id" v-for="host in hosts" :key="host.id">
                 {{ host.name }}
@@ -77,11 +77,11 @@
           </a-form-item>
         </div>
         <a-form-item :label="$t('label.name')">
-          <a-input v-decorator="['name', { rules: [{ required: true, message: 'required' }] }]"/>
+          <a-input v-decorator="['name', { rules: [{ required: true, message: `${this.$t('label.required')}` }] }]"/>
         </a-form-item>
         <a-form-item :label="$t('label.protocol')">
           <a-select
-            v-decorator="['protocol', { initialValue: this.protocols[0], rules: [{ required: true, message: 'required'}] }]"
+            v-decorator="['protocol', { initialValue: this.protocols[0], rules: [{ required: true, message: `${this.$t('label.required')}`}] }]"
             @change="val => this.protocolSelected = val">
             <a-select-option :value="protocol" v-for="(protocol,idx) in protocols" :key="idx">
               {{ protocol }}
@@ -91,44 +91,44 @@
         <div
           v-if="protocolSelected === 'nfs' || protocolSelected === 'SMB' || protocolSelected === 'iscsi' || protocolSelected === 'vmfs'|| protocolSelected === 'Gluster'">
           <a-form-item :label="$t('label.server')">
-            <a-input v-decorator="['server', { rules: [{ required: true, message: 'required' }] }]" />
+            <a-input v-decorator="['server', { rules: [{ required: true, message: `${this.$t('label.required')}` }] }]" />
           </a-form-item>
         </div>
         <div v-if="protocolSelected === 'nfs' || protocolSelected === 'SMB' || protocolSelected === 'ocfs2' || protocolSelected === 'preSetup'|| protocolSelected === 'SharedMountPoint'">
           <a-form-item :label="$t('label.path')">
-            <a-input v-decorator="['path', { rules: [{ required: true, message: 'required' }] }]" />
+            <a-input v-decorator="['path', { rules: [{ required: true, message: `${this.$t('label.required')}` }] }]" />
           </a-form-item>
         </div>
         <div v-if="protocolSelected === 'SMB'">
           <a-form-item :label="$t('label.smbusername')">
-            <a-input v-decorator="['smbUsername', { rules: [{ required: true, message: 'required' }] }]"/>
+            <a-input v-decorator="['smbUsername', { rules: [{ required: true, message: `${this.$t('label.required')}` }] }]"/>
           </a-form-item>
           <a-form-item :label="$t('label.smbpassword')">
-            <a-input-password v-decorator="['smbPassword', { rules: [{ required: true, message: 'required' }] }]"/>
+            <a-input-password v-decorator="['smbPassword', { rules: [{ required: true, message: `${this.$t('label.required')}` }] }]"/>
           </a-form-item>
           <a-form-item :label="$t('label.smbdomain')">
-            <a-input v-decorator="['smbDomain', { rules: [{ required: true, message: 'required' }] }]"/>
+            <a-input v-decorator="['smbDomain', { rules: [{ required: true, message: `${this.$t('label.required')}` }] }]"/>
           </a-form-item>
         </div>
         <div v-if="protocolSelected === 'iscsi'">
           <a-form-item :label="$t('label.iqn')">
-            <a-input v-decorator="['iqn', { rules: [{ required: true, message: 'required' }] }]"/>
+            <a-input v-decorator="['iqn', { rules: [{ required: true, message: `${this.$t('label.required')}` }] }]"/>
           </a-form-item>
           <a-form-item :label="$t('label.lun')">
-            <a-input v-decorator="['lun', { rules: [{ required: true, message: 'required' }] }]"/>
+            <a-input v-decorator="['lun', { rules: [{ required: true, message: `${this.$t('label.required')}` }] }]"/>
           </a-form-item>
         </div>
         <div v-if="protocolSelected === 'vmfs'">
           <a-form-item :label="$t('label.vcenterdatacenter')">
-            <a-input v-decorator="['vCenterDataCenter', { rules: [{ required: true, message: 'required' }] }]"/>
+            <a-input v-decorator="['vCenterDataCenter', { rules: [{ required: true, message: `${this.$t('label.required')}` }] }]"/>
           </a-form-item>
           <a-form-item :label="$t('label.vcenterdatastore')">
-            <a-input v-decorator="['vCenterDataStore', { rules: [{ required: true, message: 'required' }] }]"/>
+            <a-input v-decorator="['vCenterDataStore', { rules: [{ required: true, message: `${this.$t('label.required')}` }] }]"/>
           </a-form-item>
         </div>
         <a-form-item :label="$t('label.providername')">
           <a-select
-            v-decorator="['provider', { initialValue: providerSelected, rules: [{ required: true, message: 'required'}] }]"
+            v-decorator="['provider', { initialValue: providerSelected, rules: [{ required: true, message: `${this.$t('label.required')}`}] }]"
             @change="val => this.providerSelected = val">
             <a-select-option :value="provider" v-for="(provider,idx) in providers" :key="idx">
               {{ provider }}
@@ -166,7 +166,7 @@
         </div>
         <div v-if="protocolSelected === 'CLVM'">
           <a-form-item :label="$t('label.volumegroup')">
-            <a-input v-decorator="['volumegroup', { rules: [{ required: true, message: 'required'}] }]" />
+            <a-input v-decorator="['volumegroup', { rules: [{ required: true, message: `${this.$t('label.required')}`}] }]" />
           </a-form-item>
         </div>
         <div v-if="protocolSelected === 'Gluster'">
diff --git a/src/views/infra/AddSecondaryStorage.vue b/src/views/infra/AddSecondaryStorage.vue
index 8af2c85..f65854f 100644
--- a/src/views/infra/AddSecondaryStorage.vue
+++ b/src/views/infra/AddSecondaryStorage.vue
@@ -45,7 +45,7 @@
                 'zone',
                 {
                   initialValue: this.zoneSelected,
-                  rules: [{ required: true, message: 'required'}]
+                  rules: [{ required: true, message: `${this.$t('label.required')}`}]
                 }]"
               @change="val => { zoneSelected = val }"
             >
@@ -61,7 +61,7 @@
               v-decorator="[
                 'server',
                 {
-                  rules: [{ required: true, message: 'required' }]
+                  rules: [{ required: true, message: `${this.$t('label.required')}` }]
                 }]"
             />
           </a-form-item>
@@ -70,7 +70,7 @@
               v-decorator="[
                 'path',
                 {
-                  rules: [{ required: true, message: 'required' }]
+                  rules: [{ required: true, message: `${this.$t('label.required')}` }]
                 }]"
             />
           </a-form-item>
@@ -81,7 +81,7 @@
               v-decorator="[
                 'smbUsername',
                 {
-                  rules: [{ required: true, message: 'required' }]
+                  rules: [{ required: true, message: `${this.$t('label.required')}` }]
                 }]"
             />
           </a-form-item>
@@ -90,7 +90,7 @@
               v-decorator="[
                 'smbPassword',
                 {
-                  rules: [{ required: true, message: 'required' }]
+                  rules: [{ required: true, message: `${this.$t('label.required')}` }]
                 }]"
             />
           </a-form-item>
@@ -99,7 +99,7 @@
               v-decorator="[
                 'smbDomain',
                 {
-                  rules: [{ required: true, message: 'required' }]
+                  rules: [{ required: true, message: `${this.$t('label.required')}` }]
                 }]"
             />
           </a-form-item>
@@ -110,7 +110,7 @@
               v-decorator="[
                 'url',
                 {
-                  rules: [{ required: true, message: 'required' }]
+                  rules: [{ required: true, message: `${this.$t('label.required')}` }]
                 }]"
             />
           </a-form-item>
@@ -119,7 +119,7 @@
               v-decorator="[
                 'account',
                 {
-                  rules: [{ required: true, message: 'required' }]
+                  rules: [{ required: true, message: `${this.$t('label.required')}` }]
                 }]"
             />
           </a-form-item>
@@ -128,7 +128,7 @@
               v-decorator="[
                 'username',
                 {
-                  rules: [{ required: true, message: 'required' }]
+                  rules: [{ required: true, message: `${this.$t('label.required')}` }]
                 }]"
             />
           </a-form-item>
@@ -137,7 +137,7 @@
               v-decorator="[
                 'key',
                 {
-                  rules: [{ required: true, message: 'required' }]
+                  rules: [{ required: true, message: `${this.$t('label.required')}` }]
                 }]"
             />
           </a-form-item>
diff --git a/src/views/infra/ClusterAdd.vue b/src/views/infra/ClusterAdd.vue
index d58bfe5..14ff844 100644
--- a/src/views/infra/ClusterAdd.vue
+++ b/src/views/infra/ClusterAdd.vue
@@ -262,11 +262,11 @@ export default {
       }).then(response => {
         this.$pollJob({
           jobId: response.dedicateclusterresponse.jobid,
-          successMessage: `Successfully dedicated cluster`,
+          successMessage: this.$t('message.cluster.dedicated'),
           successMethod: () => {
             this.loading = false
             this.$store.dispatch('AddAsyncJob', {
-              title: 'Successfully dedicated cluster',
+              title: this.$t('message.cluster.dedicated'),
               jobid: response.dedicateclusterresponse.jobid,
               description: `Domain ID: ${this.dedicatedDomainId}`,
               status: 'progress'
@@ -276,7 +276,7 @@ export default {
           errorMethod: () => {
             this.loading = false
           },
-          loadingMessage: `Dedicating cluster...`,
+          loadingMessage: this.$t('message.dedicate.zone'),
           catchMessage: 'Error encountered while fetching async job result',
           catchMethod: () => {
             this.loading = false
diff --git a/src/views/infra/CpuSockets.vue b/src/views/infra/CpuSockets.vue
index bcbb8c1..e04f8b0 100644
--- a/src/views/infra/CpuSockets.vue
+++ b/src/views/infra/CpuSockets.vue
@@ -59,6 +59,12 @@ export default {
     ListView,
     Breadcrumb
   },
+  provide: function () {
+    return {
+      parentFetchData: this.fetchData,
+      parentToggleLoading: () => { this.loading = !this.loading }
+    }
+  },
   data () {
     return {
       loading: false,
diff --git a/src/views/infra/HostAdd.vue b/src/views/infra/HostAdd.vue
index 6d9e7fe..21f257b 100644
--- a/src/views/infra/HostAdd.vue
+++ b/src/views/infra/HostAdd.vue
@@ -315,11 +315,11 @@ export default {
       }).then(response => {
         this.$pollJob({
           jobId: response.dedicatehostresponse.jobid,
-          successMessage: `Successfully dedicated host`,
+          successMessage: this.$t('message.host.dedicated'),
           successMethod: () => {
             this.loading = false
             this.$store.dispatch('AddAsyncJob', {
-              title: 'Successfully dedicated host',
+              title: this.$t('message.host.dedicated'),
               jobid: response.dedicatehostresponse.jobid,
               description: `Domain ID: ${this.dedicatedDomainId}`,
               status: 'progress'
@@ -329,7 +329,7 @@ export default {
           errorMethod: () => {
             this.loading = false
           },
-          loadingMessage: `Dedicating host...`,
+          loadingMessage: this.$t('message.dedicate.host'),
           catchMessage: 'Error encountered while fetching async job result',
           catchMethod: () => {
             this.loading = false
diff --git a/src/views/infra/InfraSummary.vue b/src/views/infra/InfraSummary.vue
index 1578a47..c416bba 100644
--- a/src/views/infra/InfraSummary.vue
+++ b/src/views/infra/InfraSummary.vue
@@ -48,16 +48,16 @@
             </p>
 
             <a-form @submit.prevent="handleSslFormSubmit" ref="sslForm" :form="form">
-              <a-form-item label="Root certificate" :required="true">
+              <a-form-item :label="$t('label.root.certificate')" :required="true">
                 <a-textarea
                   id="rootCert"
                   rows="2"
-                  placeholder="Root certificate"
+                  :placeholder="$t('label.root.certificate')"
                   :autoFocus="true"
                   name="rootCert"
                   v-decorator="[
                     'root',
-                    {rules: [{ required: true, message: 'Required' }], validateTrigger:'change'}
+                    {rules: [{ required: true, message: `${this.$t('label.required')}` }], validateTrigger:'change'}
                   ]"
                 ></a-textarea>
               </a-form-item>
@@ -67,11 +67,11 @@
                   v-for="(item, index) in intermediateCertificates"
                   :key="`key-${index}`"
                   class="intermediate-certificate"
-                  :label="`Intermediate certificate ${index + 1}`">
+                  :label="$t('label.intermediate.certificate') + ` ${index + 1}`">
                   <a-textarea
                     :id="`intermediateCert${index}`"
                     rows="2"
-                    :placeholder="`Intermediate certificate ${index + 1}`"
+                    :placeholder="$t('label.intermediate.certificate') + ` ${index + 1}`"
                     :name="`intermediateCert${index}`"
                     v-decorator="[
                       `intermediate${index + 1}`,
@@ -88,40 +88,40 @@
                 </a-button>
               </a-form-item>
 
-              <a-form-item label="Server certificate" :required="true">
+              <a-form-item :label="$t('label.server.certificate')" :required="true">
                 <a-textarea
                   id="serverCert"
                   rows="2"
-                  placeholder="Server certificate"
+                  :placeholder="$t('label.server.certificate')"
                   name="serverCert"
                   v-decorator="[
                     'server',
-                    {rules: [{ required: true, message: 'Required' }], validateTrigger:'change'}
+                    {rules: [{ required: true, message: `${this.$t('label.required')}` }], validateTrigger:'change'}
                   ]"
                 ></a-textarea>
               </a-form-item>
 
-              <a-form-item label="PKCS#8 Private Key" :required="true">
+              <a-form-item :label="$t('label.pkcs.private.certificate')" :required="true">
                 <a-textarea
                   id="pkcsKey"
                   rows="2"
-                  placeholder="PKCS#8 Private Key"
+                  :placeholder="$t('label.pkcs.private.certificate')"
                   name="pkcsKey"
                   v-decorator="[
                     'pkcs',
-                    {rules: [{ required: true, message: 'Required' }], validateTrigger:'change'}
+                    {rules: [{ required: true, message: `${this.$t('label.required')}` }], validateTrigger:'change'}
                   ]"
                 ></a-textarea>
               </a-form-item>
 
-              <a-form-item label="DNS Domain Suffix (i.e., xyz.com)" :required="true">
+              <a-form-item :label="$t('label.domain.suffix')" :required="true">
                 <a-input
                   id="dnsSuffix"
-                  placeholder="DNS Domain Suffix (i.e., xyz.com)"
+                  :placeholder="$t('label.domain.suffix')"
                   name="dnsSuffix"
                   v-decorator="[
                     'dns',
-                    {rules: [{ required: true, message: 'Required' }], validateTrigger:'change'}
+                    {rules: [{ required: true, message: `${this.$t('label.required')}` }], validateTrigger:'change'}
                   ]"
                 ></a-input>
               </a-form-item>
diff --git a/src/views/infra/PodAdd.vue b/src/views/infra/PodAdd.vue
index 48326a1..50b27aa 100644
--- a/src/views/infra/PodAdd.vue
+++ b/src/views/infra/PodAdd.vue
@@ -23,7 +23,7 @@
         <a-select
           v-decorator="['zoneid', {
             initialValue: this.zoneId,
-            rules: [{ required: true, message: 'required' }] }
+            rules: [{ required: true, message: `${this.$t('label.required')}` }] }
           ]">
           <a-select-option
             v-for="zone in zonesList"
@@ -40,7 +40,7 @@
           v-decorator="[
             'name',
             {
-              rules: [{ required: true, message: 'required' }]
+              rules: [{ required: true, message: `${this.$t('label.required')}` }]
             }]"
         />
       </a-form-item>
@@ -51,7 +51,7 @@
           v-decorator="[
             'gateway',
             {
-              rules: [{ required: true, message: 'required' }]
+              rules: [{ required: true, message: `${this.$t('label.required')}` }]
             }]"
         />
       </a-form-item>
@@ -62,7 +62,7 @@
           v-decorator="[
             'netmask',
             {
-              rules: [{ required: true, message: 'required' }]
+              rules: [{ required: true, message: `${this.$t('label.required')}` }]
             }]"
         />
       </a-form-item>
@@ -73,7 +73,7 @@
           v-decorator="[
             'startip',
             {
-              rules: [{ required: true, message: 'required' }]
+              rules: [{ required: true, message: `${this.$t('label.required')}` }]
             }]"
         />
       </a-form-item>
@@ -213,11 +213,11 @@ export default {
       }).then(response => {
         this.$pollJob({
           jobId: response.dedicatepodresponse.jobid,
-          successMessage: `Successfully dedicated pod`,
+          successMessage: this.$t('message.pod.dedicated'),
           successMethod: () => {
             this.loading = false
             this.$store.dispatch('AddAsyncJob', {
-              title: 'Successfully dedicated pod',
+              title: this.$t('message.pod.dedicated'),
               jobid: response.dedicatepodresponse.jobid,
               description: `Domain ID: ${this.dedicatedDomainId}`,
               status: 'progress'
@@ -227,7 +227,7 @@ export default {
           errorMethod: () => {
             this.loading = false
           },
-          loadingMessage: `Dedicating pod...`,
+          loadingMessage: this.$t('message.dedicate.pod'),
           catchMessage: 'Error encountered while fetching async job result',
           catchMethod: () => {
             this.loading = false
diff --git a/src/views/infra/network/DedicatedVLANTab.vue b/src/views/infra/network/DedicatedVLANTab.vue
index 50a66ee..285e3f9 100644
--- a/src/views/infra/network/DedicatedVLANTab.vue
+++ b/src/views/infra/network/DedicatedVLANTab.vue
@@ -59,7 +59,7 @@
           <a-form-item :label="$t('label.vlanrange')">
             <a-input
               v-decorator="['range', {
-                rules: [{ required: true, message: 'Required' }]
+                rules: [{ required: true, message: `${this.$t('label.required')}` }]
               }]"
             ></a-input>
           </a-form-item>
@@ -75,7 +75,7 @@
             <a-select
               @change="handleDomainChange"
               v-decorator="['domain', {
-                rules: [{ required: true, message: 'Required' }]
+                rules: [{ required: true, message: `${this.$t('label.required')}` }]
               }]"
             >
               <a-select-option v-for="domain in domains" :key="domain.id" :value="domain.id">{{ domain.name }}</a-select-option>
@@ -85,7 +85,7 @@
           <a-form-item :label="$t('label.account')" v-if="selectedScope === 'account'">
             <a-select
               v-decorator="['account', {
-                rules: [{ required: true, message: 'Required' }]
+                rules: [{ required: true, message: `${this.$t('label.required')}` }]
               }]"
             >
               <a-select-option
@@ -100,7 +100,7 @@
           <a-form-item :label="$t('label.project')" v-if="selectedScope === 'project'">
             <a-select
               v-decorator="['project', {
-                rules: [{ required: true, message: 'Required' }]
+                rules: [{ required: true, message: `${this.$t('label.required')}` }]
               }]"
             >
               <a-select-option
diff --git a/src/views/infra/network/IpRangesTabManagement.vue b/src/views/infra/network/IpRangesTabManagement.vue
index 7120640..3471895 100644
--- a/src/views/infra/network/IpRangesTabManagement.vue
+++ b/src/views/infra/network/IpRangesTabManagement.vue
@@ -72,7 +72,7 @@
         <a-form-item :label="$t('label.podid')" class="form__item">
           <a-select
             v-decorator="['pod', {
-              rules: [{ required: true, message: 'Required' }]
+              rules: [{ required: true, message: `${this.$t('label.required')}` }]
             }]"
           >
             <a-select-option v-for="item in items" :key="item.id" :value="item.id">{{ item.name }}</a-select-option>
@@ -80,12 +80,12 @@
         </a-form-item>
         <a-form-item :label="$t('label.gateway')" class="form__item">
           <a-input
-            v-decorator="['gateway', { rules: [{ required: true, message: 'Required' }] }]">
+            v-decorator="['gateway', { rules: [{ required: true, message: `${this.$t('label.required')}` }] }]">
           </a-input>
         </a-form-item>
         <a-form-item :label="$t('label.netmask')" class="form__item">
           <a-input
-            v-decorator="['netmask', { rules: [{ required: true, message: 'Required' }] }]">
+            v-decorator="['netmask', { rules: [{ required: true, message: `${this.$t('label.required')}` }] }]">
           </a-input>
         </a-form-item>
         <a-form-item :label="$t('label.vlan')" class="form__item">
@@ -95,12 +95,12 @@
         </a-form-item>
         <a-form-item :label="$t('label.startip')" class="form__item">
           <a-input
-            v-decorator="['startip', { rules: [{ required: true, message: 'Required' }] }]">
+            v-decorator="['startip', { rules: [{ required: true, message: `${this.$t('label.required')}` }] }]">
           </a-input>
         </a-form-item>
         <a-form-item :label="$t('label.endip')" class="form__item">
           <a-input
-            v-decorator="['endip', { rules: [{ required: true, message: 'Required' }] }]">
+            v-decorator="['endip', { rules: [{ required: true, message: `${this.$t('label.required')}` }] }]">
           </a-input>
         </a-form-item>
         <a-form-item :label="$t('label.system.vms')" class="form__item">
diff --git a/src/views/infra/network/IpRangesTabPublic.vue b/src/views/infra/network/IpRangesTabPublic.vue
index 1706ad7..eba4937 100644
--- a/src/views/infra/network/IpRangesTabPublic.vue
+++ b/src/views/infra/network/IpRangesTabPublic.vue
@@ -120,12 +120,12 @@
       >
         <a-form-item :label="$t('label.gateway')" class="form__item">
           <a-input
-            v-decorator="['gateway', { rules: [{ required: true, message: 'Required' }] }]">
+            v-decorator="['gateway', { rules: [{ required: true, message: `${this.$t('label.required')}` }] }]">
           </a-input>
         </a-form-item>
         <a-form-item :label="$t('label.netmask')" class="form__item">
           <a-input
-            v-decorator="['netmask', { rules: [{ required: true, message: 'Required' }] }]">
+            v-decorator="['netmask', { rules: [{ required: true, message: `${this.$t('label.required')}` }] }]">
           </a-input>
         </a-form-item>
         <a-form-item :label="$t('label.vlan')" class="form__item">
@@ -135,12 +135,12 @@
         </a-form-item>
         <a-form-item :label="$t('label.startip')" class="form__item">
           <a-input
-            v-decorator="['startip', { rules: [{ required: true, message: 'Required' }] }]">
+            v-decorator="['startip', { rules: [{ required: true, message: `${this.$t('label.required')}` }] }]">
           </a-input>
         </a-form-item>
         <a-form-item :label="$t('label.endip')" class="form__item">
           <a-input
-            v-decorator="['endip', { rules: [{ required: true, message: 'Required' }] }]">
+            v-decorator="['endip', { rules: [{ required: true, message: `${this.$t('label.required')}` }] }]">
           </a-input>
         </a-form-item>
         <div class="form__item">
diff --git a/src/views/infra/network/IpRangesTabStorage.vue b/src/views/infra/network/IpRangesTabStorage.vue
index 548743a..1514312 100644
--- a/src/views/infra/network/IpRangesTabStorage.vue
+++ b/src/views/infra/network/IpRangesTabStorage.vue
@@ -70,7 +70,7 @@
         <a-form-item :label="$t('label.podid')" class="form__item">
           <a-select
             v-decorator="['pod', {
-              rules: [{ required: true, message: 'Required' }]
+              rules: [{ required: true, message: `${this.$t('label.required')}` }]
             }]"
           >
             <a-select-option v-for="pod in pods" :key="pod.id" :value="pod.id">{{ pod.name }}</a-select-option>
@@ -78,12 +78,12 @@
         </a-form-item>
         <a-form-item :label="$t('label.gateway')" class="form__item">
           <a-input
-            v-decorator="['gateway', { rules: [{ required: true, message: 'Required' }] }]">
+            v-decorator="['gateway', { rules: [{ required: true, message: `${this.$t('label.required')}` }] }]">
           </a-input>
         </a-form-item>
         <a-form-item :label="$t('label.netmask')" class="form__item">
           <a-input
-            v-decorator="['netmask', { rules: [{ required: true, message: 'Required' }] }]">
+            v-decorator="['netmask', { rules: [{ required: true, message: `${this.$t('label.required')}` }] }]">
           </a-input>
         </a-form-item>
         <a-form-item :label="$t('label.vlan')" class="form__item">
@@ -93,12 +93,12 @@
         </a-form-item>
         <a-form-item :label="$t('label.startip')" class="form__item">
           <a-input
-            v-decorator="['startip', { rules: [{ required: true, message: 'Required' }] }]">
+            v-decorator="['startip', { rules: [{ required: true, message: `${this.$t('label.required')}` }] }]">
           </a-input>
         </a-form-item>
         <a-form-item :label="$t('label.endip')" class="form__item">
           <a-input
-            v-decorator="['endip', { rules: [{ required: true, message: 'Required' }] }]">
+            v-decorator="['endip', { rules: [{ required: true, message: `${this.$t('label.required')}` }] }]">
           </a-input>
         </a-form-item>
       </a-form>
diff --git a/src/views/infra/zone/ZoneWizardNetworkSetupStep.vue b/src/views/infra/zone/ZoneWizardNetworkSetupStep.vue
index 56988d3..79d7396 100644
--- a/src/views/infra/zone/ZoneWizardNetworkSetupStep.vue
+++ b/src/views/infra/zone/ZoneWizardNetworkSetupStep.vue
@@ -284,33 +284,33 @@ export default {
         {
           title: 'label.pod.name',
           key: 'podName',
-          placeHolder: 'Please enter pod name',
+          placeHolder: 'message.installwizard.tooltip.addpod.name',
           required: true
         },
         {
           title: 'label.reserved.system.gateway',
           key: 'podReservedGateway',
-          placeHolder: 'Please enter system gateway for Pod',
+          placeHolder: 'message.installwizard.tooltip.addpod.reservedsystemgateway',
           required: true
         },
         {
           title: 'label.reserved.system.netmask',
           key: 'podReservedNetmask',
-          placeHolder: 'Please enter system netmask for Pod',
+          placeHolder: 'message.tooltip.reserved.system.netmask',
           required: true
         },
         {
-          title: 'label.start.reserved.system.IP',
+          title: 'label.start.reserved.system.ip',
           key: 'podReservedStartIp',
-          placeHolder: 'Please enter reserved system start ip for Pod',
+          placeHolder: 'message.installwizard.tooltip.addpod.reservedsystemstartip',
           required: true,
           ipV4: true,
           message: 'Please enter a valid IP v4 address.'
         },
         {
-          title: 'label.end.reserved.system.IP',
+          title: 'label.end.reserved.system.ip',
           key: 'podReservedStopIp',
-          placeHolder: 'Please enter reserved system stop ip for Pod',
+          placeHolder: 'message.installwizard.tooltip.addpod.reservedsystemendip',
           required: false,
           ipV4: true,
           message: 'Please enter a valid IP v4 address.'
@@ -320,19 +320,19 @@ export default {
         {
           title: 'label.guest.gateway',
           key: 'guestGateway',
-          placeHolder: 'Please enter guest gateway',
+          placeHolder: 'message.installwizard.tooltip.configureguesttraffic.guestgateway',
           required: false
         },
         {
           title: 'label.guest.netmask',
           key: 'guestNetmask',
-          placeHolder: 'Please enter guest netmask',
+          placeHolder: 'message.installwizard.tooltip.configureguesttraffic.guestnetmask',
           required: false
         },
         {
           title: 'label.guest.start.ip',
           key: 'guestStartIp',
-          placeHolder: 'Please enter start ip for guest traffic',
+          placeHolder: 'message.installwizard.tooltip.configureguesttraffic.gueststartip',
           required: false,
           ipV4: true,
           message: 'Please enter a valid IP v4 address.'
@@ -340,7 +340,7 @@ export default {
         {
           title: 'label.guest.end.ip',
           key: 'guestStopIp',
-          placeHolder: 'Please enter stop ip for guest traffic',
+          placeHolder: 'message.installwizard.tooltip.configureguesttraffic.guestendip',
           required: false,
           ipV4: true,
           message: 'Please enter a valid IP v4 address.'
diff --git a/src/views/infra/zone/ZoneWizardPhysicalNetworkSetupStep.vue b/src/views/infra/zone/ZoneWizardPhysicalNetworkSetupStep.vue
index 91510c7..f6981d9 100644
--- a/src/views/infra/zone/ZoneWizardPhysicalNetworkSetupStep.vue
+++ b/src/views/infra/zone/ZoneWizardPhysicalNetworkSetupStep.vue
@@ -60,7 +60,7 @@
           </a-tag>
         </div>
         <a-modal
-          title="Edit traffic type"
+          :title="$t('label.edit.traffic.type')"
           :visible="showEditTraffic"
           :closable="true"
           @ok="updateTrafficLabel(trafficInEdit)"
@@ -69,7 +69,7 @@
         >
           <a-form :form="form">
             <span class="ant-form-text"> Please specify the traffic label you want associated with this traffic type. </span>
-            <a-form-item v-bind="formItemLayout" style="margin-top:16px;" label="Traffic Label">
+            <a-form-item v-bind="formItemLayout" style="margin-top:16px;" :label="$t('label.traffic.label')">
               <a-input
                 v-decorator="['trafficLabel', {
                   rules: [{
diff --git a/src/views/network/AclListRulesTab.vue b/src/views/network/AclListRulesTab.vue
index 782abfd..9716ae6 100644
--- a/src/views/network/AclListRulesTab.vue
+++ b/src/views/network/AclListRulesTab.vue
@@ -91,7 +91,7 @@
       </draggable>
     </div>
 
-    <a-modal title="Edit Tags" v-model="tagsModalVisible" :footer="null">
+    <a-modal :title="$t('label.edit.tags')" v-model="tagsModalVisible" :footer="null">
       <a-spin v-if="tagsLoading"></a-spin>
 
       <div v-else>
@@ -150,15 +150,15 @@
         </a-form-item>
 
         <a-form-item v-if="ruleForm.getFieldValue('protocol') === 'protocolnumber'" :label="$t('label.protocolnumber')">
-          <a-input v-decorator="['protocolnumber' , { rules: [{ required: true, message: 'required' }]}]" />
+          <a-input v-decorator="['protocolnumber' , { rules: [{ required: true, message: `${this.$t('label.required')}` }]}]" />
         </a-form-item>
 
         <div v-if="ruleForm.getFieldValue('protocol') === 'icmp' || ruleForm.getFieldValue('protocol') === 'protocolnumber'">
           <a-form-item :label="$t('label.icmptype')">
-            <a-input v-decorator="['icmptype']" placeholder="Please specify -1 if you want to allow all ICMP types." />
+            <a-input v-decorator="['icmptype']" :placeholder="$t('icmp.type.desc')" />
           </a-form-item>
           <a-form-item :label="$t('label.icmpcode')">
-            <a-input v-decorator="['icmpcode']" placeholder="Please specify -1 if you want to allow all ICMP types." />
+            <a-input v-decorator="['icmpcode']" :placeholder="$t('icmp.code.desc')" />
           </a-form-item>
         </div>
 
@@ -181,7 +181,7 @@
           <a-textarea
             v-decorator="['reason']"
             :autosize="{ minRows: 2 }"
-            placeholder="Enter the reason behind an ACL rule" />
+            :placeholder="$t('label.acl.reason.description')" />
         </a-form-item>
       </a-form>
     </a-modal>
@@ -218,7 +218,7 @@ export default {
       ruleForm: this.$form.createForm(this),
       tagsLoading: false,
       ruleModalVisible: false,
-      ruleModalTitle: 'Edit rule',
+      ruleModalTitle: this.$t('label.edit.rule'),
       ruleFormMode: 'edit'
     }
   },
@@ -415,7 +415,7 @@ export default {
           partialupgrade: false
         }).then(response => {
           this.$store.dispatch('AddAsyncJob', {
-            title: `Edit ACL rule`,
+            title: this.$t('label.edit.acl.rule'),
             jobid: response.createnetworkaclresponse.jobid,
             status: 'progress'
           })
diff --git a/src/views/network/CreateIsolatedNetworkForm.vue b/src/views/network/CreateIsolatedNetworkForm.vue
index 912bfb3..0a21c36 100644
--- a/src/views/network/CreateIsolatedNetworkForm.vue
+++ b/src/views/network/CreateIsolatedNetworkForm.vue
@@ -43,7 +43,7 @@
                 rules: [
                   {
                     required: true,
-                    message: 'Please select option'
+                    message: `${this.$t('message.error.select')}`
                   }
                 ]
               }]"
@@ -82,7 +82,7 @@
                 rules: [
                   {
                     required: true,
-                    message: 'Please select option'
+                    message: `${this.$t('message.error.select')}`
                   }
                 ]
               }]"
@@ -112,7 +112,7 @@
                 rules: [
                   {
                     required: true,
-                    message: 'Please select option'
+                    message: `${this.$t('message.error.select')}`
                   }
                 ]
               }]"
diff --git a/src/views/network/CreateL2NetworkForm.vue b/src/views/network/CreateL2NetworkForm.vue
index 46f9dcb..a5abcb9 100644
--- a/src/views/network/CreateL2NetworkForm.vue
+++ b/src/views/network/CreateL2NetworkForm.vue
@@ -43,7 +43,7 @@
                 rules: [
                   {
                     required: true,
-                    message: 'Please select option'
+                    message: `${this.$t('message.error.select')}`
                   }
                 ]
               }]"
@@ -82,7 +82,7 @@
                 rules: [
                   {
                     required: true,
-                    message: 'Please select option'
+                    message: `${this.$t('message.error.select')}`
                   }
                 ]
               }]"
diff --git a/src/views/network/CreateSharedNetworkForm.vue b/src/views/network/CreateSharedNetworkForm.vue
index 76c2d84..558ebbb 100644
--- a/src/views/network/CreateSharedNetworkForm.vue
+++ b/src/views/network/CreateSharedNetworkForm.vue
@@ -43,7 +43,7 @@
                 rules: [
                   {
                     required: true,
-                    message: 'Please select option'
+                    message: `${this.$t('message.error.select')}`
                   }
                 ]
               }]"
@@ -139,7 +139,7 @@
                 rules: [
                   {
                     required: true,
-                    message: 'Please select option'
+                    message: `${this.$t('message.error.select')}`
                   }
                 ]
               }]"
@@ -170,7 +170,7 @@
                 rules: [
                   {
                     required: true,
-                    message: 'Please select option'
+                    message: `${this.$t('message.error.select')}`
                   }
                 ]
               }]"
@@ -193,7 +193,7 @@
                 rules: [
                   {
                     required: true,
-                    message: 'Please select option'
+                    message: `${this.$t('message.error.select')}`
                   }
                 ]
               }]"
diff --git a/src/views/network/CreateVpnCustomerGateway.vue b/src/views/network/CreateVpnCustomerGateway.vue
index 135ebce..12a7bea 100644
--- a/src/views/network/CreateVpnCustomerGateway.vue
+++ b/src/views/network/CreateVpnCustomerGateway.vue
@@ -22,7 +22,7 @@
           v-decorator="[
             'name',
             {
-              rules: [{ required: true, message: 'required' }],
+              rules: [{ required: true, message: `${this.$t('label.required')}` }],
             }
           ]"
           :placeholder="$t('label.vpncustomergatewayname')" />
@@ -32,7 +32,7 @@
           v-decorator="[
             'gateway',
             {
-              rules: [{ required: true, message: 'required'}],
+              rules: [{ required: true, message: `${this.$t('label.required')}`}],
             }
           ]"
           :placeholder="$t('label.vpncustomergateway')" />
@@ -42,7 +42,7 @@
           v-decorator="[
             'cidrlist',
             {
-              rules: [{ required: true, message: 'required'}],
+              rules: [{ required: true, message: `${this.$t('label.required')}`}],
             }
           ]"
           :placeholder="$t('label.vpncustomergateway.cidrlist')" />
@@ -53,7 +53,7 @@
           v-decorator="[
             'ipsecpsk',
             {
-              rules: [{ required: true, message: 'required'}],
+              rules: [{ required: true, message: `${this.$t('label.required')}`}],
             }
           ]"
           :placeholder="$t('label.vpncustomergateway.secretkey')" />
diff --git a/src/views/network/EnableStaticNat.vue b/src/views/network/EnableStaticNat.vue
index bf01d16..3a7c35f 100644
--- a/src/views/network/EnableStaticNat.vue
+++ b/src/views/network/EnableStaticNat.vue
@@ -28,7 +28,7 @@
 
       <div class="list__header__col list__header__col--full">
         <a-input-search
-          placeholder="Search"
+          :placeholder="$t('label.search')"
           v-model="searchQuery"
           @search="fetchData" />
       </div>
diff --git a/src/views/network/FirewallRules.vue b/src/views/network/FirewallRules.vue
index 04f1aeb..5d202dd 100644
--- a/src/views/network/FirewallRules.vue
+++ b/src/views/network/FirewallRules.vue
@@ -91,7 +91,7 @@
       @showSizeChange="handleChangePageSize"
       showSizeChanger/>
 
-    <a-modal title="Edit Tags" v-model="tagsModalVisible" :footer="null" :afterClose="closeModal">
+    <a-modal :title="$t('label.edit.tags')" v-model="tagsModalVisible" :footer="null" :afterClose="closeModal">
       <div class="add-tags">
         <div class="add-tags__input">
           <p class="add-tags__label">{{ $t('label.key') }}</p>
diff --git a/src/views/network/IngressEgressRuleConfigure.vue b/src/views/network/IngressEgressRuleConfigure.vue
index 963761c..54c7063 100644
--- a/src/views/network/IngressEgressRuleConfigure.vue
+++ b/src/views/network/IngressEgressRuleConfigure.vue
@@ -97,7 +97,7 @@
       </template>
     </a-table>
 
-    <a-modal title="Edit Tags" v-model="tagsModalVisible" :footer="null" :afterClose="closeModal">
+    <a-modal :title="$t('label.edit.tags')" v-model="tagsModalVisible" :footer="null" :afterClose="closeModal">
       <a-spin v-if="tagsLoading"></a-spin>
 
       <div v-else>
diff --git a/src/views/network/InternalLBAssignVmForm.vue b/src/views/network/InternalLBAssignVmForm.vue
index f84fe60..1d891e9 100644
--- a/src/views/network/InternalLBAssignVmForm.vue
+++ b/src/views/network/InternalLBAssignVmForm.vue
@@ -124,7 +124,11 @@ export default {
       api('listLoadBalancers', {
         id: this.resource.id
       }).then(response => {
-        this.assignedVMs = response.listloadbalancersresponse.loadbalancer[0].loadbalancerinstance || []
+        const lb = response.listloadbalancersresponse.loadbalancer
+        this.assignedVMs = []
+        if (Array.isArray(lb) && lb.length) {
+          this.assignedVMs = lb[0].loadbalancerinstance || []
+        }
       }).finally(() => {
         this.fetchLoading = false
       })
diff --git a/src/views/network/LoadBalancing.vue b/src/views/network/LoadBalancing.vue
index 330f263..4ee5862 100644
--- a/src/views/network/LoadBalancing.vue
+++ b/src/views/network/LoadBalancing.vue
@@ -131,7 +131,7 @@
       @showSizeChange="handleChangePageSize"
       showSizeChanger/>
 
-    <a-modal title="Edit Tags" v-model="tagsModalVisible" :footer="null" :afterClose="closeModal" class="tags-modal">
+    <a-modal :title="$t('label.edit.tags')" v-model="tagsModalVisible" :footer="null" :afterClose="closeModal" class="tags-modal">
       <span v-show="tagsModalLoading" class="modal-loading">
         <a-icon type="loading"></a-icon>
       </span>
@@ -166,7 +166,7 @@
     </a-modal>
 
     <a-modal
-      title="Configure Sticky Policy"
+      :title="$t('label.configure.sticky.policy')"
       v-model="stickinessModalVisible"
       :footer="null"
       :afterClose="closeModal"
@@ -177,7 +177,7 @@
       </span>
 
       <a-form :form="stickinessPolicyForm" @submit="handleSubmitStickinessForm" class="custom-ant-form">
-        <a-form-item label="Stickiness method">
+        <a-form-item :label="$t('label.stickiness.method')">
           <a-select v-decorator="['methodname']" @change="handleStickinessMethodSelectChange">
             <a-select-option value="LbCookie">LbCookie</a-select-option>
             <a-select-option value="AppCookie">AppCookie</a-select-option>
@@ -186,58 +186,58 @@
           </a-select>
         </a-form-item>
         <a-form-item
-          label="Sticky Name"
+          :label="$t('label.sticky.name')"
           v-show="stickinessPolicyMethod === 'LbCookie' || stickinessPolicyMethod ===
             'AppCookie' || stickinessPolicyMethod === 'SourceBased'">
           <a-input v-decorator="['name', { rules: [{ required: true, message: 'Please specify a sticky name'}] }]" />
         </a-form-item>
         <a-form-item
-          label="Cookie name"
+          :label="$t('label.sticky.cookie-name')"
           v-show="stickinessPolicyMethod === 'LbCookie' || stickinessPolicyMethod ===
             'AppCookie'">
           <a-input v-decorator="['cookieName']" />
         </a-form-item>
         <a-form-item
-          label="Mode"
+          :label="$t('label.sticky.mode')"
           v-show="stickinessPolicyMethod === 'LbCookie' || stickinessPolicyMethod ===
             'AppCookie'">
           <a-input v-decorator="['mode']" />
         </a-form-item>
-        <a-form-item label="No cache" v-show="stickinessPolicyMethod === 'LbCookie'">
+        <a-form-item :label="$t('label.sticky.nocache')" v-show="stickinessPolicyMethod === 'LbCookie'">
           <a-checkbox v-decorator="['nocache']" v-model="stickinessNoCache"></a-checkbox>
         </a-form-item>
-        <a-form-item label="Indirect" v-show="stickinessPolicyMethod === 'LbCookie'">
+        <a-form-item :label="$t('label.sticky.indirect')" v-show="stickinessPolicyMethod === 'LbCookie'">
           <a-checkbox v-decorator="['indirect']" v-model="stickinessIndirect"></a-checkbox>
         </a-form-item>
-        <a-form-item label="Post only" v-show="stickinessPolicyMethod === 'LbCookie'">
+        <a-form-item :label="$t('label.sticky.postonly')" v-show="stickinessPolicyMethod === 'LbCookie'">
           <a-checkbox v-decorator="['postonly']" v-model="stickinessPostOnly"></a-checkbox>
         </a-form-item>
-        <a-form-item label="Domain" v-show="stickinessPolicyMethod === 'LbCookie'">
+        <a-form-item :label="$t('label.domain')" v-show="stickinessPolicyMethod === 'LbCookie'">
           <a-input v-decorator="['domain']" />
         </a-form-item>
-        <a-form-item label="Length" v-show="stickinessPolicyMethod === 'AppCookie'">
+        <a-form-item :label="$t('label.sticky.length')" v-show="stickinessPolicyMethod === 'AppCookie'">
           <a-input v-decorator="['length']" type="number" />
         </a-form-item>
-        <a-form-item label="Hold time" v-show="stickinessPolicyMethod === 'AppCookie'">
+        <a-form-item :label="$t('label.sticky.holdtime')" v-show="stickinessPolicyMethod === 'AppCookie'">
           <a-input v-decorator="['holdtime']" type="number" />
         </a-form-item>
-        <a-form-item label="Request learn" v-show="stickinessPolicyMethod === 'AppCookie'">
+        <a-form-item :label="$t('label.sticky.request-learn')" v-show="stickinessPolicyMethod === 'AppCookie'">
           <a-checkbox v-decorator="['requestLearn']" v-model="stickinessRequestLearn"></a-checkbox>
         </a-form-item>
-        <a-form-item label="Prefix" v-show="stickinessPolicyMethod === 'AppCookie'">
+        <a-form-item :label="$t('label.sticky.prefix')" v-show="stickinessPolicyMethod === 'AppCookie'">
           <a-checkbox v-decorator="['prefix']" v-model="stickinessPrefix"></a-checkbox>
         </a-form-item>
-        <a-form-item label="Table size" v-show="stickinessPolicyMethod === 'SourceBased'">
+        <a-form-item :label="$t('label.sticky.tablesize')" v-show="stickinessPolicyMethod === 'SourceBased'">
           <a-input v-decorator="['tablesize']" />
         </a-form-item>
-        <a-form-item label="Expires" v-show="stickinessPolicyMethod === 'SourceBased'">
+        <a-form-item :label="$t('label.sticky.expire')" v-show="stickinessPolicyMethod === 'SourceBased'">
           <a-input v-decorator="['expire']" />
         </a-form-item>
         <a-button type="primary" html-type="submit">OK</a-button>
       </a-form>
     </a-modal>
 
-    <a-modal title="Edit rule" v-model="editRuleModalVisible" :afterClose="closeModal" @ok="handleSubmitEditForm">
+    <a-modal :title="$t('label.edit.rule')" v-model="editRuleModalVisible" :afterClose="closeModal" @ok="handleSubmitEditForm">
       <span v-show="editRuleModalLoading" class="modal-loading">
         <a-icon type="loading"></a-icon>
       </span>
diff --git a/src/views/network/VpcTab.vue b/src/views/network/VpcTab.vue
index 6bb049a..4672c90 100644
--- a/src/views/network/VpcTab.vue
+++ b/src/views/network/VpcTab.vue
@@ -28,10 +28,10 @@
       <a-tab-pane :tab="$t('label.networks')" key="tier">
         <VpcTiersTab :resource="resource" :loading="loading" />
       </a-tab-pane>
-      <a-tab-pane tab="Public IP Addresses" key="ip" v-if="'listPublicIpAddresses' in $store.getters.apis">
+      <a-tab-pane :tab="$t('label.public.ips')" key="ip" v-if="'listPublicIpAddresses' in $store.getters.apis">
         <IpAddressesTab :resource="resource" :loading="loading" />
       </a-tab-pane>
-      <a-tab-pane tab="Network ACL Lists" key="acl" v-if="'listNetworkACLLists' in $store.getters.apis">
+      <a-tab-pane :tab="$t('label.network.acl.lists')" key="acl" v-if="'listNetworkACLLists' in $store.getters.apis">
         <a-button
           type="dashed"
           icon="plus"
@@ -70,15 +70,15 @@
           @ok="handleNetworkAclFormSubmit">
           <a-form @submit.prevent="handleNetworkAclFormSubmit" :form="networkAclForm">
             <a-form-item :label="$t('label.add.list.name')">
-              <a-input v-decorator="['name', {rules: [{ required: true, message: 'Required' }]}]"></a-input>
+              <a-input v-decorator="['name', {rules: [{ required: true, message: `${this.$t('label.required')}` }]}]"></a-input>
             </a-form-item>
             <a-form-item :label="$t('label.description')">
-              <a-input v-decorator="['description', {rules: [{ required: true, message: 'Required' }]}]"></a-input>
+              <a-input v-decorator="['description', {rules: [{ required: true, message: `${this.$t('label.required')}` }]}]"></a-input>
             </a-form-item>
           </a-form>
         </a-modal>
       </a-tab-pane>
-      <a-tab-pane tab="Private Gateways" key="pgw" v-if="'listPrivateGateways' in $store.getters.apis">
+      <a-tab-pane :tab="$t('label.private.gateway')" key="pgw" v-if="'listPrivateGateways' in $store.getters.apis">
         <a-button
           type="dashed"
           icon="plus"
@@ -125,25 +125,25 @@
               <a-form-item :label="$t('label.vlan')" :required="true">
                 <a-input
                   :placeholder="placeholders.vlan"
-                  v-decorator="['vlan', {rules: [{ required: true, message: 'Required' }]}]"
+                  v-decorator="['vlan', {rules: [{ required: true, message: `${this.$t('label.required')}` }]}]"
                 ></a-input>
               </a-form-item>
               <a-form-item :label="$t('label.publicip')" :required="true">
                 <a-input
                   :placeholder="placeholders.ipaddress"
-                  v-decorator="['ipaddress', {rules: [{ required: true, message: 'Required' }]}]"
+                  v-decorator="['ipaddress', {rules: [{ required: true, message: `${this.$t('label.required')}` }]}]"
                 ></a-input>
               </a-form-item>
               <a-form-item :label="$t('label.gateway')" :required="true">
                 <a-input
                   :placeholder="placeholders.gateway"
-                  v-decorator="['gateway', {rules: [{ required: true, message: 'Required' }]}]"
+                  v-decorator="['gateway', {rules: [{ required: true, message: `${this.$t('label.required')}` }]}]"
                 ></a-input>
               </a-form-item>
               <a-form-item :label="$t('label.netmask')" :required="true">
                 <a-input
                   :placeholder="placeholders.netmask"
-                  v-decorator="['netmask', {rules: [{ required: true, message: 'Required' }]}]"
+                  v-decorator="['netmask', {rules: [{ required: true, message: `${this.$t('label.required')}` }]}]"
                 ></a-input>
               </a-form-item>
               <a-form-item :label="$t('label.sourcenat')">
@@ -160,7 +160,7 @@
           </a-spin>
         </a-modal>
       </a-tab-pane>
-      <a-tab-pane tab="VPN Gateway" key="vpngw" v-if="'listVpnGateways' in $store.getters.apis">
+      <a-tab-pane :tab="$t('label.vpn.gateway')" key="vpngw" v-if="'listVpnGateways' in $store.getters.apis">
         <a-button
           v-if="vpnGateways.length === 0"
           type="dashed"
@@ -184,7 +184,7 @@
           </a-list-item>
         </a-list>
       </a-tab-pane>
-      <a-tab-pane tab="VPN Connections" key="vpnc" v-if="'listVpnConnections' in $store.getters.apis">
+      <a-tab-pane :tab="$t('label.vpn.connection')" key="vpnc" v-if="'listVpnConnections' in $store.getters.apis">
         <a-button
           type="dashed"
           icon="plus"
@@ -236,7 +236,7 @@
           </a-spin>
         </a-modal>
       </a-tab-pane>
-      <a-tab-pane tab="Virtual Routers" key="vr" v-if="'listRouters' in $store.getters.apis">
+      <a-tab-pane :tab="$t('label.virtual.routers')" key="vr" v-if="'listRouters' in $store.getters.apis">
         <RoutersTab :resource="resource" :loading="loading" />
       </a-tab-pane>
     </a-tabs>
diff --git a/src/views/network/VpcTiersTab.vue b/src/views/network/VpcTiersTab.vue
index 81694f9..3e00443 100644
--- a/src/views/network/VpcTiersTab.vue
+++ b/src/views/network/VpcTiersTab.vue
@@ -134,11 +134,11 @@
           <a-form-item :label="$t('label.name')">
             <a-input
               placeholder="A unique name of the tier"
-              v-decorator="['name',{rules: [{ required: true, message: 'Required' }]}]"></a-input>
+              v-decorator="['name',{rules: [{ required: true, message: `${this.$t('label.required')}` }]}]"></a-input>
           </a-form-item>
           <a-form-item :label="$t('label.networkofferingid')">
             <a-select
-              v-decorator="['networkOffering',{rules: [{ required: true, message: 'Required' }]}]">
+              v-decorator="['networkOffering',{rules: [{ required: true, message: `${this.$t('label.required')}` }]}]">
               <a-select-option v-for="item in networkOfferings" :key="item.id" :value="item.id">
                 {{ item.name }}
               </a-select-option>
@@ -147,12 +147,12 @@
           <a-form-item :label="$t('label.gateway')">
             <a-input
               placeholder="The gateway of the tier in the super CIDR range and not overlapping the CIDR of any other tier in this VPC."
-              v-decorator="['gateway',{rules: [{ required: true, message: 'Required' }]}]"></a-input>
+              v-decorator="['gateway',{rules: [{ required: true, message: `${this.$t('label.required')}` }]}]"></a-input>
           </a-form-item>
           <a-form-item :label="$t('label.netmask')">
             <a-input
               placeholder="Netmask of the tier. For example, with VPC CIDR of 10.0.0.0/16 and network tier CIDR of 10.1.1.0/24, gateway is 10.1.1.1 and netmask is 255.255.255.0"
-              v-decorator="['netmask',{rules: [{ required: true, message: 'Required' }]}]"></a-input>
+              v-decorator="['netmask',{rules: [{ required: true, message: `${this.$t('label.required')}` }]}]"></a-input>
           </a-form-item>
           <a-form-item :label="$t('label.externalid')">
             <a-input
@@ -201,7 +201,7 @@
                 'algorithm',
                 {
                   initialValue: 'Source',
-                  rules: [{ required: true, message: 'required'}]
+                  rules: [{ required: true, message: `${this.$t('label.required')}`}]
                 }]">
               <a-select-option v-for="(key, idx) in Object.keys(algorithms)" :key="idx" :value="algorithms[key]">
                 {{ key }}
diff --git a/src/views/offering/AddNetworkOffering.vue b/src/views/offering/AddNetworkOffering.vue
index 4003116..4abbd2e 100644
--- a/src/views/offering/AddNetworkOffering.vue
+++ b/src/views/offering/AddNetworkOffering.vue
@@ -170,7 +170,7 @@
               rules: [
                 {
                   required: true,
-                  message: 'Please select option'
+                  message: `${this.$t('message.error.select')}`
                 }
               ],
               initialValue: 0
@@ -313,7 +313,7 @@
               rules: [
                 {
                   required: true,
-                  message: 'Please select option'
+                  message: `${this.$t('message.error.select')}`
                 }
               ]
             }]"
diff --git a/src/views/offering/AddVpcOffering.vue b/src/views/offering/AddVpcOffering.vue
index 42eacc5..ce47f2c 100644
--- a/src/views/offering/AddVpcOffering.vue
+++ b/src/views/offering/AddVpcOffering.vue
@@ -71,7 +71,7 @@
               rules: [
                 {
                   required: true,
-                  message: 'Please select option'
+                  message: `${this.$t('message.error.select')}`
                 }
               ]
             }]"
diff --git a/src/views/offering/ImportBackupOffering.vue b/src/views/offering/ImportBackupOffering.vue
index f25fcdd..cd84563 100644
--- a/src/views/offering/ImportBackupOffering.vue
+++ b/src/views/offering/ImportBackupOffering.vue
@@ -38,7 +38,7 @@
           showSearch
           allowClear
           v-decorator="['zoneid', {
-            rules: [{ required: true, message: 'Please select option' }]
+            rules: [{ required: true, message: `${this.$t('message.error.select')}` }]
           }]"
           :loading="zones.loading"
           @change="onChangeZone">
diff --git a/src/views/offering/UpdateOfferingAccess.vue b/src/views/offering/UpdateOfferingAccess.vue
index 7f3c436..e384bf8 100644
--- a/src/views/offering/UpdateOfferingAccess.vue
+++ b/src/views/offering/UpdateOfferingAccess.vue
@@ -34,7 +34,7 @@
               rules: [
                 {
                   required: true,
-                  message: 'Please select option'
+                  message: `${this.$t('message.error.select')}`
                 }
               ],
               initialValue: this.selectedDomains
diff --git a/src/views/project/InvitationTokenTemplate.vue b/src/views/project/InvitationTokenTemplate.vue
index bffc998..2c7fb26 100644
--- a/src/views/project/InvitationTokenTemplate.vue
+++ b/src/views/project/InvitationTokenTemplate.vue
@@ -25,7 +25,7 @@
         <a-form-item :label="$t('label.projectid')">
           <a-input
             v-decorator="['projectid', {
-              rules: [{ required: true, message: 'Please enter input' }]
+              rules: [{ required: true, message: `${this.$t('message.error.required.input')}` }]
             }]"
             :placeholder="apiParams.projectid.description"
           />
@@ -33,7 +33,7 @@
         <a-form-item :label="$t('label.token')">
           <a-input
             v-decorator="['token', {
-              rules: [{ required: true, message: 'Please enter input' }]
+              rules: [{ required: true, message: `${this.$t('message.error.required.input')}` }]
             }]"
             :placeholder="apiParams.token.description"
           />
diff --git a/src/views/project/InvitationsTemplate.vue b/src/views/project/InvitationsTemplate.vue
index 6fc6335..7d9eb18 100644
--- a/src/views/project/InvitationsTemplate.vue
+++ b/src/views/project/InvitationsTemplate.vue
@@ -22,7 +22,7 @@
         <a-input-search
           class="input-search-invitation"
           style="width: unset"
-          placeholder="Search"
+          :placeholder="$t('label.search')"
           v-model="searchQuery"
           @search="onSearch" />
       </a-col>
diff --git a/src/views/storage/FormSchedule.vue b/src/views/storage/FormSchedule.vue
index f8f7cd3..8d5233b 100644
--- a/src/views/storage/FormSchedule.vue
+++ b/src/views/storage/FormSchedule.vue
@@ -58,7 +58,7 @@
                   <a-input-number
                     style="width: 100%"
                     v-decorator="['time', {
-                      rules: [{required: true, message: 'Please enter input'}]
+                      rules: [{required: true, message: `${this.$t('message.error.required.input')}`}]
                     }]"
                     :min="1"
                     :max="59"/>
@@ -87,7 +87,7 @@
                   v-decorator="['day-of-week', {
                     rules: [{
                       required: true,
-                      message: 'Please select option'
+                      message: `${this.$t('message.error.select')}`
                     }]
                   }]" >
                   <a-select-option v-for="(opt, optIndex) in dayOfWeek" :key="optIndex">
@@ -102,7 +102,7 @@
                   v-decorator="['day-of-month', {
                     rules: [{
                       required: true,
-                      message: 'Please select option'
+                      message: `${this.$t('message.error.select')}`
                     }]
                   }]">
                   <a-select-option v-for="opt in dayOfMonth" :key="opt.name">
@@ -133,7 +133,7 @@
                   v-decorator="['timezone', {
                     rules: [{
                       required: true,
-                      message: 'Please select option'
+                      message: `${this.$t('message.error.select')}`
                     }]
                   }]"
                   :loading="fetching">
diff --git a/src/views/storage/MigrateVolume.vue b/src/views/storage/MigrateVolume.vue
index aa61e4f..bdebf8e 100644
--- a/src/views/storage/MigrateVolume.vue
+++ b/src/views/storage/MigrateVolume.vue
@@ -89,7 +89,9 @@ export default {
           id: this.resource.id
         }).then(response => {
           this.storagePools = response.findstoragepoolsformigrationresponse.storagepool || []
-          this.selectedStoragePool = this.storagePools[0].id || ''
+          if (Array.isArray(this.storagePools) && this.storagePools.length) {
+            this.selectedStoragePool = this.storagePools[0].id || ''
+          }
         }).catch(error => {
           this.$notifyError(error)
           this.closeModal()
@@ -99,7 +101,9 @@ export default {
           zoneid: this.resource.zoneid
         }).then(response => {
           this.storagePools = response.liststoragepoolsresponse.storagepool || []
-          this.selectedStoragePool = this.storagePools[0].id || ''
+          if (Array.isArray(this.storagePools) && this.storagePools.length) {
+            this.selectedStoragePool = this.storagePools[0].id || ''
+          }
         }).catch(error => {
           this.$notifyError(error)
           this.closeModal()
diff --git a/src/views/storage/ResizeVolume.vue b/src/views/storage/ResizeVolume.vue
index 369797b..1b4b8d7 100644
--- a/src/views/storage/ResizeVolume.vue
+++ b/src/views/storage/ResizeVolume.vue
@@ -22,7 +22,7 @@
         <a-select
           v-decorator="['diskofferingid', {
             initialValue: selectedDiskOfferingId,
-            rules: [{ required: true, message: 'Please select an option' }]}]"
+            rules: [{ required: true, message: `${this.$t('message.error.select')}` }]}]"
           :loading="loading"
           :placeholder="$t('label.diskoffering')"
           @change="id => (customDiskOffering = offerings.filter(x => x.id === id)[0].iscustomized || false)"
diff --git a/src/views/storage/RestoreAttachBackupVolume.vue b/src/views/storage/RestoreAttachBackupVolume.vue
index 9db6f87..11a42fc 100644
--- a/src/views/storage/RestoreAttachBackupVolume.vue
+++ b/src/views/storage/RestoreAttachBackupVolume.vue
@@ -22,7 +22,7 @@
         <a-select
           allowClear
           v-decorator="['volumeid', {
-            rules: [{ required: true, message: 'Please select option' }]
+            rules: [{ required: true, message: `${this.$t('message.error.select')}` }]
           }]"
           :loading="volumeOptions.loading">
           <a-select-option
@@ -37,7 +37,7 @@
           showSearch
           allowClear
           v-decorator="['virtualmachineid', {
-            rules: [{ required: true, message: 'Please select option' }]
+            rules: [{ required: true, message: `${this.$t('message.error.select')}` }]
           }]"
           :loading="virtualMachineOptions.loading">
           <a-select-option
diff --git a/src/views/storage/UploadLocalVolume.vue b/src/views/storage/UploadLocalVolume.vue
index b464f2d..48e8f0d 100644
--- a/src/views/storage/UploadLocalVolume.vue
+++ b/src/views/storage/UploadLocalVolume.vue
@@ -34,7 +34,7 @@
             :remove="handleRemove"
             :beforeUpload="beforeUpload"
             v-decorator="['file', {
-              rules: [{ required: true, message: 'Please enter input' }]
+              rules: [{ required: true, message: `${this.$t('message.error.required.input')}`}]
             }]">
             <p class="ant-upload-drag-icon">
               <a-icon type="cloud-upload" />
@@ -58,7 +58,7 @@
               rules: [
                 {
                   required: true,
-                  message: 'Please select option'
+                  message: `${this.$t('message.error.select')}`
                 }
               ]
             }]">
@@ -74,7 +74,7 @@
               rules: [
                 {
                   required: false,
-                  message: 'Please select option'
+                  message: `${this.$t('message.error.select')}`
                 }
               ]
             }]">