diff --git a/package.json b/package.json
index 2e45ebbc2..8f79b2401 100644
--- a/package.json
+++ b/package.json
@@ -117,8 +117,9 @@
},
"scripts": {
"benchmarks": "./tools/run-benchmarks.js 'src/**/*.bench.js'",
- "build": "NODE_ENV=production gulp build",
- "dev": "gulp build server",
+ "build": "npm run build-indexes && NODE_ENV=production gulp build",
+ "build-indexes": "./tools/generate-index src/common/intl/locales",
+ "dev": "npm run build-indexes && gulp build server",
"dev-test": "ava --watch",
"lint": "standard",
"posttest": "npm run lint",
diff --git a/src/common/action-bar.js b/src/common/action-bar.js
index 056cb1c60..65a4128a9 100644
--- a/src/common/action-bar.js
+++ b/src/common/action-bar.js
@@ -1,4 +1,4 @@
-// import _ from 'messages' TODO: fix tooltip
+// import _ from 'intl' TODO: fix tooltip
import ActionButton from 'action-button'
import map from 'lodash/map'
import React from 'react'
diff --git a/src/common/editable.js b/src/common/editable.js
index c2149e596..af3477371 100644
--- a/src/common/editable.js
+++ b/src/common/editable.js
@@ -5,7 +5,7 @@ import map from 'lodash/map'
import pick from 'lodash/pick'
import React from 'react'
-import _ from './messages'
+import _ from './intl'
import Component from './base-component'
import logError from './log-error'
import Icon from './icon'
diff --git a/src/common/intl/index.js b/src/common/intl/index.js
new file mode 100644
index 000000000..63ad80da4
--- /dev/null
+++ b/src/common/intl/index.js
@@ -0,0 +1,81 @@
+
+import isFunction from 'lodash/isFunction'
+import isString from 'lodash/isString'
+import moment from 'moment'
+import React, {
+ Component,
+ PropTypes
+} from 'react'
+import {
+ connect
+} from 'react-redux'
+import {
+ FormattedMessage,
+ IntlProvider as IntlProvider_
+} from 'react-intl'
+
+import messages from './messages'
+import locales from './locales'
+
+// ===================================================================
+
+// Params:
+//
+// - props (optional): properties to add to the FormattedMessage
+// - messageId: identifier of the message to format/translate
+// - values (optional): values to pass to the message
+// - render (optional): a function receiving the React nodes of the
+// translated message and returning the React node to render
+const getMessage = (props, messageId, values, render) => {
+ if (isString(props)) {
+ render = values
+ values = messageId
+ messageId = props
+ props = undefined
+ }
+
+ const message = messages[messageId]
+ if (process.env.NODE_ENV !== 'production' && !message) {
+ throw new Error(`no message defined for ${messageId}`)
+ }
+
+ if (isFunction(values)) {
+ render = values
+ values = undefined
+ }
+
+ return
+ {render}
+
+}
+
+export { getMessage as default }
+
+@connect(({ lang }) => ({ lang }))
+export class IntlProvider extends Component {
+ static propTypes = {
+ children: PropTypes.node.isRequired,
+ lang: PropTypes.string.isRequired
+ };
+
+ render () {
+ const { lang, children } = this.props
+ return
+ {children}
+
+ }
+}
+
+@connect(({ lang }) => ({ lang }))
+export class FormattedDuration extends Component {
+ render () {
+ const {
+ duration,
+ lang
+ } = this.props
+ return {moment.duration(duration).locale(lang).humanize()}
+ }
+}
diff --git a/src/common/intl/locales/.gitignore b/src/common/intl/locales/.gitignore
new file mode 100644
index 000000000..652bb1b1e
--- /dev/null
+++ b/src/common/intl/locales/.gitignore
@@ -0,0 +1 @@
+/index.js
diff --git a/src/common/intl/locales/fr.js b/src/common/intl/locales/fr.js
new file mode 100644
index 000000000..988aa60f5
--- /dev/null
+++ b/src/common/intl/locales/fr.js
@@ -0,0 +1,417 @@
+// See http://momentjs.com/docs/#/use-it/browserify/
+import 'moment/locale/fr'
+
+import reactIntlData from 'react-intl/locale-data/fr'
+import { addLocaleData } from 'react-intl'
+addLocaleData(reactIntlData)
+
+// ===================================================================
+
+export default {
+ ok: 'OK',
+ cancel: 'Annuler',
+ editableLongClickPlaceholder: 'Clic long pour éditer',
+ editableClickPlaceholder: 'Cliquer pour éditer',
+ // ----- General Menu -----
+ dashboardPage: 'Tableau de bord',
+ overviewDashboardPage: 'Vue d\'ensemble',
+ overviewVisualizationDashboardPage: 'Visualisations',
+ overviewStatsDashboardPage: 'Statistiques',
+ overviewHealthDashboardPage: 'État de santé',
+ selfServicePage: 'Self service',
+ selfServiceDashboardPage: 'Tableau de bord',
+ settingsServersPage: 'Serveurs',
+ settingsUsersPage: 'Utilisateurs',
+ settingsGroupsPage: 'Groupes',
+ settingsAclsPage: 'ACLs',
+ settingsPluginsPage: 'Extensions',
+ selfServiceAdminPage: 'Administration',
+ backupPage: 'Sauvegarde',
+ backupOverviewPage: 'Vue d\'ensemble',
+ backupNewPage: 'Créer',
+ backupRemotesPage: 'Emplacement',
+ backupRestorePage: 'Restaurer',
+ updatePage: 'Mises à jour',
+ settingsPage: 'Paramètres',
+ aboutPage: 'À propos',
+ newMenu: 'Nouveau',
+ newVmPage: 'VM',
+ newServerPage: 'Serveur',
+ newSrPage: 'Stockage',
+ newImport: 'Importer',
+ // ----- Home view -----
+ homeDisplayedVms: '{displayed}x {vmIcon} (sur {total})',
+ homeSelectedVms: '{selected}x {vmIcon} sélectionnée{selected, plural, zero {} one {} other {s}} (sur {total})',
+ homeMigrateTo: 'Migrer sur…',
+ // ----- General Stuff -----
+ homePage: 'Accueil',
+ usernameLabel: 'Nom :',
+ passwordLabel: 'Mot de passe :',
+ signInButton: 'Connexion',
+ signOut: 'Déconnexion',
+ add: 'Ajouter',
+ remove: 'Supprimer',
+ schedule: 'Plan',
+ newVmBackup: 'Nouvelle sauvegarde de VM',
+ editVmBackup: 'Edition d\'un job de backup',
+ backup: 'Sauvegarde',
+ rollingSnapshot: 'Sauvegarde continue',
+ deltaBackup: 'Sauvegarde différentielle',
+ disasterRecovery: 'Reprise après panne',
+ continuousReplication: 'Réplication continue',
+ preview: 'Aperçu',
+ item: 'Objet',
+ noSelectedValue: 'Pas de valeur sélectionnée',
+ selectSubjects: 'Select. utilisateurs et/ou groupe(s)',
+ selectHosts: 'Selectionner Hôte(s)…',
+ selectNetworks: 'Selectionner Network(s)…',
+ selectPifs: 'Sélectionner PIF(s)…',
+ selectHostsVms: 'Selectionner objet(s)…',
+ selectPools: 'Selectionner Pool(s)…',
+ selectRemotes: 'Selectionner Remote(s)…',
+ selectSrs: 'Selectionner Stockages(s)…',
+ selectVms: 'Selectionner VM(s)…',
+ selectVmTemplates: 'Selectionner patrons de VM…',
+ selectTags: 'Selectionner tag(s)…',
+ selectVdis: 'Selectionner disque(s)…',
+ fillRequiredInformations: 'Remplir les champs requis.',
+ fillOptionalInformations: 'Remplir informations (optionnel)',
+ selectTableReset: 'Réinitialiser',
+ schedulingMonth: 'Mois',
+ schedulingEveryMonth: 'Tous les mois',
+ schedulingEachSelectedMonth: 'Chaque mois sélectionné',
+ schedulingMonthDay: 'Jour du mois',
+ schedulingEveryMonthDay: 'Tous les jours',
+ schedulingEachSelectedMonthDay: 'Chaque jour sélectionné',
+ schedulingWeekDay: 'Jour de la semaine',
+ schedulingEveryWeekDay: 'Tous les jours',
+ schedulingEachSelectedWeekDay: 'Chaque jour sélectionné',
+ schedulingHour: 'Heure',
+ schedulingEveryHour: 'Toutes les heures',
+ schedulingEveryNHour: 'Toutes les N heures',
+ schedulingEachSelectedHour: 'Chaque heure sélectionnée',
+ schedulingMinute: 'Minute',
+ schedulingEveryMinute: 'Toutes les minutes',
+ schedulingEveryNMinute: 'Toutes les N minutes',
+ schedulingEachSelectedMinute: 'Chaque minute sélectionnée',
+ schedulingReset: 'Reset',
+ unknownSchedule: 'Inconnu',
+ job: 'Job',
+ jobTag: 'Tag',
+ jobScheduling: 'Plan d\'exécution',
+ jobState: 'Etat',
+ runJob: 'Execution d\'un job',
+ runJobVerbose: 'Une exécution a été lancée. Voir l\'overview pour plus de détails.',
+ jobStarted: 'Démarré',
+ jobFinished: 'Terminé',
+ saveBackupJob: 'Sauvegarder',
+ deleteJob: 'Supprimer Job',
+ deleteJobQuestion: 'Etes-vous sûr de vouloir supprimer ce job ?',
+ noScheduledJobs: 'Aucun job programmé.',
+ newBackupSelection: 'Sélectionner votre type de sauvegarde :',
+ autoloadPlugin: 'Charger au démarrage du serveur',
+ savePluginConfiguration: 'Sauvegarder config.',
+ deletePluginConfiguration: 'Supprimer config.',
+ pluginError: 'Erreur plugin',
+ unknownPluginError: 'Erreur inconnue',
+ purgePluginConfiguration: 'Suppression de la config. du plugin',
+ purgePluginConfigurationQuestion: 'Etes-vous sûr de vouloir supprimer la configuration de ce plugin ?',
+ editPluginConfiguration: 'Editer',
+ cancelPluginEdition: 'Annuler',
+ pluginConfigurationSuccess: 'Configuration du plugin',
+ pluginConfigurationChanges: 'La configuration du plugin a été sauvegardée !',
+ startVmLabel: 'Démarrer',
+ recoveryModeLabel: 'Démarrer en mode sans échec',
+ suspendVmLabel: 'Suspendre',
+ stopVmLabel: 'Arrêter',
+ forceShutdownVmLabel: 'Forcer l\'arrêt',
+ rebootVmLabel: 'Redémarrer',
+ forceRebootVmLabel: 'Forcer le redémarrage',
+ deleteVmLabel: 'Supprimer',
+ migrateVmLabel: 'Migrer',
+ snapshotVmLabel: 'Prendre un instantané',
+ exportVmLabel: 'Exporter',
+ copyVmLabel: 'Copier',
+ cloneVmLabel: 'Cloner',
+ convertToTemplateLabel: 'Convertir en modèle',
+ // ----- host tab names -----
+ storageTabName: 'Stockage',
+ patchesTabName: 'Patches',
+ // ----- host advanced tab -----
+ hardwareHostSettingsLabel: 'Matériel',
+ hostAddress: 'Adresse',
+ hostStatus: 'Statut',
+ hostBuildNumber: 'Numéro de build',
+ hostIscsiName: 'Nom iSCSI',
+ hostXenServerVersion: 'Version',
+ hostStatusEnabled: 'Activé',
+ hostStatusDisabled: 'Désactivé',
+ hostPowerOnMode: 'Mode d\'allumage',
+ powerOnDisabled: 'Désactivé',
+ hostStartedSince: 'Système',
+ hostStackStartedSince: 'XAPI',
+ hostCpusModel: 'Modèle de processeur',
+ hostCpusNumber: 'Cœur (socket)',
+ hostManufacturerinfo: 'Informations constructeur',
+ hostBiosinfo: 'Informations BIOS',
+ licenseHostSettingsLabel: 'Licence',
+ hostLicenseType: 'Type de licence',
+ hostLicenseSocket: 'Nombre de socket',
+ hostLicenseExpiry: 'Expiration',
+ // ----- VM stat tab -----
+ statLoad: 'Charge système',
+ // ----- VM tab names -----
+ vmConsoleLabel: 'Console',
+ generalTabName: 'Général',
+ statsTabName: 'Stats',
+ consoleTabName: 'Console',
+ snapshotsTabName: 'Instantanés',
+ logsTabName: 'Journaux',
+ advancedTabName: 'Avancé',
+ networkTabName: 'Réseau',
+ disksTabName: 'Disque{disks, plural, zero {} one {} other {s}}',
+ powerStateHalted: 'arrêtée',
+ powerStateRunning: 'en marche',
+ started: 'Démarrée {ago}',
+ noToolsDetected: 'Pas d\'outils Xen détectés',
+ noIpv4Record: 'Aucune IPv4',
+ noIpRecord: 'Aucune IP',
+ virtualizationMode: 'Mode de virtualisation',
+ // ----- VM stat tab -----
+ statsCpu: 'Utilisation processeur',
+ statsMemory: 'Utilisation mémoire',
+ statsNetwork: 'Débit réseau',
+ statDisk: 'Débit disque',
+ statLastTenMinutes: 'Il y a 10 minutes',
+ statLastTwoHours: 'Il y a 2 heures',
+ statLastWeek: 'La semaine dernière',
+ statLastYear: 'L\'année dernière',
+ // ----- VM console tab -----
+ copyToClipboardLabel: 'Copier',
+ ctrlAltDelButtonLabel: 'Ctrl+Alt+Suppr',
+ tipLabel: 'Conseil :',
+ tipConsoleLabel: 'Les agencements de clavier hors États-Unis ont des problèmes avec la console: passez le votre en "US".',
+ // ----- VM disk tab -----
+ vdiAttachDeviceButton: 'Brancher un disque',
+ vbdCreateDeviceButton: 'Nouveau disque',
+ vdiBootOrder: 'Ordre de démarrage',
+ vdiNameLabel: 'Nom',
+ vdiNameDescription: 'Déscription',
+ vdiTags: 'Tags',
+ vdiSize: 'Taille',
+ vdiSr: 'Stockage',
+ vdbBootableStatus: 'Démarrable ?',
+ vdbBootable: 'Démarrable',
+ vdbNotBootable: 'Non démarrable',
+ vdbStatus: 'Statut',
+ vbdStatusConnected: 'Connecté',
+ vbdStatusDisconnected: 'Déconnecté',
+ vbdNoVbd: 'Pas de disque',
+ // ----- VM network tab -----
+ vifCreateDeviceButton: 'Nouvelle interface',
+ vifNoInterface: 'Aucune interface',
+ vifDeviceLabel: 'Interface',
+ vifMacLabel: 'Adresse physique',
+ vifMtuLabel: 'MTU',
+ vifNetworkLabel: 'Réseau',
+ vifStatusLabel: 'Statut',
+ vifStatusConnected: 'Connecté',
+ vifStatusDisconnected: 'Déconnecté',
+ // ----- VM snapshot tab -----
+ noSnapshot: 'Aucun instantané',
+ snapshotCreateButton: 'Nouvel instantané',
+ tipCreateSnapshotLabel: 'Cliquez sur le bouton pour en créer un !',
+ snapshotDate: 'Date de l\'instantané',
+ snapshotName: 'Nom',
+ snapshotAction: 'Action',
+ // ----- VM log tab -----
+ logRemoveAll: 'Supprimer tous les journaux',
+ noLogs: 'Aucun journal pour l\'instant',
+ logDate: 'Date du journal',
+ logName: 'Nom',
+ logContent: 'Contenu',
+ logAction: 'Action',
+ // ----- VM advanced tab -----
+ uuid: 'Identifiant unique',
+ miscLabel: 'Divers',
+ xenSettingsLabel: 'Paramètres Xen',
+ guestOsLabel: 'Système d\'exploitatation',
+ paraVirtualizedMode: 'Paravirtualisation (PV)',
+ hardwareVirtualizedMode: 'Virtualisation matérielle (HVM)',
+ xenToolsStatus: 'État des outils Xen',
+ xenToolsStatusValue: `{status, select,
+ unknown {Inconnu}
+ up-to-date {À jour}
+ out-of-date {Obsolètes}
+ not-installed {Pas installés}
+ }`,
+ osName: 'Nom du système d\'exploitation',
+ cpuWeightLabel: 'Poids CPU',
+ defaultCpuWeight: 'Par défaut',
+ osKernel: 'Noyau du système d\'exploitation',
+ autoPowerOn: 'Démarrage automatique',
+ ha: 'Haute disponibilité',
+ originalTemplate: 'Modèle d\'origine',
+ unknownOsName: 'Inconnu',
+ unknownOsKernel: 'Inconnu',
+ vmLimitsLabel: 'Limites',
+ vmCpuLimitsLabel: 'Limites processeur',
+ vmMemoryLimitsLabel: 'Limites mémoire',
+ unknownOriginalTemplate: 'Inconnu',
+ // ----- VM placholders -----
+ vmHomeNamePlaceholder: 'Clic long pour ajouter un nom',
+ vmHomeDescriptionPlaceholder: 'Clic long pour ajouter une description',
+ vmViewNamePlaceholder: 'Cliquer pour ajouter un nom',
+ vmViewDescriptionPlaceholder: 'Cliquer pour ajouter une description',
+
+ // ----- Dashboard -----
+ poolPanel: 'Pool{pools, plural, zero {} one {} other {s}}',
+ hostPanel: 'Hôte{hosts, plural, zero {} one {} other {s}}',
+ vmPanel: 'VM{vms, plural, zero {} one {} other {s}}',
+ memoryStatePanel: 'Utilisation mémoire',
+ cpuStatePanel: 'Attribution CPU',
+ srUsageStatePanel: 'Utilisation du stockage',
+ vmStatePanel: 'État des VMs',
+ srStatePanel: 'État du stockage',
+ taskStatePanel: 'Tâches en cours',
+ usersStatePanel: 'Utilisateurs',
+ ofUsage: 'sur',
+ noSrs: 'Aucun stockage',
+ srName: 'Nom',
+ srPool: 'Pool',
+ srHost: 'Hôte',
+ srFormat: 'Type',
+ srSize: 'Taille',
+ srUsage: 'Utilisation',
+ srTopUsageStatePanel: 'Top 5 d\'utilisation des stockages (en %)',
+ // --- Stats board --
+ weekHeatmapNoData: 'Pas de données.',
+ statsDashboardGenericErrorTitle: 'Erreur stats',
+ statsDashboardGenericErrorMessage: 'Pas de stats disponibles pour :',
+ noSelectedMetric: 'Pas de métrique sélectionnée',
+ statsDashboardSelectObjects: 'Valider',
+ metricsLoading: 'Chargement…',
+ // ----- Health -----
+ orphanedVdis: 'Disques orphelins',
+ orphanedVms: 'VM orphelines',
+ noOrphanedObject: 'Pas d\'orphelin',
+ vmNameLabel: 'Nom',
+ vmNameDescription: 'Description',
+ vmContainer: 'Présent sur',
+ alarmMessage: 'Alarmes',
+ noAlarms: 'Aucune alarme',
+ alarmDate: 'Date',
+ alarmContent: 'Contenu',
+ alarmObject: 'Concernant',
+ alarmPool: 'Pool',
+ alarmRemoveAll: 'Supprimer toutes les alarmes',
+ // ----- New VM -----
+ newVmCreateNewVmOn: 'Créer une nouvelle VM sur {pool}',
+ newVmInfoPanel: 'Informations',
+ newVmNameLabel: 'Nom',
+ newVmTemplateLabel: 'Modèle',
+ newVmDescriptionLabel: 'Description',
+ newVmPerfPanel: 'Performances',
+ newVmVcpusLabel: 'vCPUs',
+ newVmRamLabel: 'RAM',
+ newVmInstallSettingsPanel: 'Paramètres d\'installation',
+ newVmIsoDvdLabel: 'ISO/DVD',
+ newVmNetworkLabel: 'Network',
+ newVmPvArgsLabel: 'PV Args',
+ newVmPxeLabel: 'PXE',
+ newVmInterfacesPanel: 'Interfaces',
+ newVmMacLabel: 'MAC',
+ newVmAddInterface: 'Ajouter une interface',
+ newVmDisksPanel: 'Disques',
+ newVmSrLabel: 'SR',
+ newVmBootableLabel: 'Amorçable',
+ newVmSizeLabel: 'Taille',
+ newVmAddDisk: 'Ajouter un disque',
+ newVmSummaryPanel: 'Résumé',
+ newVmCreate: 'Créer',
+ newVmReset: 'Effacer',
+ newVmSelectTemplate: 'Sélectionner un template',
+ newVmSshKey: 'Clé SSH',
+ newVmCustomConfig: 'Configuration personnalisée',
+ newVmBootAfterCreate: 'Démarrer la VM après sa création',
+ newVmMacPlaceholder: 'Auto-généré si vide',
+ newVmCpuWeightLabel: 'Poids CPU',
+ newVmCpuWeightQuarter: 'Quart (1/4)',
+ newVmCpuWeightHalf: 'Moitié (1/2)',
+ newVmCpuWeightNormal: 'Normal',
+ newVmCpuWeightDouble: 'Double (x2)',
+
+ // ---- VM import ---
+ importVmsList: 'Glissez des backups ici ou cliquez pour sélectionner des backups à envoyer. Accepte seulement les fichiers .xva.',
+ noSelectedVms: 'Pas de VMs sélectionnées.',
+ vmImportToPool: 'Sur le Pool:',
+ vmImportToSr: 'Sur le SR:',
+ vmsToImport: 'VMs à importer',
+ importVmsCleanList: 'Reset',
+ vmImportSuccess: 'Import de VM réussi',
+ vmImportFailed: 'Import de VM échoué',
+ startVmImport: 'Lancement de l\'import…',
+ startVmExport: 'Lancement de l\'export…',
+ // ----- Modals -----
+ startVmsModalTitle: 'Démarrer {vms, plural, one {la} other {les}} VM{vms, plural, one {} other {s}}',
+ startVmsModalMessage: 'Voulez-vous vraiment démarrer {vms} VM{vms, plural, one {} other {s}} ?',
+ stopVmsModalTitle: 'Arrêter {vms, plural, one {la} other {les}} VM{vms, plural, one {} other {s}}',
+ stopVmsModalMessage: 'Voulez-vous vraiment arrêter {vms} VM{vms, plural, one {} other {s}} ?',
+ restartVmsModalTitle: 'Redémarrer {vms, plural, one {la} other {les}} VM{vms, plural, one {} other {s}}',
+ restartVmsModalMessage: 'Voulez-vous vraiment redémarrer {vms} VM{vms, plural, one {} other {s}} ?',
+ migrateVmModalTitle: 'Migrer la VM',
+ migrateVmModalBody: 'Voulez-vous vraiment migrer cette VM sur {hostName} ?',
+ migrateVmAdvancedModalSelectHost: 'Sélectionnez un hôte de destination:',
+ migrateVmAdvancedModalSelectNetwork: 'Sélectionnez un réseau pour la migration:',
+ migrateVmAdvancedModalSelectSrs: 'Pour chaque VDI, sélectionnez un SR:',
+ migrateVmAdvancedModalSelectNetworks: 'Pour chaque VIF, sélectionnez un réseau:',
+ migrateVmAdvancedModalName: 'Nom',
+ migrateVmAdvancedModalSr: 'SR',
+ migrateVmAdvancedModalVif: 'VIF',
+ migrateVmAdvancedModalNetwork: 'Réseau',
+ migrateVmAdvancedModalNoRemapping: 'Migration intra-pool : le re-mappage n\'est pas requis',
+ // ------ Self ------
+ resourceSets: 'Ensemble de ressources',
+ resourceSetName: 'Nom de l\'ensemble de ressources',
+ resourceSetCreation: 'Création and édition',
+ saveResourceSet: 'Sauvegarder',
+ resetResourceSet: 'Effacer',
+ editResourceSet: 'Editer',
+ deleteResourceSet: 'Supprimer',
+ deleteResourceSetWarning: 'Suppression d\'un ensemble de ressources.',
+ deleteResourceSetQuestion: 'Etes-vous sûr de vouloir supprimer cet ensemble ?',
+ resourceSetMissingObjects: 'Objets manquants :',
+ resourceSetVcpus: 'vCPUs',
+ resourceSetMemory: 'Mémoire',
+ resourceSetStorage: 'Stockage',
+ unknownResourceSetValue: 'Inconnu',
+ availableHosts: 'Hôtes disponibles',
+ excludedHosts: 'Hôtes exclus',
+ noHostsAvailable: 'Pas d\'hôtes disponibles.',
+ availableHostsDescription: 'Les VMs crées par cet ensemble de ressources doivent tourner sur les hôtes suivants.',
+ maxCpus: 'Nombre max de CPUs',
+ maxRam: 'Maximum RAM (GiB)',
+ maxDiskSpace: 'Maximum d\'espace disque',
+ totalResource: 'Total :',
+ remainingResource: 'Restants :',
+ usedResource: 'Utilisés :',
+ noResourceSetLimits: 'Pas de limites.',
+ // ----- Copy VM -----
+ copyVm: 'Copier la VM',
+ copyVmConfirm: 'Voulez-vous vraiment copier cette VM sur {SR} ?',
+ copyVmName: 'Nom',
+ copyVmNamePlaceholder: 'Si vide : nom de la VM copiée',
+ copyVmSelectSr: 'Sélectionnez un SR',
+ copyVmCompress: 'Utiliser la compression',
+ // ----- Network -----
+ networkCreate: 'Créer un réseau',
+ deleteNetwork: 'Supprimer le réseau',
+ deleteNetworkConfirm: 'Etes-vous sûr de vouloir supprimer ce réseau ?',
+ // ----- PIF -----
+ connectPif: 'Connecter la PIF',
+ connectPifConfirm: 'Etes-vous sûr de vouloir connecter cette PIF ?',
+ disconnectPif: 'Déconnecter la PIF',
+ disconnectPifConfirm: 'Etes-vous sûr de vouloir déconnecter cette PIF ?',
+ deletePif: 'Supprimer la PIF',
+ deletePifConfirm: 'Etes-vous sûr de vouloir supprimer cette PIF ?'
+}
diff --git a/src/common/intl/messages.js b/src/common/intl/messages.js
new file mode 100644
index 000000000..13a0a925c
--- /dev/null
+++ b/src/common/intl/messages.js
@@ -0,0 +1,783 @@
+// This file is coded in ES5 and CommonJS to be compatible with
+// `create-locale`.
+
+var forEach = require('lodash/forEach')
+var isString = require('lodash/isString')
+
+var messages = {
+ ok: 'OK',
+ cancel: 'Cancel',
+ editableLongClickPlaceholder: 'Long click to edit',
+ editableClickPlaceholder: 'Click to edit',
+
+ // ----- Titles -----
+ homePage: 'Home',
+ dashboardPage: 'Dashboard',
+ overviewDashboardPage: 'Overview',
+ overviewVisualizationDashboardPage: 'Visualizations',
+ overviewStatsDashboardPage: 'Statistics',
+ overviewHealthDashboardPage: 'Health',
+ selfServicePage: 'Self service',
+ selfServiceDashboardPage: 'Dashboard',
+ selfServiceAdminPage: 'Administration',
+ backupPage: 'Backup',
+ jobsPage: 'Jobs',
+ updatePage: 'Updates',
+ settingsPage: 'Settings',
+ settingsServersPage: 'Servers',
+ settingsUsersPage: 'Users',
+ settingsGroupsPage: 'Groups',
+ settingsAclsPage: 'ACLs',
+ settingsPluginsPage: 'Plugins',
+ aboutPage: 'About',
+ newMenu: 'New',
+ taskMenu: 'Tasks',
+ newVmPage: 'VM',
+ newSrPage: 'Storage',
+ newServerPage: 'Server',
+ newImport: 'Import',
+ backupOverviewPage: 'Overview',
+ backupNewPage: 'New',
+ backupRemotesPage: 'Remotes',
+ backupRestorePage: 'Restore',
+ schedule: 'Schedule',
+ newVmBackup: 'New VM backup',
+ editVmBackup: 'Edit VM backup',
+ backup: 'Backup',
+ rollingSnapshot: 'Rolling Snapshot',
+ deltaBackup: 'Delta Backup',
+ disasterRecovery: 'Disaster Recovery',
+ continuousReplication: 'Continuous Replication',
+ jobsOverviewPage: 'Overview',
+ jobsNewPage: 'New',
+ jobsSchedulingPage: 'Scheduling',
+ customJob: 'Custom Job',
+
+ // ----- Languages -----
+ enLang: 'EN',
+ frLang: 'FR',
+
+ // ----- Sign in/out -----
+ usernameLabel: 'Username:',
+ passwordLabel: 'Password:',
+ signInButton: 'Sign in',
+ signOut: 'Sign out',
+
+ // ----- Home view ------
+ homeFetchingData: 'Fetching data…',
+ homeWelcome: 'Welcome on Xen Orchestra!',
+ homeWelcomeText: 'Add your XenServer hosts or pools',
+ homeHelp: 'Want some help?',
+ homeAddServer: 'Add server',
+ homeOnlineDoc: 'Online Doc',
+ homeProSupport: 'Pro Support',
+ homeNoVms: 'There are no VMs!',
+ homeNoVmsOr: 'Or…',
+ homeImportVm: 'Import VM',
+ homeImportVmMessage: 'Import an existing VM in xva format',
+ homeRestoreBackup: 'Restore a backup',
+ homeRestoreBackupMessage: 'Restore a backup from a remote store',
+ homeNewVmMessage: 'This will create a new VM',
+ homeFilters: 'Filters',
+ homeTypePool: 'Pool',
+ homeTypeHost: 'Host',
+ homeTypeVm: 'VM',
+ homeTypeSr: 'SR',
+ homeTypeVdi: 'VDI',
+ homeSort: 'Sort',
+ homeAllPools: 'Pools',
+ homeAllHosts: 'Hosts',
+ homeAllTags: 'Tags',
+ homeNewVm: 'New VM',
+ homeFilterRunningHosts: 'Running hosts',
+ homeFilterDisabledHosts: 'Disabled hosts',
+ homeFilterRunningVms: 'Running VMs',
+ homeFilterNonRunningVms: 'Non running VMs',
+ homeFilterPendingVms: 'Pending VMs',
+ homeFilterHvmGuests: 'HVM guests',
+ homeFilterTags: 'Tags',
+ homeSortBy: 'Sort by',
+ homeSortByName: 'Name',
+ homeSortByPowerstate: 'Power state',
+ homeSortByRAM: 'RAM',
+ homeSortByvCPUs: 'vCPUs',
+ homeDisplayedVms: '{displayed, number}x {vmIcon} (on {total, number})',
+ homeSelectedVms: '{selected, number}x {vmIcon} selected (on {total, number})',
+ homeMore: 'More',
+ homeMigrateTo: 'Migrate to…',
+
+ // ----- Forms -----
+ add: 'Add',
+ remove: 'Remove',
+ preview: 'Aperçu',
+ item: 'Item',
+ noSelectedValue: 'No selected value',
+ selectSubjects: 'Choose user(s) and/or group(s)',
+ selectObjects: 'Select Object(s)…',
+ selectRole: 'Choose a role',
+ selectHosts: 'Select Host(s)…',
+ selectHostsVms: 'Select object(s)…',
+ selectNetworks: 'Select Network(s)…',
+ selectPifs: 'Select PIF(s)…',
+ selectPools: 'Select Pool(s)…',
+ selectRemotes: 'Select Remote(s)…',
+ selectSrs: 'Select SR(s)…',
+ selectVms: 'Select VM(s)…',
+ selectVmTemplates: 'Select VM template(s)…',
+ selectTags: 'Select tag(s)…',
+ selectVdis: 'Select disk(s)…',
+ fillRequiredInformations: 'Fill required informations.',
+ fillOptionalInformations: 'Fill informations (optional)',
+ selectTableReset: 'Reset',
+
+ // --- Dates/Scheduler ---
+
+ schedulingMonth: 'Month',
+ schedulingEveryMonth: 'Every month',
+ schedulingEachSelectedMonth: 'Each selected month',
+ schedulingMonthDay: 'Day of the month',
+ schedulingEveryMonthDay: 'Every day',
+ schedulingEachSelectedMonthDay: 'Each selected day',
+ schedulingWeekDay: 'Day of the week',
+ schedulingEveryWeekDay: 'Every day',
+ schedulingEachSelectedWeekDay: 'Each selected day',
+ schedulingHour: 'Hour',
+ schedulingEveryHour: 'Every hour',
+ schedulingEveryNHour: 'Every N hour',
+ schedulingEachSelectedHour: 'Each selected hour',
+ schedulingMinute: 'Minute',
+ schedulingEveryMinute: 'Every minute',
+ schedulingEveryNMinute: 'Every N minute',
+ schedulingEachSelectedMinute: 'Each selected minute',
+ schedulingReset: 'Reset',
+ unknownSchedule: 'Unknown',
+ job: 'Job',
+ jobId: 'Job ID',
+ jobName: 'Name',
+ jobStart: 'Start',
+ jobEnd: 'End',
+ jobDuration: 'Duration',
+ jobStatus: 'Status',
+ jobAction: 'Action',
+ jobTag: 'Tag',
+ jobScheduling: 'Scheduling',
+ jobState: 'State',
+ runJob: 'Run job',
+ runJobVerbose: 'One shot running started. See overview for logs.',
+ jobStarted: 'Started',
+ jobFinished: 'Finished',
+ saveBackupJob: 'Save',
+ deleteBackupSchedule: 'Remove backup job',
+ deleteBackupScheduleQuestion: 'Are you sure you want to delete this backup job?',
+ scheduleEnableAfterCreation: 'Enable immediately after creation',
+ scheduleEditMessage: 'You are editing Schedule {name} ({id}). Saving will override previous schedule state.',
+ jobEditMessage: 'You are editing job {name} ({id}). Saving will override previous job state.',
+ noScheduledJobs: 'No scheduled jobs.',
+ noJobs: 'No jobs found.',
+ noSchedules: 'No schedules found',
+ jobActionPlaceHolder: 'Select a xo-server API command',
+
+ // ------ New backup -----
+ newBackupSelection: 'Select your backup type:',
+
+ // ------ New Remote -----
+ remoteList: 'Remote stores for backup',
+ newRemote: 'New File System Remote',
+ remoteTypeLocal: 'Local',
+ remoteTypeNfs: 'NFS',
+ remoteTypeSmb: 'SMB',
+ remoteType: 'Type',
+
+ // ------ New Storage -----
+ newSrGeneral: 'General',
+ newSrTypeSelection: 'Select Strorage Type:',
+ newSrSettings: 'Settings',
+ newSrUsage: 'Storage Usage',
+ newSrSummary: 'Summary',
+ newSrHost: 'Host',
+ newSrType: 'Type',
+ newSrName: 'Name',
+ newSrDescription: 'Description',
+ newSrServer: 'Server',
+ newSrPath: 'Path',
+ newSrIqn: 'IQN',
+ newSrLun: 'LUN',
+ newSrAuth: 'with auth.',
+ newSrUsername: 'User Name',
+ newSrPassword: 'Password',
+ newSrDevice: 'Device',
+ newSrInUse: 'in use',
+ newSrSize: 'Size',
+ newSrCreate: 'Create',
+
+ // ----- Acls, Users, Groups ------
+ subjectName: 'Users/Groups',
+ objectName: 'Object',
+ roleName: 'Role',
+ newGroupName: 'New Group Name',
+ createGroup: 'Create Group',
+ createGroupButton: 'Create',
+ deleteGroup: 'Delete Group',
+ deleteGroupConfirm: 'Are you sure you want to delete this group?',
+ deleteUSer: 'Delete User',
+ removeUserFromGroup: 'Remove user from Group',
+ deleteUserConfirm: 'Are you sure you want to delete this user?',
+ unknownUser: 'unknown user',
+ noGroupFound: 'No group found',
+ groupNameColumn: 'Name',
+ groupUsersColumn: 'Users',
+ addUserToGroupColumn: 'Add User',
+ userNameColumn: 'Email',
+ userPermissionColumn: 'Permissions',
+ userPasswordColumn: 'Password',
+ userName: 'Email',
+ userPassword: 'Password',
+ createUserButton: 'Create',
+ noUserFound: 'No user found',
+ userLabel: 'User',
+ adminLabel: 'Admin',
+ noUserInGroup: 'No user in group',
+ countUsers: '{users} user{users, plural, one {} other {s}}',
+ selectPermission: 'Select Permission',
+
+ // ----- Plugins ------
+ autoloadPlugin: 'Auto-load at server start',
+ savePluginConfiguration: 'Save configuration',
+ deletePluginConfiguration: 'Delete configuration',
+ pluginError: 'Plugin error',
+ unknownPluginError: 'Unknown error',
+ purgePluginConfiguration: 'Purge plugin configuration',
+ purgePluginConfigurationQuestion: 'Are you sure you want to purge this configuration ?',
+ editPluginConfiguration: 'Edit',
+ cancelPluginEdition: 'Cancel',
+ pluginConfigurationSuccess: 'Plugin configuration',
+ pluginConfigurationChanges: 'Plugin configuration successfully saved!',
+
+ // ----- VM actions ------
+ startVmLabel: 'Start',
+ recoveryModeLabel: 'Recovery start',
+ suspendVmLabel: 'Suspend',
+ stopVmLabel: 'Stop',
+ forceShutdownVmLabel: 'Force shutdown',
+ rebootVmLabel: 'Reboot',
+ forceRebootVmLabel: 'Force reboot',
+ deleteVmLabel: 'Delete',
+ migrateVmLabel: 'Migrate',
+ snapshotVmLabel: 'Snapshot',
+ exportVmLabel: 'Export',
+ resumeVmLabel: 'Resume',
+ copyVmLabel: 'Copy',
+ cloneVmLabel: 'Clone',
+ fastCloneVmLabel: 'Fast clone',
+ convertVmToTemplateLabel: 'Convert to template',
+ vmConsoleLabel: 'Console',
+
+ // ----- SR tabs -----
+ // ----- SR actions -----
+ srRescan: 'Rescan all disks',
+ srReconnectAll: 'Connect to all hosts',
+ srDisconnectAll: 'Disconnect to all hosts',
+ srForget: 'Forget this SR',
+ srRemoveButton: 'Remove this SR',
+ srNoVdis: 'No VDIs in this storage',
+ // ----- Pool tabs -----
+ hostsTabName: 'Hosts',
+ // ----- Pool advanced tab -----
+ poolHaStatus: 'High Availability',
+ poolHaEnabled: 'Enabled',
+ poolHaDisabled: 'Disabled',
+ // ----- Pool host tab -----
+ hostNameLabel: 'Name',
+ hostDescription: 'Description',
+ hostMemory: 'Memory',
+ noHost: 'No hosts',
+ // ----- Pool network tab -----
+ poolNetworkNameLabel: 'Name',
+ poolNetworkDescription: 'Description',
+ poolNetworkPif: 'PIFs',
+ poolNoNetwork: 'No networks',
+ poolNetworkMTU: 'MTU',
+ poolNetworkPifAttached: 'Connected',
+ poolNetworkPifDetached: 'Disconnected',
+ // ----- Pool actions ------
+ addSrLabel: 'Add SR',
+ addVmLabel: 'Add VM',
+ addHostLabel: 'Add Host',
+ disconnectServer: 'Disconnect',
+
+ // ----- Host actions ------
+ startHostLabel: 'Start',
+ stopHostLabel: 'Stop',
+ enableHostLabel: 'Enable',
+ disableHostLabel: 'Disable',
+ restartHostAgent: 'Restart toolstack',
+ forceRebootHostLabel: 'Force reboot',
+ rebootHostLabel: 'Reboot',
+ emergencyModeLabel: 'Emergency mode',
+ // ----- Host tabs -----
+ storageTabName: 'Storage',
+ patchesTabName: 'Patches',
+ // ----- host stat tab -----
+ statLoad: 'Load average',
+ // ----- host advanced tab -----
+ hardwareHostSettingsLabel: 'Hardware',
+ hostAddress: 'Address',
+ hostStatus: 'Status',
+ hostBuildNumber: 'Build number',
+ hostIscsiName: 'iSCSI name',
+ hostXenServerVersion: 'Version',
+ hostStatusEnabled: 'Enabled',
+ hostStatusDisabled: 'Disabled',
+ hostPowerOnMode: 'Power on mode',
+ hostStartedSince: 'Host uptime',
+ hostStackStartedSince: 'Toolstack uptime',
+ hostCpusModel: 'CPU model',
+ hostCpusNumber: 'Core (socket)',
+ hostManufacturerinfo: 'Manufacturer info',
+ hostBiosinfo: 'BIOS info',
+ licenseHostSettingsLabel: 'Licence',
+ hostLicenseType: 'Type',
+ hostLicenseSocket: 'Socket',
+ hostLicenseExpiry: 'Expiry',
+ // ----- Host net tabs -----
+ networkCreateButton: 'Add a network',
+ pifDeviceLabel: 'Device',
+ pifNetworkLabel: 'Network',
+ pifVlanLabel: 'VLAN',
+ pifAddressLabel: 'Address',
+ pifMacLabel: 'MAC',
+ pifMtuLabel: 'MTU',
+ pifStatusLabel: 'Status',
+ pifStatusConnected: 'Connected',
+ pifStatusDisconnected: 'Disconnected',
+ pifNoInterface: 'No physical interface detected',
+ // ----- Host storage tabs -----
+ addSrDeviceButton: 'Add a storage',
+ srNameLabel: 'Name',
+ srType: 'Type',
+ pdbStatus: 'Status',
+ pbdStatusConnected: 'Connected',
+ pbdStatusDisconnected: 'Disconnected',
+ srShared: 'Shared',
+ srNotShared: 'Not shared',
+ pbdNoSr: 'No storage detected',
+ // ----- Host patch tabs -----
+ patchNameLabel: 'Name',
+ patchUpdateButton: 'Install all patches',
+ patchDescription: 'Description',
+ patchApplied: 'Release date',
+ patchSize: 'Size',
+ patchStatus: 'Status',
+ patchStatusApplied: 'Applied',
+ patchStatusNotApplied: 'Missing patches',
+ patchNothing: 'No patch detected',
+ patchReleaseDate: 'Release date',
+ patchGuidance: 'Guidance',
+ patchAction: 'Action',
+ hostInstalledPatches: 'Downloaded patches',
+ hostMissingPatches: 'Missing patches',
+ hostUpToDate: 'Host up-to-date!',
+
+ // ----- VM tabs -----
+ generalTabName: 'General',
+ statsTabName: 'Stats',
+ consoleTabName: 'Console',
+ snapshotsTabName: 'Snapshots',
+ logsTabName: 'Logs',
+ advancedTabName: 'Advanced',
+ networkTabName: 'Network',
+ disksTabName: 'Disk{disks, plural, one {} other {s}}',
+
+ powerStateHalted: 'halted',
+ powerStateRunning: 'running',
+ powerStateSuspended: 'suspended',
+
+ // ----- VM home -----
+ vmStatus: 'No Xen tools detected',
+ vmName: 'No IPv4 record',
+ vmDescription: 'No IP record',
+ vmSettings: 'Started {ago}',
+ vmCurrentStatus: 'Current status:',
+ vmNotRunning: 'Not running',
+
+ // ----- VM general tab -----
+ noToolsDetected: 'No Xen tools detected',
+ noIpv4Record: 'No IPv4 record',
+ noIpRecord: 'No IP record',
+ started: 'Started {ago}',
+ paraVirtualizedMode: 'Paravirtualization (PV)',
+ hardwareVirtualizedMode: 'Hardware virtualization (HVM)',
+
+ // ----- VM stat tab -----
+ statsCpu: 'CPU usage',
+ statsMemory: 'Memory usage',
+ statsNetwork: 'Network throughput',
+ statDisk: 'Disk throughput',
+ statLastTenMinutes: 'Last 10 minutes',
+ statLastTwoHours: 'Last 2 hours',
+ statLastWeek: 'Last week',
+ statLastYear: 'Last year',
+
+ // ----- VM console tab -----
+ copyToClipboardLabel: 'Copy',
+ ctrlAltDelButtonLabel: 'Ctrl+Alt+Del',
+ tipLabel: 'Tip:',
+ tipConsoleLabel: 'non-US keyboard could have issues with console: switch your own layout to US.',
+
+ // ----- VM disk tab -----
+ vdiAction: 'Action',
+ vdiAttachDeviceButton: 'Attach disk',
+ vbdCreateDeviceButton: 'New disk',
+ vdiBootOrder: 'Boot order',
+ vdiNameLabel: 'Name',
+ vdiNameDescription: 'Description',
+ vdiTags: 'Tags',
+ vdiSize: 'Size',
+ vdiSr: 'SR',
+ vdbBootableStatus: 'Boot flag',
+ vdbStatus: 'Status',
+ vbdStatusConnected: 'Connected',
+ vbdStatusDisconnected: 'Disconnected',
+ vbdNoVbd: 'No disks',
+
+ // ----- VM network tab -----
+ vifCreateDeviceButton: 'New device',
+ vifNoInterface: 'No interface',
+ vifDeviceLabel: 'Device',
+ vifMacLabel: 'MAC address',
+ vifMtuLabel: 'MTU',
+ vifNetworkLabel: 'Network',
+ vifStatusLabel: 'Status',
+ vifStatusConnected: 'Connected',
+ vifStatusDisconnected: 'Disconnected',
+ vifIpAddresses: 'IP addresses',
+
+ // ----- VM snapshot tab -----
+ noSnapshots: 'No snapshots',
+ snapshotCreateButton: 'New snapshot',
+ tipCreateSnapshotLabel: 'Just click on the snapshot button to create one!',
+ snapshotDate: 'Creation date',
+ snapshotName: 'Name',
+ snapshotAction: 'Action',
+
+ // ----- VM log tab -----
+ logRemoveAll: 'Remove all logs',
+ noLogs: 'No logs so far',
+ logDate: 'Creation date',
+ logName: 'Name',
+ logContent: 'Content',
+ logAction: 'Action',
+
+ // ----- VM advanced tab -----
+ vmRemoveButton: 'Remove',
+ vmConvertButton: 'Convert',
+ xenSettingsLabel: 'Xen settings',
+ guestOsLabel: 'Guest OS',
+ miscLabel: 'Misc',
+ uuid: 'UUID',
+ virtualizationMode: 'Virtualization mode',
+ cpuWeightLabel: 'CPU weight',
+ defaultCpuWeight: 'Default',
+ pvArgsLabel: 'PV args',
+ xenToolsStatus: 'Xen tools status',
+ xenToolsStatusValue: '{status}',
+ description: 'status can be `not-installed`, `unknown`, `out-of-date` & `up-to-date`',
+ osName: 'OS name',
+ osKernel: 'OS kernel',
+ autoPowerOn: 'Auto power on',
+ ha: 'HA',
+ originalTemplate: 'Original template',
+ unknownOsName: 'Unknown',
+ unknownOsKernel: 'Unknown',
+ unknownOriginalTemplate: 'Unknown',
+ vmLimitsLabel: 'VM limits',
+ vmCpuLimitsLabel: 'CPU limits',
+ vmMemoryLimitsLabel: 'Memory limits (min/max)',
+ vmMaxVcpus: 'vCPUs max:',
+ vmMaxRam: 'Memory max:',
+
+ // ----- VM placeholders -----
+
+ vmHomeNamePlaceholder: 'Long click to add a name',
+ vmHomeDescriptionPlaceholder: 'Long click to add a description',
+ vmViewNamePlaceholder: 'Click to add a name',
+ vmViewDescriptionPlaceholder: 'Click to add a description',
+
+ // ----- Dashboard -----
+ poolPanel: 'Pool{pools, plural, one {} other {s}}',
+ hostPanel: 'Host{hosts, plural, one {} other {s}}',
+ vmPanel: 'VM{vms, plural, one {} other {s}}',
+ memoryStatePanel: 'RAM Usage',
+ cpuStatePanel: 'CPUs Usage',
+ vmStatePanel: 'VMs Power state',
+ taskStatePanel: 'Pending tasks',
+ usersStatePanel: 'Users',
+ srStatePanel: 'Storage state',
+ ofUsage: 'of',
+ noSrs: 'No storage',
+ srName: 'Name',
+ srPool: 'Pool',
+ srHost: 'Host',
+ srFormat: 'Type',
+ srSize: 'Size',
+ srUsage: 'Usage',
+ srUsed: 'used',
+ srFree: 'free',
+ srUsageStatePanel: 'Storage Usage',
+ srTopUsageStatePanel: 'Top 5 SR Usage (in %)',
+
+ // --- Stats board --
+ weekHeatmapData: '{value} {date, date, medium}',
+ weekHeatmapNoData: 'No data.',
+ statsDashboardGenericErrorTitle: 'Stats error',
+ statsDashboardGenericErrorMessage: 'There is no stats available for:',
+ noSelectedMetric: 'No selected metric',
+ statsDashboardSelectObjects: 'Select',
+ metricsLoading: 'Loading…',
+
+ // ----- Visualizations -----
+ comingSoon: 'Coming soon!',
+
+ // ----- Health -----
+ orphanedVdis: 'Orphaned VDIs',
+ orphanedVms: 'Orphaned VMs',
+ noOrphanedObject: 'No orphans',
+ removeAllOrphanedObject: 'Remove all orphaned VDIs',
+ vmNameLabel: 'Name',
+ vmNameDescription: 'Description',
+ vmContainer: 'Resident on',
+ alarmMessage: 'Alarms',
+ noAlarms: 'No alarms',
+ alarmDate: 'Date',
+ alarmContent: 'Content',
+ alarmObject: 'Issue on',
+ alarmPool: 'Pool',
+ alarmRemoveAll: 'Remove all alarms',
+
+ // ----- New VM -----
+ newVmCreateNewVmOn: 'Create a new VM on {pool}',
+ newVmInfoPanel: 'Infos',
+ newVmNameLabel: 'Name',
+ newVmTemplateLabel: 'Template',
+ newVmDescriptionLabel: 'Description',
+ newVmPerfPanel: 'Performances',
+ newVmVcpusLabel: 'vCPUs',
+ newVmRamLabel: 'RAM',
+ newVmInstallSettingsPanel: 'Install settings',
+ newVmIsoDvdLabel: 'ISO/DVD',
+ newVmNetworkLabel: 'Network',
+ newVmPvArgsLabel: 'PV Args',
+ newVmPxeLabel: 'PXE',
+ newVmInterfacesPanel: 'Interfaces',
+ newVmMacLabel: 'MAC',
+ newVmAddInterface: 'Add interface',
+ newVmDisksPanel: 'Disks',
+ newVmSrLabel: 'SR',
+ newVmBootableLabel: 'Bootable',
+ newVmSizeLabel: 'Size',
+ newVmAddDisk: 'Add disk',
+ newVmSummaryPanel: 'Summary',
+ newVmCreate: 'Create',
+ newVmReset: 'Reset',
+ newVmSelectTemplate: 'Select template',
+ newVmSshKey: 'SSH key',
+ newVmConfigDrive: 'Config drive',
+ newVmCustomConfig: 'Custom config',
+ newVmBootAfterCreate: 'Boot VM after creation',
+ newVmMacPlaceholder: 'Auto-generated if empty',
+ newVmCpuWeightLabel: 'CPU weight',
+ newVmCpuWeightQuarter: 'Quarter (1/4)',
+ newVmCpuWeightHalf: 'Half (1/2)',
+ newVmCpuWeightNormal: 'Normal',
+ newVmCpuWeightDouble: 'Double (x2)',
+ newVmCloudConfig: 'Cloud config',
+
+ // ----- Self -----
+ resourceSets: 'Resource sets',
+ resourceSetName: 'Resource set name',
+ resourceSetCreation: 'Creation and edition',
+ saveResourceSet: 'Save',
+ resetResourceSet: 'Reset',
+ editResourceSet: 'Edit',
+ deleteResourceSet: 'Delete',
+ deleteResourceSetWarning: 'Delete resource set',
+ deleteResourceSetQuestion: 'Are you sure you want to delete this resource set?',
+ resourceSetMissingObjects: 'Missing objects:',
+ resourceSetVcpus: 'vCPUs',
+ resourceSetMemory: 'Memory',
+ resourceSetStorage: 'Storage',
+ unknownResourceSetValue: 'Unknown',
+ availableHosts: 'Available hosts',
+ excludedHosts: 'Excluded hosts',
+ noHostsAvailable: 'No hosts available.',
+ availableHostsDescription: 'VMs created from this resource set shall run on the following hosts.',
+ maxCpus: 'Maximum CPUs',
+ maxRam: 'Maximum RAM (GiB)',
+ maxDiskSpace: 'Maximum disk space',
+ noResourceSetLimits: 'No limits.',
+ totalResource: 'Total:',
+ remainingResource: 'Remaining:',
+ usedResource: 'Used:',
+
+ // ---- VM import ---
+ importVmsList: 'Try dropping some backups here, or click to select backups to upload. Accept only .xva files.',
+ noSelectedVms: 'No selected VMs.',
+ vmImportToPool: 'To Pool:',
+ vmImportToSr: 'To SR:',
+ vmsToImport: 'VMs to import',
+ importVmsCleanList: 'Reset',
+ vmImportSuccess: 'VM import success',
+ vmImportFailed: 'VM import failed',
+ startVmImport: 'Import starting…',
+ startVmExport: 'Export starting…',
+
+ // ---- Tasks ---
+ noTasks: 'No pending tasks',
+ xsTasks: 'Currently, there isn\'t any pending XenServer tasks',
+
+ // ---- Backup views ---
+ delta: 'delta',
+ restoreBackups: 'Restore Backups',
+ noRemotes: 'No remotes',
+ remoteEnabled: 'enabled',
+ remoteError: 'error',
+ noBackup: 'No backups available',
+
+ // ----- Modals -----
+ startVmsModalTitle: 'Start VM{vms, plural, one {} other {s}}',
+ startVmsModalMessage: 'Are you sure you want to start {vms} VM{vms, plural, one {} other {s}}?',
+ stopVmsModalTitle: 'Stop VM{vms, plural, one {} other {s}}',
+ stopVmsModalMessage: 'Are you sure you want to stop {vms} VM{vms, plural, one {} other {s}}?',
+ restartVmsModalTitle: 'Restart VM{vms, plural, one {} other {s}}',
+ restartVmsModalMessage: 'Are you sure you want to restart {vms} VM{vms, plural, one {} other {s}}?',
+ snapshotVmsModalTitle: 'Snapshot VM{vms, plural, one {} other {s}}',
+ snapshotVmsModalMessage: 'Are you sure you want to snapshot {vms} VM{vms, plural, one {} other {s}}?',
+ deleteVmModalTitle: 'Delete VM',
+ deleteVmsModalTitle: 'Delete VM{vms, plural, one {} other {s}}',
+ deleteVmModalMessage: 'Are you sure you want to delete this VM? ALL VM DISKS WILL BE REMOVED',
+ deleteVmsModalMessage: 'Are you sure you want to delete {vms} VM{vms, plural, one {} other {s}}? ALL VM DISKS WILL BE REMOVED',
+ migrateVmModalTitle: 'Migrate VM',
+ migrateVmModalBody: 'Are you sure you want to migrate this VM to {hostName}?',
+ migrateVmAdvancedModalSelectHost: 'Select a destination host:',
+ migrateVmAdvancedModalSelectNetwork: 'Select a migration network:',
+ migrateVmAdvancedModalSelectSrs: 'For each VDI, select an SR:',
+ migrateVmAdvancedModalSelectNetworks: 'For each VIF, select a network:',
+ migrateVmAdvancedModalName: 'Name',
+ migrateVmAdvancedModalSr: 'SR',
+ migrateVmAdvancedModalVif: 'VIF',
+ migrateVmAdvancedModalNetwork: 'Network',
+ importBackupModalTitle: 'Import a {name} Backup',
+ importBackupModalStart: 'Start VM after restore',
+ importBackupModalSelectBackup: 'Select your backup…',
+ removeAllOrphanedModalWarning: 'Are you sure you want to remove all orphaned VDIs?',
+ removeAllLogsModalTitle: 'Remove all logs',
+ removeAllLogsModalWarning: 'Are you sure you want to remove all logs?',
+ definitiveMessageModal: 'This operation is definitive.',
+ existingSrModalTitle: 'Previous SR Usage',
+ existingSrModalText: 'This path has been previously used as a Storage by a XenServer host. All data will be lost if you choose to continue the SR creation.',
+ existingLunModalTitle: 'Previous LUN Usage',
+ existingLunModalText: 'This LUN has been previously used as a Storage by a XenServer host. All data will be lost if you choose to continue the SR creation.',
+ alreadyRegisteredModal: 'Replace current registration?',
+ alreadyRegisteredModalText: 'Your XO appliance is already registered to {email}, do you want to forget and replace this registration ?',
+ trialReadyModal: 'Ready for trial?',
+ trialReadyModalText: 'During the trial period, XOA need to have a working internet connection. This limitation does not apply for our paid plans!',
+
+ // ----- Servers -----
+ serverHost: 'Host',
+ serverUsername: 'Username',
+ serverPassword: 'Password',
+ serverAction: 'Action',
+ serverReadOnly: 'Read Only',
+
+ // ----- Copy VM -----
+ copyVm: 'Copy VM',
+ copyVmConfirm: 'Are you sure you want to copy this VM to {SR}?',
+ copyVmName: 'Name',
+ copyVmNamePlaceholder: 'If empty: name of the copied VM',
+ copyVmSelectSr: 'Select SR',
+ copyVmCompress: 'Use compression',
+
+ // ----- Network -----
+ newNetworkCreate: 'Create network',
+ newNetworkInterface: 'Interface',
+ newNetworkName: 'Name',
+ newNetworkDescription: 'Description',
+ newNetworkVlan: 'VLAN',
+ newNetworkDefaultVlan: 'No VLAN if empty',
+ newNetworkMtu: 'MTU',
+ newNetworkDefaultMtu: 'Default: 1500',
+ deleteNetwork: 'Delete network',
+ deleteNetworkConfirm: 'Are you sure you want to delete this network?',
+
+ // ----- About View -----
+ xenOrchestra: 'Xen Orchestra',
+ xenOrchestraServer: 'server',
+ xenOrchestraWeb: 'web client',
+ noProSupport: 'No pro support provided!',
+ noProductionUse: 'Use in production at your own risks',
+ downloadXoa: 'You can download our turnkey appliance at',
+ bugTracker: 'Bug Tracker',
+ bugTrackerText: 'Issues? Report it!',
+ community: 'Community',
+ communityText: 'Join our community forum!',
+ freeTrial: 'Free Trial for Premium Edition!',
+ freeTrialNow: 'Request your trial now!',
+ issues: 'Any issue?',
+ issuesText: 'Problem? Contact us!',
+ documentation: 'Documentation',
+ documentationText: 'Read our official doc',
+ proSupportIncluded: 'Pro support included',
+ xoAccount: 'Acces your XO Account',
+ openTicket: 'Report a problem',
+ openTicketText: 'Problem? Open a ticket !',
+
+ // ----- Upgrade Panel -----
+ upgradeNeeded: 'Upgrade needed',
+ upgradeNow: 'Upgrade now!',
+ or: 'Or',
+ tryIt: 'Try it for free!',
+ availableIn: 'This feature is available starting from {plan} Edition',
+
+ // ----- Updates View -----
+ registration: 'Registration',
+ trial: 'Trial',
+ settings: 'Settings',
+ update: 'Update',
+ upgrade: 'Upgrade',
+ noUpdaterCommunity: 'No updater available for Community Edition',
+ noUpdaterSubscribe: 'Please consider subscribe and try it with all features for free during 15 days on',
+ noUpdaterWarning: 'Manual update could break your current installation due to dependencies issues, do it with caution',
+ currentVersion: 'Current version:',
+ register: 'Register',
+ trialRegistration: 'Please, take time to register in order to enjoy your trial.',
+ trialStartButton: 'Start trial',
+ trialAvailableUntil: 'You can use a trial version until {date, date, medium}. Upgrade your appliance to get it.',
+ trialConsumed: 'Your trial has been ended. Contact us or downgrade to Free version',
+ trialLocked: 'Your xoa-updater service appears to be down. Your XOA cannot run fully without reaching this service.',
+
+ // ----- OS Disclaimer -----
+ disclaimerTitle: 'Xen Orchestra from the sources',
+ disclaimerText1: 'You are using XO from the sources! That\'s great for a personal/non-profit usage.',
+ disclaimerText2: 'If you are a company, it\'s better to use it with our appliance + pro support included:',
+ disclaimerText3: 'This version is not bundled with any support nor updates. Use it with caution for critical tasks.',
+
+ // ----- PIF -----
+ connectPif: 'Connect PIF',
+ connectPifConfirm: 'Are you sure you want to connect this PIF?',
+ disconnectPif: 'Disconnect PIF',
+ disconnectPifConfirm: 'Are you sure you want to disconnect this PIF?',
+ deletePif: 'Delete PIF',
+ deletePifConfirm: 'Are you sure you want to delete this PIF?'
+}
+forEach(messages, function (message, id) {
+ if (isString(message)) {
+ messages[id] = {
+ id,
+ defaultMessage: message
+ }
+ } else if (!message.id) {
+ message.id = id
+ }
+})
+
+module.exports = messages
diff --git a/src/common/json-schema-input/array-input.js b/src/common/json-schema-input/array-input.js
index a2fda997b..b183f33c4 100644
--- a/src/common/json-schema-input/array-input.js
+++ b/src/common/json-schema-input/array-input.js
@@ -1,4 +1,4 @@
-import _ from 'messages'
+import _ from 'intl'
import React, { Component, cloneElement } from 'react'
import map from 'lodash/map'
import filter from 'lodash/filter'
diff --git a/src/common/json-schema-input/enum-input.js b/src/common/json-schema-input/enum-input.js
index 06ec8d007..890e97d18 100644
--- a/src/common/json-schema-input/enum-input.js
+++ b/src/common/json-schema-input/enum-input.js
@@ -1,5 +1,5 @@
import React from 'react'
-import _ from 'messages'
+import _ from 'intl'
import map from 'lodash/map'
import AbstractInput from './abstract-input'
diff --git a/src/common/json-schema-input/object-input.js b/src/common/json-schema-input/object-input.js
index 5ee8bbb38..54fb774e7 100644
--- a/src/common/json-schema-input/object-input.js
+++ b/src/common/json-schema-input/object-input.js
@@ -1,4 +1,4 @@
-import _ from 'messages'
+import _ from 'intl'
import React, { Component, cloneElement } from 'react'
import forEach from 'lodash/forEach'
import includes from 'lodash/includes'
diff --git a/src/common/messages.js b/src/common/messages.js
deleted file mode 100644
index c4789c029..000000000
--- a/src/common/messages.js
+++ /dev/null
@@ -1,2584 +0,0 @@
-import forEach from 'lodash/forEach'
-import frLocaleData from 'react-intl/locale-data/fr'
-import isFunction from 'lodash/isFunction'
-import isString from 'lodash/isString'
-import moment from 'moment'
-import React, {
- Component,
- PropTypes
-} from 'react'
-import {
- connect
-} from 'react-redux'
-import {
- addLocaleData,
- FormattedMessage,
- IntlProvider as IntlProvider_
-} from 'react-intl'
-
-import 'moment/locale/fr' // See bug mentionned in // http://momentjs.com/docs/#/use-it/browserify/
-
-// ===================================================================
-
-export const messages = {
- ok: {
- defaultMessage: 'OK'
- },
- cancel: {
- defaultMessage: 'Cancel'
- },
- editableLongClickPlaceholder: {
- defaultMessage: 'Long click to edit'
- },
- editableClickPlaceholder: {
- defaultMessage: 'Click to edit'
- },
-
- // ----- Titles -----
- homePage: {
- defaultMessage: 'Home'
- },
- dashboardPage: {
- defaultMessage: 'Dashboard'
- },
- overviewDashboardPage: {
- defaultMessage: 'Overview'
- },
- overviewVisualizationDashboardPage: {
- defaultMessage: 'Visualizations'
- },
- overviewStatsDashboardPage: {
- defaultMessage: 'Statistics'
- },
- overviewHealthDashboardPage: {
- defaultMessage: 'Health'
- },
- selfServicePage: {
- defaultMessage: 'Self service'
- },
- selfServiceDashboardPage: {
- defaultMessage: 'Dashboard'
- },
- selfServiceAdminPage: {
- defaultMessage: 'Administration'
- },
- backupPage: {
- defaultMessage: 'Backup'
- },
- jobsPage: {
- defaultMessage: 'Jobs'
- },
- updatePage: {
- defaultMessage: 'Updates'
- },
- settingsPage: {
- defaultMessage: 'Settings'
- },
- settingsServersPage: {
- defaultMessage: 'Servers'
- },
- settingsUsersPage: {
- defaultMessage: 'Users'
- },
- settingsGroupsPage: {
- defaultMessage: 'Groups'
- },
- settingsAclsPage: {
- defaultMessage: 'ACLs'
- },
- settingsPluginsPage: {
- defaultMessage: 'Plugins'
- },
- aboutPage: {
- defaultMessage: 'About'
- },
- newMenu: {
- defaultMessage: 'New'
- },
- taskMenu: {
- defaultMessage: 'Tasks'
- },
- newVmPage: {
- defaultMessage: 'VM'
- },
- newSrPage: {
- defaultMessage: 'Storage'
- },
- newServerPage: {
- defaultMessage: 'Server'
- },
- newImport: {
- defaultMessage: 'Import'
- },
- backupOverviewPage: {
- defaultMessage: 'Overview'
- },
- backupNewPage: {
- defaultMessage: 'New'
- },
- backupRemotesPage: {
- defaultMessage: 'Remotes'
- },
- backupRestorePage: {
- defaultMessage: 'Restore'
- },
- schedule: {
- defaultMessage: 'Schedule'
- },
- newVmBackup: {
- defaultMessage: 'New VM backup'
- },
- editVmBackup: {
- defaultMessage: 'Edit VM backup'
- },
- backup: {
- defaultMessage: 'Backup'
- },
- rollingSnapshot: {
- defaultMessage: 'Rolling Snapshot'
- },
- deltaBackup: {
- defaultMessage: 'Delta Backup'
- },
- disasterRecovery: {
- defaultMessage: 'Disaster Recovery'
- },
- continuousReplication: {
- defaultMessage: 'Continuous Replication'
- },
- jobsOverviewPage: {
- defaultMessage: 'Overview'
- },
- jobsNewPage: {
- defaultMessage: 'New'
- },
- jobsSchedulingPage: {
- defaultMessage: 'Scheduling'
- },
- customJob: {
- defaultMessage: 'Custom Job'
- },
-
- // ----- Languages -----
- enLang: {
- defaultMessage: 'EN'
- },
- frLang: {
- defaultMessage: 'FR'
- },
-
- // ----- Sign in/out -----
- usernameLabel: {
- defaultMessage: 'Username:'
- },
- passwordLabel: {
- defaultMessage: 'Password:'
- },
- signInButton: {
- defaultMessage: 'Sign in'
- },
- signOut: {
- defaultMessage: 'Sign out'
- },
-
- // ----- Home view ------
- homeFetchingData: {
- defaultMessage: 'Fetching data…'
- },
- homeWelcome: {
- defaultMessage: 'Welcome on Xen Orchestra!'
- },
- homeWelcomeText: {
- defaultMessage: 'Add your XenServer hosts or pools'
- },
- homeHelp: {
- defaultMessage: 'Want some help?'
- },
- homeAddServer: {
- defaultMessage: 'Add server'
- },
- homeOnlineDoc: {
- defaultMessage: 'Online Doc'
- },
- homeProSupport: {
- defaultMessage: 'Pro Support'
- },
- homeNoVms: {
- defaultMessage: 'There are no VMs!'
- },
- homeNoVmsOr: {
- defaultMessage: 'Or…'
- },
- homeImportVm: {
- defaultMessage: 'Import VM'
- },
- homeImportVmMessage: {
- defaultMessage: 'Import an existing VM in xva format'
- },
- homeRestoreBackup: {
- defaultMessage: 'Restore a backup'
- },
- homeRestoreBackupMessage: {
- defaultMessage: 'Restore a backup from a remote store'
- },
- homeNewVmMessage: {
- defaultMessage: 'This will create a new VM'
- },
- homeFilters: {
- defaultMessage: 'Filters'
- },
- homeTypePool: {
- defaultMessage: 'Pool'
- },
- homeTypeHost: {
- defaultMessage: 'Host'
- },
- homeTypeVm: {
- defaultMessage: 'VM'
- },
- homeTypeSr: {
- defaultMessage: 'SR'
- },
- homeTypeVdi: {
- defaultMessage: 'VDI'
- },
- homeSort: {
- defaultMessage: 'Sort'
- },
- homeAllPools: {
- defaultMessage: 'Pools'
- },
- homeAllHosts: {
- defaultMessage: 'Hosts'
- },
- homeAllTags: {
- defaultMessage: 'Tags'
- },
- homeNewVm: {
- defaultMessage: 'New VM'
- },
- homeFilterRunningHosts: {
- defaultMessage: 'Running hosts'
- },
- homeFilterDisabledHosts: {
- defaultMessage: 'Disabled hosts'
- },
- homeFilterRunningVms: {
- defaultMessage: 'Running VMs'
- },
- homeFilterNonRunningVms: {
- defaultMessage: 'Non running VMs'
- },
- homeFilterPendingVms: {
- defaultMessage: 'Pending VMs'
- },
- homeFilterHvmGuests: {
- defaultMessage: 'HVM guests'
- },
- homeFilterTags: {
- defaultMessage: 'Tags'
- },
- homeSortBy: {
- defaultMessage: 'Sort by'
- },
- homeSortByName: {
- defaultMessage: 'Name'
- },
- homeSortByPowerstate: {
- defaultMessage: 'Power state'
- },
- homeSortByRAM: {
- defaultMessage: 'RAM'
- },
- homeSortByvCPUs: {
- defaultMessage: 'vCPUs'
- },
- homeDisplayedVms: {
- defaultMessage: '{displayed, number}x {vmIcon} (on {total, number})'
- },
- homeSelectedVms: {
- defaultMessage: '{selected, number}x {vmIcon} selected (on {total, number})'
- },
- homeMore: {
- defaultMessage: 'More'
- },
- homeMigrateTo: {
- defaultMessage: 'Migrate to…'
- },
-
- // ----- Forms -----
- add: {
- defaultMessage: 'Add'
- },
- remove: {
- defaultMessage: 'Remove'
- },
- preview: {
- defaultMessage: 'Aperçu'
- },
- item: {
- defaultMessage: 'Item'
- },
- noSelectedValue: {
- defaultMessage: 'No selected value'
- },
- selectSubjects: {
- defaultMessage: 'Choose user(s) and/or group(s)'
- },
- selectObjects: {
- defaultMessage: 'Select Object(s)…'
- },
- selectRole: {
- defaultMessage: 'Choose a role'
- },
- selectHosts: {
- defaultMessage: 'Select Host(s)…'
- },
- selectHostsVms: {
- defaultMessage: 'Select object(s)…'
- },
- selectNetworks: {
- defaultMessage: 'Select Network(s)…'
- },
- selectPifs: {
- defaultMessage: 'Select PIF(s)…'
- },
- selectPools: {
- defaultMessage: 'Select Pool(s)…'
- },
- selectRemotes: {
- defaultMessage: 'Select Remote(s)…'
- },
- selectSrs: {
- defaultMessage: 'Select SR(s)…'
- },
- selectVms: {
- defaultMessage: 'Select VM(s)…'
- },
- selectVmTemplates: {
- defaultMessage: 'Select VM template(s)…'
- },
- selectTags: {
- defaultMessage: 'Select tag(s)…'
- },
- selectVdis: {
- defaultMessage: 'Select disk(s)…'
- },
- fillRequiredInformations: {
- defaultMessage: 'Fill required informations.'
- },
- fillOptionalInformations: {
- defaultMessage: 'Fill informations (optional)'
- },
- selectTableReset: {
- defaultMessage: 'Reset'
- },
-
- // --- Dates/Scheduler ---
-
- schedulingMonth: {
- defaultMessage: 'Month'
- },
- schedulingEveryMonth: {
- defaultMessage: 'Every month'
- },
- schedulingEachSelectedMonth: {
- defaultMessage: 'Each selected month'
- },
- schedulingMonthDay: {
- defaultMessage: 'Day of the month'
- },
- schedulingEveryMonthDay: {
- defaultMessage: 'Every day'
- },
- schedulingEachSelectedMonthDay: {
- defaultMessage: 'Each selected day'
- },
- schedulingWeekDay: {
- defaultMessage: 'Day of the week'
- },
- schedulingEveryWeekDay: {
- defaultMessage: 'Every day'
- },
- schedulingEachSelectedWeekDay: {
- defaultMessage: 'Each selected day'
- },
- schedulingHour: {
- defaultMessage: 'Hour'
- },
- schedulingEveryHour: {
- defaultMessage: 'Every hour'
- },
- schedulingEveryNHour: {
- defaultMessage: 'Every N hour'
- },
- schedulingEachSelectedHour: {
- defaultMessage: 'Each selected hour'
- },
- schedulingMinute: {
- defaultMessage: 'Minute'
- },
- schedulingEveryMinute: {
- defaultMessage: 'Every minute'
- },
- schedulingEveryNMinute: {
- defaultMessage: 'Every N minute'
- },
- schedulingEachSelectedMinute: {
- defaultMessage: 'Each selected minute'
- },
- schedulingReset: {
- defaultMessage: 'Reset'
- },
- unknownSchedule: {
- defaultMessage: 'Unknown'
- },
- job: {
- defaultMessage: 'Job'
- },
- jobId: {
- defaultMessage: 'Job ID'
- },
- jobName: {
- defaultMessage: 'Name'
- },
- jobStart: {
- defaultMessage: 'Start'
- },
- jobEnd: {
- defaultMessage: 'End'
- },
- jobDuration: {
- defaultMessage: 'Duration'
- },
- jobStatus: {
- defaultMessage: 'Status'
- },
- jobAction: {
- defaultMessage: 'Action'
- },
- jobTag: {
- defaultMessage: 'Tag'
- },
- jobScheduling: {
- defaultMessage: 'Scheduling'
- },
- jobState: {
- defaultMessage: 'State'
- },
- runJob: {
- defaultMessage: 'Run job'
- },
- runJobVerbose: {
- defaultMessage: 'One shot running started. See overview for logs.'
- },
- jobStarted: {
- defaultMessage: 'Started'
- },
- jobFinished: {
- defaultMessage: 'Finished'
- },
- saveBackupJob: {
- defaultMessage: 'Save'
- },
- deleteBackupSchedule: {
- defaultMessage: 'Remove backup job'
- },
- deleteBackupScheduleQuestion: {
- defaultMessage: 'Are you sure you want to delete this backup job?'
- },
- scheduleEnableAfterCreation: {
- defaultMessage: 'Enable immediately after creation'
- },
- scheduleEditMessage: {
- defaultMessage: 'You are editing Schedule {name} ({id}). Saving will override previous schedule state.'
- },
- jobEditMessage: {
- defaultMessage: 'You are editing job {name} ({id}). Saving will override previous job state.'
- },
- noScheduledJobs: {
- defaultMessage: 'No scheduled jobs.'
- },
- noJobs: {
- defaultMessage: 'No jobs found.'
- },
- noSchedules: {
- defaultMessage: 'No schedules found'
- },
- jobActionPlaceHolder: {
- defaultMessage: 'Select a xo-server API command'
- },
-
- // ------ New backup -----
- newBackupSelection: {
- defaultMessage: 'Select your backup type:'
- },
-
- // ------ New Remote -----
- remoteList: {
- defaultMessage: 'Remote stores for backup'
- },
- newRemote: {
- defaultMessage: 'New File System Remote'
- },
- remoteTypeLocal: {
- defaultMessage: 'Local'
- },
- remoteTypeNfs: {
- defaultMessage: 'NFS'
- },
- remoteTypeSmb: {
- defaultMessage: 'SMB'
- },
- remoteType: {
- defaultMessage: 'Type'
- },
-
- // ------ New Storage -----
- newSrGeneral: {
- defaultMessage: 'General'
- },
- newSrTypeSelection: {
- defaultMessage: 'Select Strorage Type:'
- },
- newSrSettings: {
- defaultMessage: 'Settings'
- },
- newSrUsage: {
- defaultMessage: 'Storage Usage'
- },
- newSrSummary: {
- defaultMessage: 'Summary'
- },
- newSrHost: {
- defaultMessage: 'Host'
- },
- newSrType: {
- defaultMessage: 'Type'
- },
- newSrName: {
- defaultMessage: 'Name'
- },
- newSrDescription: {
- defaultMessage: 'Description'
- },
- newSrServer: {
- defaultMessage: 'Server'
- },
- newSrPath: {
- defaultMessage: 'Path'
- },
- newSrIqn: {
- defaultMessage: 'IQN'
- },
- newSrLun: {
- defaultMessage: 'LUN'
- },
- newSrAuth: {
- defaultMessage: 'with auth.'
- },
- newSrUsername: {
- defaultMessage: 'User Name'
- },
- newSrPassword: {
- defaultMessage: 'Password'
- },
- newSrDevice: {
- defaultMessage: 'Device'
- },
- newSrInUse: {
- defaultMessage: 'in use'
- },
- newSrSize: {
- defaultMessage: 'Size'
- },
- newSrCreate: {
- defaultMessage: 'Create'
- },
-
- // ----- Acls, Users, Groups ------
- subjectName: {
- defaultMessage: 'Users/Groups'
- },
- objectName: {
- defaultMessage: 'Object'
- },
- roleName: {
- defaultMessage: 'Role'
- },
- newGroupName: {
- defaultMessage: 'New Group Name'
- },
- createGroup: {
- defaultMessage: 'Create Group'
- },
- createGroupButton: {
- defaultMessage: 'Create'
- },
- deleteGroup: {
- defaultMessage: 'Delete Group'
- },
- deleteGroupConfirm: {
- defaultMessage: 'Are you sure you want to delete this group?'
- },
- deleteUSer: {
- defaultMessage: 'Delete User'
- },
- removeUserFromGroup: {
- defaultMessage: 'Remove user from Group'
- },
- deleteUserConfirm: {
- defaultMessage: 'Are you sure you want to delete this user?'
- },
- unknownUser: {
- defaultMessage: 'unknown user'
- },
- noGroupFound: {
- defaultMessage: 'No group found'
- },
- groupNameColumn: {
- defaultMessage: 'Name'
- },
- groupUsersColumn: {
- defaultMessage: 'Users'
- },
- addUserToGroupColumn: {
- defaultMessage: 'Add User'
- },
- userNameColumn: {
- defaultMessage: 'Email'
- },
- userPermissionColumn: {
- defaultMessage: 'Permissions'
- },
- userPasswordColumn: {
- defaultMessage: 'Password'
- },
- userName: {
- defaultMessage: 'Email'
- },
- userPassword: {
- defaultMessage: 'Password'
- },
- createUserButton: {
- defaultMessage: 'Create'
- },
- noUserFound: {
- defaultMessage: 'No user found'
- },
- userLabel: {
- defaultMessage: 'User'
- },
- adminLabel: {
- defaultMessage: 'Admin'
- },
- noUserInGroup: {
- defaultMessage: 'No user in group'
- },
- countUsers: {
- defaultMessage: '{users} user{users, plural, one {} other {s}}'
- },
- selectPermission: {
- defaultMessage: 'Select Permission'
- },
-
- // ----- Plugins ------
- autoloadPlugin: {
- defaultMessage: 'Auto-load at server start'
- },
- savePluginConfiguration: {
- defaultMessage: 'Save configuration'
- },
- deletePluginConfiguration: {
- defaultMessage: 'Delete configuration'
- },
- pluginError: {
- defaultMessage: 'Plugin error'
- },
- unknownPluginError: {
- defaultMessage: 'Unknown error'
- },
- purgePluginConfiguration: {
- defaultMessage: 'Purge plugin configuration'
- },
- purgePluginConfigurationQuestion: {
- defaultMessage: 'Are you sure you want to purge this configuration ?'
- },
- editPluginConfiguration: {
- defaultMessage: 'Edit'
- },
- cancelPluginEdition: {
- defaultMessage: 'Cancel'
- },
- pluginConfigurationSuccess: {
- defaultMessage: 'Plugin configuration'
- },
- pluginConfigurationChanges: {
- defaultMessage: 'Plugin configuration successfully saved!'
- },
-
- // ----- VM actions ------
- startVmLabel: {
- defaultMessage: 'Start'
- },
- recoveryModeLabel: {
- defaultMessage: 'Recovery start'
- },
- suspendVmLabel: {
- defaultMessage: 'Suspend'
- },
- stopVmLabel: {
- defaultMessage: 'Stop'
- },
- forceShutdownVmLabel: {
- defaultMessage: 'Force shutdown'
- },
- rebootVmLabel: {
- defaultMessage: 'Reboot'
- },
- forceRebootVmLabel: {
- defaultMessage: 'Force reboot'
- },
- deleteVmLabel: {
- defaultMessage: 'Delete'
- },
- migrateVmLabel: {
- defaultMessage: 'Migrate'
- },
- snapshotVmLabel: {
- defaultMessage: 'Snapshot'
- },
- exportVmLabel: {
- defaultMessage: 'Export'
- },
- resumeVmLabel: {
- defaultMessage: 'Resume'
- },
- copyVmLabel: {
- defaultMessage: 'Copy'
- },
- cloneVmLabel: {
- defaultMessage: 'Clone'
- },
- fastCloneVmLabel: {
- defaultMessage: 'Fast clone'
- },
- convertVmToTemplateLabel: {
- defaultMessage: 'Convert to template'
- },
- vmConsoleLabel: {
- defaultMessage: 'Console'
- },
-
- // ----- SR tabs -----
- // ----- SR actions -----
- srRescan: {
- defaultMessage: 'Rescan all disks'
- },
- srReconnectAll: {
- defaultMessage: 'Connect to all hosts'
- },
- srDisconnectAll: {
- defaultMessage: 'Disconnect to all hosts'
- },
- srForget: {
- defaultMessage: 'Forget this SR'
- },
- srRemoveButton: {
- defaultMessage: 'Remove this SR'
- },
- srNoVdis: {
- defaultMessage: 'No VDIs in this storage'
- },
- // ----- Pool tabs -----
- hostsTabName: {
- defaultMessage: 'Hosts'
- },
- // ----- Pool advanced tab -----
- poolHaStatus: {
- defaultMessage: 'High Availability'
- },
- poolHaEnabled: {
- defaultMessage: 'Enabled'
- },
- poolHaDisabled: {
- defaultMessage: 'Disabled'
- },
- // ----- Pool host tab -----
- hostNameLabel: {
- defaultMessage: 'Name'
- },
- hostDescription: {
- defaultMessage: 'Description'
- },
- hostMemory: {
- defaultMessage: 'Memory'
- },
- noHost: {
- defaultMessage: 'No hosts'
- },
- // ----- Pool network tab -----
- poolNetworkNameLabel: {
- defaultMessage: 'Name'
- },
- poolNetworkDescription: {
- defaultMessage: 'Description'
- },
- poolNetworkPif: {
- defaultMessage: 'PIFs'
- },
- poolNoNetwork: {
- defaultMessage: 'No networks'
- },
- poolNetworkMTU: {
- defaultMessage: 'MTU'
- },
- poolNetworkPifAttached: {
- defaultMessage: 'Connected'
- },
- poolNetworkPifDetached: {
- defaultMessage: 'Disconnected'
- },
- // ----- Pool actions ------
- addSrLabel: {
- defaultMessage: 'Add SR'
- },
- addVmLabel: {
- defaultMessage: 'Add VM'
- },
- addHostLabel: {
- defaultMessage: 'Add Host'
- },
- disconnectServer: {
- defaultMessage: 'Disconnect'
- },
-
- // ----- Host actions ------
- startHostLabel: {
- defaultMessage: 'Start'
- },
- stopHostLabel: {
- defaultMessage: 'Stop'
- },
- enableHostLabel: {
- defaultMessage: 'Enable'
- },
- disableHostLabel: {
- defaultMessage: 'Disable'
- },
- restartHostAgent: {
- defaultMessage: 'Restart toolstack'
- },
- forceRebootHostLabel: {
- defaultMessage: 'Force reboot'
- },
- rebootHostLabel: {
- defaultMessage: 'Reboot'
- },
- emergencyModeLabel: {
- defaultMessage: 'Emergency mode'
- },
- // ----- Host tabs -----
- storageTabName: {
- defaultMessage: 'Storage'
- },
- patchesTabName: {
- defaultMessage: 'Patches'
- },
- // ----- host stat tab -----
- statLoad: {
- defaultMessage: 'Load average'
- },
- // ----- host advanced tab -----
- hardwareHostSettingsLabel: {
- defaultMessage: 'Hardware'
- },
- hostAddress: {
- defaultMessage: 'Address'
- },
- hostStatus: {
- defaultMessage: 'Status'
- },
- hostBuildNumber: {
- defaultMessage: 'Build number'
- },
- hostIscsiName: {
- defaultMessage: 'iSCSI name'
- },
- hostXenServerVersion: {
- defaultMessage: 'Version'
- },
- hostStatusEnabled: {
- defaultMessage: 'Enabled'
- },
- hostStatusDisabled: {
- defaultMessage: 'Disabled'
- },
- hostPowerOnMode: {
- defaultMessage: 'Power on mode'
- },
- hostStartedSince: {
- defaultMessage: 'Host uptime'
- },
- hostStackStartedSince: {
- defaultMessage: 'Toolstack uptime'
- },
- hostCpusModel: {
- defaultMessage: 'CPU model'
- },
- hostCpusNumber: {
- defaultMessage: 'Core (socket)'
- },
- hostManufacturerinfo: {
- defaultMessage: 'Manufacturer info'
- },
- hostBiosinfo: {
- defaultMessage: 'BIOS info'
- },
- licenseHostSettingsLabel: {
- defaultMessage: 'Licence'
- },
- hostLicenseType: {
- defaultMessage: 'Type'
- },
- hostLicenseSocket: {
- defaultMessage: 'Socket'
- },
- hostLicenseExpiry: {
- defaultMessage: 'Expiry'
- },
- // ----- Host net tabs -----
- networkCreateButton: {
- defaultMessage: 'Add a network'
- },
- pifDeviceLabel: {
- defaultMessage: 'Device'
- },
- pifNetworkLabel: {
- defaultMessage: 'Network'
- },
- pifVlanLabel: {
- defaultMessage: 'VLAN'
- },
- pifAddressLabel: {
- defaultMessage: 'Address'
- },
- pifMacLabel: {
- defaultMessage: 'MAC'
- },
- pifMtuLabel: {
- defaultMessage: 'MTU'
- },
- pifStatusLabel: {
- defaultMessage: 'Status'
- },
- pifStatusConnected: {
- defaultMessage: 'Connected'
- },
- pifStatusDisconnected: {
- defaultMessage: 'Disconnected'
- },
- pifNoInterface: {
- defaultMessage: 'No physical interface detected'
- },
- // ----- Host storage tabs -----
- addSrDeviceButton: {
- defaultMessage: 'Add a storage'
- },
- srNameLabel: {
- defaultMessage: 'Name'
- },
- srType: {
- defaultMessage: 'Type'
- },
- pdbStatus: {
- defaultMessage: 'Status'
- },
- pbdStatusConnected: {
- defaultMessage: 'Connected'
- },
- pbdStatusDisconnected: {
- defaultMessage: 'Disconnected'
- },
- srShared: {
- defaultMessage: 'Shared'
- },
- srNotShared: {
- defaultMessage: 'Not shared'
- },
- pbdNoSr: {
- defaultMessage: 'No storage detected'
- },
- // ----- Host patch tabs -----
- patchNameLabel: {
- defaultMessage: 'Name'
- },
- patchUpdateButton: {
- defaultMessage: 'Install all patches'
- },
- patchDescription: {
- defaultMessage: 'Description'
- },
- patchApplied: {
- defaultMessage: 'Release date'
- },
- patchSize: {
- defaultMessage: 'Size'
- },
- patchStatus: {
- defaultMessage: 'Status'
- },
- patchStatusApplied: {
- defaultMessage: 'Applied'
- },
- patchStatusNotApplied: {
- defaultMessage: 'Missing patches'
- },
- patchNothing: {
- defaultMessage: 'No patch detected'
- },
- patchReleaseDate: {
- defaultMessage: 'Release date'
- },
- patchGuidance: {
- defaultMessage: 'Guidance'
- },
- patchAction: {
- defaultMessage: 'Action'
- },
- hostInstalledPatches: {
- defaultMessage: 'Downloaded patches'
- },
- hostMissingPatches: {
- defaultMessage: 'Missing patches'
- },
- hostUpToDate: {
- defaultMessage: 'Host up-to-date!'
- },
-
- // ----- VM tabs -----
- generalTabName: {
- defaultMessage: 'General'
- },
- statsTabName: {
- defaultMessage: 'Stats'
- },
- consoleTabName: {
- defaultMessage: 'Console'
- },
- snapshotsTabName: {
- defaultMessage: 'Snapshots'
- },
- logsTabName: {
- defaultMessage: 'Logs'
- },
- advancedTabName: {
- defaultMessage: 'Advanced'
- },
- networkTabName: {
- defaultMessage: 'Network'
- },
- disksTabName: {
- defaultMessage: 'Disk{disks, plural, one {} other {s}}'
- },
-
- powerStateHalted: {
- defaultMessage: 'halted'
- },
- powerStateRunning: {
- defaultMessage: 'running'
- },
- powerStateSuspended: {
- defaultMessage: 'suspended'
- },
-
- // ----- VM home -----
- vmStatus: {
- defaultMessage: 'No Xen tools detected'
- },
- vmName: {
- defaultMessage: 'No IPv4 record'
- },
- vmDescription: {
- defaultMessage: 'No IP record'
- },
- vmSettings: {
- defaultMessage: 'Started {ago}'
- },
- vmCurrentStatus: {
- defaultMessage: 'Current status:'
- },
- vmNotRunning: {
- defaultMessage: 'Not running'
- },
-
- // ----- VM general tab -----
- noToolsDetected: {
- defaultMessage: 'No Xen tools detected'
- },
- noIpv4Record: {
- defaultMessage: 'No IPv4 record'
- },
- noIpRecord: {
- defaultMessage: 'No IP record'
- },
- started: {
- defaultMessage: 'Started {ago}'
- },
- paraVirtualizedMode: {
- defaultMessage: 'Paravirtualization (PV)'
- },
- hardwareVirtualizedMode: {
- defaultMessage: 'Hardware virtualization (HVM)'
- },
-
- // ----- VM stat tab -----
- statsCpu: {
- defaultMessage: 'CPU usage'
- },
- statsMemory: {
- defaultMessage: 'Memory usage'
- },
- statsNetwork: {
- defaultMessage: 'Network throughput'
- },
- statDisk: {
- defaultMessage: 'Disk throughput'
- },
- statLastTenMinutes: {
- defaultMessage: 'Last 10 minutes'
- },
- statLastTwoHours: {
- defaultMessage: 'Last 2 hours'
- },
- statLastWeek: {
- defaultMessage: 'Last week'
- },
- statLastYear: {
- defaultMessage: 'Last year'
- },
-
- // ----- VM console tab -----
- copyToClipboardLabel: {
- defaultMessage: 'Copy'
- },
- ctrlAltDelButtonLabel: {
- defaultMessage: 'Ctrl+Alt+Del'
- },
- tipLabel: {
- defaultMessage: 'Tip:'
- },
- tipConsoleLabel: {
- defaultMessage: 'non-US keyboard could have issues with console: switch your own layout to US.'
- },
-
- // ----- VM disk tab -----
- vdiAction: {
- defaultMessage: 'Action'
- },
- vdiAttachDeviceButton: {
- defaultMessage: 'Attach disk'
- },
- vbdCreateDeviceButton: {
- defaultMessage: 'New disk'
- },
- vdiBootOrder: {
- defaultMessage: 'Boot order'
- },
- vdiNameLabel: {
- defaultMessage: 'Name'
- },
- vdiNameDescription: {
- defaultMessage: 'Description'
- },
- vdiTags: {
- defaultMessage: 'Tags'
- },
- vdiSize: {
- defaultMessage: 'Size'
- },
- vdiSr: {
- defaultMessage: 'SR'
- },
- vdbBootableStatus: {
- defaultMessage: 'Boot flag'
- },
- vdbStatus: {
- defaultMessage: 'Status'
- },
- vbdStatusConnected: {
- defaultMessage: 'Connected'
- },
- vbdStatusDisconnected: {
- defaultMessage: 'Disconnected'
- },
- vbdNoVbd: {
- defaultMessage: 'No disks'
- },
-
- // ----- VM network tab -----
- vifCreateDeviceButton: {
- defaultMessage: 'New device'
- },
- vifNoInterface: {
- defaultMessage: 'No interface'
- },
- vifDeviceLabel: {
- defaultMessage: 'Device'
- },
- vifMacLabel: {
- defaultMessage: 'MAC address'
- },
- vifMtuLabel: {
- defaultMessage: 'MTU'
- },
- vifNetworkLabel: {
- defaultMessage: 'Network'
- },
- vifStatusLabel: {
- defaultMessage: 'Status'
- },
- vifStatusConnected: {
- defaultMessage: 'Connected'
- },
- vifStatusDisconnected: {
- defaultMessage: 'Disconnected'
- },
- vifIpAddresses: {
- defaultMessage: 'IP addresses'
- },
-
- // ----- VM snapshot tab -----
- noSnapshots: {
- defaultMessage: 'No snapshots'
- },
- snapshotCreateButton: {
- defaultMessage: 'New snapshot'
- },
- tipCreateSnapshotLabel: {
- defaultMessage: 'Just click on the snapshot button to create one!'
- },
- snapshotDate: {
- defaultMessage: 'Creation date'
- },
- snapshotName: {
- defaultMessage: 'Name'
- },
- snapshotAction: {
- defaultMessage: 'Action'
- },
-
- // ----- VM log tab -----
- logRemoveAll: {
- defaultMessage: 'Remove all logs'
- },
- noLogs: {
- defaultMessage: 'No logs so far'
- },
- logDate: {
- defaultMessage: 'Creation date'
- },
- logName: {
- defaultMessage: 'Name'
- },
- logContent: {
- defaultMessage: 'Content'
- },
- logAction: {
- defaultMessage: 'Action'
- },
-
- // ----- VM advanced tab -----
- vmRemoveButton: {
- defaultMessage: 'Remove'
- },
- vmConvertButton: {
- defaultMessage: 'Convert'
- },
- xenSettingsLabel: {
- defaultMessage: 'Xen settings'
- },
- guestOsLabel: {
- defaultMessage: 'Guest OS'
- },
- miscLabel: {
- defaultMessage: 'Misc'
- },
- uuid: {
- defaultMessage: 'UUID'
- },
- virtualizationMode: {
- defaultMessage: 'Virtualization mode'
- },
- cpuWeightLabel: {
- defaultMessage: 'CPU weight'
- },
- defaultCpuWeight: {
- defaultMessage: 'Default'
- },
- pvArgsLabel: {
- defaultMessage: 'PV args'
- },
- xenToolsStatus: {
- defaultMessage: 'Xen tools status'
- },
- xenToolsStatusValue: {
- defaultMessage: '{status}',
- description: 'status can be `not-installed`, `unknown`, `out-of-date` & `up-to-date`'
- },
- osName: {
- defaultMessage: 'OS name'
- },
- osKernel: {
- defaultMessage: 'OS kernel'
- },
- autoPowerOn: {
- defaultMessage: 'Auto power on'
- },
- ha: {
- defaultMessage: 'HA'
- },
- originalTemplate: {
- defaultMessage: 'Original template'
- },
- unknownOsName: {
- defaultMessage: 'Unknown'
- },
- unknownOsKernel: {
- defaultMessage: 'Unknown'
- },
- unknownOriginalTemplate: {
- defaultMessage: 'Unknown'
- },
- vmLimitsLabel: {
- defaultMessage: 'VM limits'
- },
- vmCpuLimitsLabel: {
- defaultMessage: 'CPU limits'
- },
- vmMemoryLimitsLabel: {
- defaultMessage: 'Memory limits (min/max)'
- },
- vmMaxVcpus: {
- defaultMessage: 'vCPUs max:'
- },
- vmMaxRam: {
- defaultMessage: 'Memory max:'
- },
-
- // ----- VM placeholders -----
-
- vmHomeNamePlaceholder: {
- defaultMessage: 'Long click to add a name'
- },
- vmHomeDescriptionPlaceholder: {
- defaultMessage: 'Long click to add a description'
- },
- vmViewNamePlaceholder: {
- defaultMessage: 'Click to add a name'
- },
- vmViewDescriptionPlaceholder: {
- defaultMessage: 'Click to add a description'
- },
-
- // ----- Dashboard -----
- poolPanel: {
- defaultMessage: 'Pool{pools, plural, one {} other {s}}'
- },
- hostPanel: {
- defaultMessage: 'Host{hosts, plural, one {} other {s}}'
- },
- vmPanel: {
- defaultMessage: 'VM{vms, plural, one {} other {s}}'
- },
- memoryStatePanel: {
- defaultMessage: 'RAM Usage'
- },
- cpuStatePanel: {
- defaultMessage: 'CPUs Usage'
- },
- vmStatePanel: {
- defaultMessage: 'VMs Power state'
- },
- taskStatePanel: {
- defaultMessage: 'Pending tasks'
- },
- usersStatePanel: {
- defaultMessage: 'Users'
- },
- srStatePanel: {
- defaultMessage: 'Storage state'
- },
- ofUsage: {
- defaultMessage: 'of'
- },
- noSrs: {
- defaultMessage: 'No storage'
- },
- srName: {
- defaultMessage: 'Name'
- },
- srPool: {
- defaultMessage: 'Pool'
- },
- srHost: {
- defaultMessage: 'Host'
- },
- srFormat: {
- defaultMessage: 'Type'
- },
- srSize: {
- defaultMessage: 'Size'
- },
- srUsage: {
- defaultMessage: 'Usage'
- },
- srUsed: {
- defaultMessage: 'used'
- },
- srFree: {
- defaultMessage: 'free'
- },
- srUsageStatePanel: {
- defaultMessage: 'Storage Usage'
- },
- srTopUsageStatePanel: {
- defaultMessage: 'Top 5 SR Usage (in %)'
- },
-
- // --- Stats board --
- weekHeatmapData: {
- defaultMessage: '{value} {date, date, medium}'
- },
- weekHeatmapNoData: {
- defaultMessage: 'No data.'
- },
- statsDashboardGenericErrorTitle: {
- defaultMessage: 'Stats error'
- },
- statsDashboardGenericErrorMessage: {
- defaultMessage: 'There is no stats available for:'
- },
- noSelectedMetric: {
- defaultMessage: 'No selected metric'
- },
- statsDashboardSelectObjects: {
- defaultMessage: 'Select'
- },
- metricsLoading: {
- defaultMessage: 'Loading…'
- },
-
- // ----- Visualizations -----
- comingSoon: {
- defaultMessage: 'Coming soon!'
- },
-
- // ----- Health -----
- orphanedVdis: {
- defaultMessage: 'Orphaned VDIs'
- },
- orphanedVms: {
- defaultMessage: 'Orphaned VMs'
- },
- noOrphanedObject: {
- defaultMessage: 'No orphans'
- },
- removeAllOrphanedObject: {
- defaultMessage: 'Remove all orphaned VDIs'
- },
- vmNameLabel: {
- defaultMessage: 'Name'
- },
- vmNameDescription: {
- defaultMessage: 'Description'
- },
- vmContainer: {
- defaultMessage: 'Resident on'
- },
- alarmMessage: {
- defaultMessage: 'Alarms'
- },
- noAlarms: {
- defaultMessage: 'No alarms'
- },
- alarmDate: {
- defaultMessage: 'Date'
- },
- alarmContent: {
- defaultMessage: 'Content'
- },
- alarmObject: {
- defaultMessage: 'Issue on'
- },
- alarmPool: {
- defaultMessage: 'Pool'
- },
- alarmRemoveAll: {
- defaultMessage: 'Remove all alarms'
- },
-
- // ----- New VM -----
- newVmCreateNewVmOn: {
- defaultMessage: 'Create a new VM on {pool}'
- },
- newVmInfoPanel: {
- defaultMessage: 'Infos'
- },
- newVmNameLabel: {
- defaultMessage: 'Name'
- },
- newVmTemplateLabel: {
- defaultMessage: 'Template'
- },
- newVmDescriptionLabel: {
- defaultMessage: 'Description'
- },
- newVmPerfPanel: {
- defaultMessage: 'Performances'
- },
- newVmVcpusLabel: {
- defaultMessage: 'vCPUs'
- },
- newVmRamLabel: {
- defaultMessage: 'RAM'
- },
- newVmInstallSettingsPanel: {
- defaultMessage: 'Install settings'
- },
- newVmIsoDvdLabel: {
- defaultMessage: 'ISO/DVD'
- },
- newVmNetworkLabel: {
- defaultMessage: 'Network'
- },
- newVmPvArgsLabel: {
- defaultMessage: 'PV Args'
- },
- newVmPxeLabel: {
- defaultMessage: 'PXE'
- },
- newVmInterfacesPanel: {
- defaultMessage: 'Interfaces'
- },
- newVmMacLabel: {
- defaultMessage: 'MAC'
- },
- newVmAddInterface: {
- defaultMessage: 'Add interface'
- },
- newVmDisksPanel: {
- defaultMessage: 'Disks'
- },
- newVmSrLabel: {
- defaultMessage: 'SR'
- },
- newVmBootableLabel: {
- defaultMessage: 'Bootable'
- },
- newVmSizeLabel: {
- defaultMessage: 'Size'
- },
- newVmAddDisk: {
- defaultMessage: 'Add disk'
- },
- newVmSummaryPanel: {
- defaultMessage: 'Summary'
- },
- newVmCreate: {
- defaultMessage: 'Create'
- },
- newVmReset: {
- defaultMessage: 'Reset'
- },
- newVmSelectTemplate: {
- defaultMessage: 'Select template'
- },
- newVmSshKey: {
- defaultMessage: 'SSH key'
- },
- newVmConfigDrive: {
- defaultMessage: 'Config drive'
- },
- newVmCustomConfig: {
- defaultMessage: 'Custom config'
- },
- newVmBootAfterCreate: {
- defaultMessage: 'Boot VM after creation'
- },
- newVmMacPlaceholder: {
- defaultMessage: 'Auto-generated if empty'
- },
- newVmCpuWeightLabel: {
- defaultMessage: 'CPU weight'
- },
- newVmCpuWeightQuarter: {
- defaultMessage: 'Quarter (1/4)'
- },
- newVmCpuWeightHalf: {
- defaultMessage: 'Half (1/2)'
- },
- newVmCpuWeightNormal: {
- defaultMessage: 'Normal'
- },
- newVmCpuWeightDouble: {
- defaultMessage: 'Double (x2)'
- },
- newVmCloudConfig: {
- defaultMessage: 'Cloud config'
- },
-
- // ----- Self -----
- resourceSets: {
- defaultMessage: 'Resource sets'
- },
- resourceSetName: {
- defaultMessage: 'Resource set name'
- },
- resourceSetCreation: {
- defaultMessage: 'Creation and edition'
- },
- saveResourceSet: {
- defaultMessage: 'Save'
- },
- resetResourceSet: {
- defaultMessage: 'Reset'
- },
- editResourceSet: {
- defaultMessage: 'Edit'
- },
- deleteResourceSet: {
- defaultMessage: 'Delete'
- },
- deleteResourceSetWarning: {
- defaultMessage: 'Delete resource set'
- },
- deleteResourceSetQuestion: {
- defaultMessage: 'Are you sure you want to delete this resource set?'
- },
- resourceSetMissingObjects: {
- defaultMessage: 'Missing objects:'
- },
- resourceSetVcpus: {
- defaultMessage: 'vCPUs'
- },
- resourceSetMemory: {
- defaultMessage: 'Memory'
- },
- resourceSetStorage: {
- defaultMessage: 'Storage'
- },
- unknownResourceSetValue: {
- defaultMessage: 'Unknown'
- },
- availableHosts: {
- defaultMessage: 'Available hosts'
- },
- excludedHosts: {
- defaultMessage: 'Excluded hosts'
- },
- noHostsAvailable: {
- defaultMessage: 'No hosts available.'
- },
- availableHostsDescription: {
- defaultMessage: 'VMs created from this resource set shall run on the following hosts.'
- },
- maxCpus: {
- defaultMessage: 'Maximum CPUs'
- },
- maxRam: {
- defaultMessage: 'Maximum RAM (GiB)'
- },
- maxDiskSpace: {
- defaultMessage: 'Maximum disk space'
- },
- noResourceSetLimits: {
- defaultMessage: 'No limits.'
- },
- totalResource: {
- defaultMessage: 'Total:'
- },
- remainingResource: {
- defaultMessage: 'Remaining:'
- },
- usedResource: {
- defaultMessage: 'Used:'
- },
-
- // ---- VM import ---
- importVmsList: {
- defaultMessage: 'Try dropping some backups here, or click to select backups to upload. Accept only .xva files.'
- },
- noSelectedVms: {
- defaultMessage: 'No selected VMs.'
- },
- vmImportToPool: {
- defaultMessage: 'To Pool:'
- },
- vmImportToSr: {
- defaultMessage: 'To SR:'
- },
- vmsToImport: {
- defaultMessage: 'VMs to import'
- },
- importVmsCleanList: {
- defaultMessage: 'Reset'
- },
- vmImportSuccess: {
- defaultMessage: 'VM import success'
- },
- vmImportFailed: {
- defaultMessage: 'VM import failed'
- },
- startVmImport: {
- defaultMessage: 'Import starting…'
- },
- startVmExport: {
- defaultMessage: 'Export starting…'
- },
-
- // ---- Tasks ---
- noTasks: {
- defaultMessage: 'No pending tasks'
- },
- xsTasks: {
- defaultMessage: 'Currently, there isn\'t any pending XenServer tasks'
- },
-
- // ---- Backup views ---
- delta: {
- defaultMessage: 'delta'
- },
- restoreBackups: {
- defaultMessage: 'Restore Backups'
- },
- noRemotes: {
- defaultMessage: 'No remotes'
- },
- remoteEnabled: {
- defaultMessage: 'enabled'
- },
- remoteError: {
- defaultMessage: 'error'
- },
- noBackup: {
- defaultMessage: 'No backups available'
- },
-
- // ----- Modals -----
- startVmsModalTitle: {
- defaultMessage: 'Start VM{vms, plural, one {} other {s}}'
- },
- startVmsModalMessage: {
- defaultMessage: 'Are you sure you want to start {vms} VM{vms, plural, one {} other {s}}?'
- },
- stopVmsModalTitle: {
- defaultMessage: 'Stop VM{vms, plural, one {} other {s}}'
- },
- stopVmsModalMessage: {
- defaultMessage: 'Are you sure you want to stop {vms} VM{vms, plural, one {} other {s}}?'
- },
- restartVmsModalTitle: {
- defaultMessage: 'Restart VM{vms, plural, one {} other {s}}'
- },
- restartVmsModalMessage: {
- defaultMessage: 'Are you sure you want to restart {vms} VM{vms, plural, one {} other {s}}?'
- },
- snapshotVmsModalTitle: {
- defaultMessage: 'Snapshot VM{vms, plural, one {} other {s}}'
- },
- snapshotVmsModalMessage: {
- defaultMessage: 'Are you sure you want to snapshot {vms} VM{vms, plural, one {} other {s}}?'
- },
- deleteVmModalTitle: {
- defaultMessage: 'Delete VM'
- },
- deleteVmsModalTitle: {
- defaultMessage: 'Delete VM{vms, plural, one {} other {s}}'
- },
- deleteVmModalMessage: {
- defaultMessage: 'Are you sure you want to delete this VM? ALL VM DISKS WILL BE REMOVED'
- },
- deleteVmsModalMessage: {
- defaultMessage: 'Are you sure you want to delete {vms} VM{vms, plural, one {} other {s}}? ALL VM DISKS WILL BE REMOVED'
- },
- migrateVmModalTitle: {
- defaultMessage: 'Migrate VM'
- },
- migrateVmModalBody: {
- defaultMessage: 'Are you sure you want to migrate this VM to {hostName}?'
- },
- migrateVmAdvancedModalSelectHost: {
- defaultMessage: 'Select a destination host:'
- },
- migrateVmAdvancedModalSelectNetwork: {
- defaultMessage: 'Select a migration network:'
- },
- migrateVmAdvancedModalSelectSrs: {
- defaultMessage: 'For each VDI, select an SR:'
- },
- migrateVmAdvancedModalSelectNetworks: {
- defaultMessage: 'For each VIF, select a network:'
- },
- migrateVmAdvancedModalName: {
- defaultMessage: 'Name'
- },
- migrateVmAdvancedModalSr: {
- defaultMessage: 'SR'
- },
- migrateVmAdvancedModalVif: {
- defaultMessage: 'VIF'
- },
- migrateVmAdvancedModalNetwork: {
- defaultMessage: 'Network'
- },
- importBackupModalTitle: {
- defaultMessage: 'Import a {name} Backup'
- },
- importBackupModalStart: {
- defaultMessage: 'Start VM after restore'
- },
- importBackupModalSelectBackup: {
- defaultMessage: 'Select your backup…'
- },
- removeAllOrphanedModalWarning: {
- defaultMessage: 'Are you sure you want to remove all orphaned VDIs?'
- },
- removeAllLogsModalTitle: {
- defaultMessage: 'Remove all logs'
- },
- removeAllLogsModalWarning: {
- defaultMessage: 'Are you sure you want to remove all logs?'
- },
- definitiveMessageModal: {
- defaultMessage: 'This operation is definitive.'
- },
- existingSrModalTitle: {
- defaultMessage: 'Previous SR Usage'
- },
- existingSrModalText: {
- defaultMessage: 'This path has been previously used as a Storage by a XenServer host. All data will be lost if you choose to continue the SR creation.'
- },
- existingLunModalTitle: {
- defaultMessage: 'Previous LUN Usage'
- },
- existingLunModalText: {
- defaultMessage: 'This LUN has been previously used as a Storage by a XenServer host. All data will be lost if you choose to continue the SR creation.'
- },
- alreadyRegisteredModal: {
- defaultMessage: 'Replace current registration?'
- },
- alreadyRegisteredModalText: {
- defaultMessage: 'Your XO appliance is already registered to {email}, do you want to forget and replace this registration ?'
- },
- trialReadyModal: {
- defaultMessage: 'Ready for trial?'
- },
- trialReadyModalText: {
- defaultMessage: 'During the trial period, XOA need to have a working internet connection. This limitation does not apply for our paid plans!'
- },
-
- // ----- Servers -----
- serverHost: 'Host',
- serverUsername: 'Username',
- serverPassword: 'Password',
- serverAction: 'Action',
- serverReadOnly: 'Read Only',
-
- // ----- Copy VM -----
- copyVm: {
- defaultMessage: 'Copy VM'
- },
- copyVmConfirm: {
- defaultMessage: 'Are you sure you want to copy this VM to {SR}?'
- },
- copyVmName: {
- defaultMessage: 'Name'
- },
- copyVmNamePlaceholder: {
- defaultMessage: 'If empty: name of the copied VM'
- },
- copyVmSelectSr: {
- defaultMessage: 'Select SR'
- },
- copyVmCompress: {
- defaultMessage: 'Use compression'
- },
-
- // ----- Network -----
- newNetworkCreate: {
- defaultMessage: 'Create network'
- },
- newNetworkInterface: {
- defaultMessage: 'Interface'
- },
- newNetworkName: {
- defaultMessage: 'Name'
- },
- newNetworkDescription: {
- defaultMessage: 'Description'
- },
- newNetworkVlan: {
- defaultMessage: 'VLAN'
- },
- newNetworkDefaultVlan: {
- defaultMessage: 'No VLAN if empty'
- },
- newNetworkMtu: {
- defaultMessage: 'MTU'
- },
- newNetworkDefaultMtu: {
- defaultMessage: 'Default: 1500'
- },
- deleteNetwork: {
- defaultMessage: 'Delete network'
- },
- deleteNetworkConfirm: {
- defaultMessage: 'Are you sure you want to delete this network?'
- },
-
- // ----- About View -----
- xenOrchestra: {
- defaultMessage: 'Xen Orchestra'
- },
- xenOrchestraServer: {
- defaultMessage: 'server'
- },
- xenOrchestraWeb: {
- defaultMessage: 'web client'
- },
- noProSupport: {
- defaultMessage: 'No pro support provided!'
- },
- noProductionUse: {
- defaultMessage: 'Use in production at your own risks'
- },
- downloadXoa: {
- defaultMessage: 'You can download our turnkey appliance at'
- },
- bugTracker: {
- defaultMessage: 'Bug Tracker'
- },
- bugTrackerText: {
- defaultMessage: 'Issues? Report it!'
- },
- community: {
- defaultMessage: 'Community'
- },
- communityText: {
- defaultMessage: 'Join our community forum!'
- },
- freeTrial: {
- defaultMessage: 'Free Trial for Premium Edition!'
- },
- freeTrialNow: {
- defaultMessage: 'Request your trial now!'
- },
- issues: {
- defaultMessage: 'Any issue?'
- },
- issuesText: {
- defaultMessage: 'Problem? Contact us!'
- },
- documentation: {
- defaultMessage: 'Documentation'
- },
- documentationText: {
- defaultMessage: 'Read our official doc'
- },
- proSupportIncluded: {
- defaultMessage: 'Pro support included'
- },
- xoAccount: {
- defaultMessage: 'Acces your XO Account'
- },
- openTicket: {
- defaultMessage: 'Report a problem'
- },
- openTicketText: {
- defaultMessage: 'Problem? Open a ticket !'
- },
-
- // ----- Upgrade Panel -----
- upgradeNeeded: {
- defaultMessage: 'Upgrade needed'
- },
- upgradeNow: {
- defaultMessage: 'Upgrade now!'
- },
- or: {
- defaultMessage: 'Or'
- },
- tryIt: {
- defaultMessage: 'Try it for free!'
- },
- availableIn: {
- defaultMessage: 'This feature is available starting from {plan} Edition'
- },
-
- // ----- Updates View -----
- registration: {
- defaultMessage: 'Registration'
- },
- trial: {
- defaultMessage: 'Trial'
- },
- settings: {
- defaultMessage: 'Settings'
- },
- update: {
- defaultMessage: 'Update'
- },
- upgrade: {
- defaultMessage: 'Upgrade'
- },
- noUpdaterCommunity: {
- defaultMessage: 'No updater available for Community Edition'
- },
- noUpdaterSubscribe: {
- defaultMessage: 'Please consider subscribe and try it with all features for free during 15 days on'
- },
- noUpdaterWarning: {
- defaultMessage: 'Manual update could break your current installation due to dependencies issues, do it with caution'
- },
- currentVersion: {
- defaultMessage: 'Current version:'
- },
- register: {
- defaultMessage: 'Register'
- },
- trialRegistration: {
- defaultMessage: 'Please, take time to register in order to enjoy your trial.'
- },
- trialStartButton: {
- defaultMessage: 'Start trial'
- },
- trialAvailableUntil: {
- defaultMessage: 'You can use a trial version until {date, date, medium}. Upgrade your appliance to get it.'
- },
- trialConsumed: {
- defaultMessage: 'Your trial has been ended. Contact us or downgrade to Free version'
- },
- trialLocked: {
- defaultMessage: 'Your xoa-updater service appears to be down. Your XOA cannot run fully without reaching this service.'
- },
-
- // ----- OS Disclaimer -----
- disclaimerTitle: {
- defaultMessage: 'Xen Orchestra from the sources'
- },
- disclaimerText1: {
- defaultMessage: 'You are using XO from the sources! That\'s great for a personal/non-profit usage.'
- },
- disclaimerText2: {
- defaultMessage: 'If you are a company, it\'s better to use it with our appliance + pro support included:'
- },
- disclaimerText3: {
- defaultMessage: 'This version is not bundled with any support nor updates. Use it with caution for critical tasks.'
- },
-
- // ----- PIF -----
- connectPif: {
- defaultMessage: 'Connect PIF'
- },
- connectPifConfirm: {
- defaultMessage: 'Are you sure you want to connect this PIF?'
- },
- disconnectPif: {
- defaultMessage: 'Disconnect PIF'
- },
- disconnectPifConfirm: {
- defaultMessage: 'Are you sure you want to disconnect this PIF?'
- },
- deletePif: {
- defaultMessage: 'Delete PIF'
- },
- deletePifConfirm: {
- defaultMessage: 'Are you sure you want to delete this PIF?'
- }
-}
-forEach(messages, (message, id) => {
- if (isString(message)) {
- messages[id] = {
- id,
- defaultMessage: message
- }
- } else if (!message.id) {
- message.id = id
- }
-})
-
-const localizedMessages = {}
-
-addLocaleData(frLocaleData)
-localizedMessages.fr = {
- ok: 'OK',
- cancel: 'Annuler',
- editableLongClickPlaceholder: 'Clic long pour éditer',
- editableClickPlaceholder: 'Cliquer pour éditer',
- // ----- General Menu -----
- dashboardPage: 'Tableau de bord',
- overviewDashboardPage: 'Vue d\'ensemble',
- overviewVisualizationDashboardPage: 'Visualisations',
- overviewStatsDashboardPage: 'Statistiques',
- overviewHealthDashboardPage: 'État de santé',
- selfServicePage: 'Self service',
- selfServiceDashboardPage: 'Tableau de bord',
- settingsServersPage: 'Serveurs',
- settingsUsersPage: 'Utilisateurs',
- settingsGroupsPage: 'Groupes',
- settingsAclsPage: 'ACLs',
- settingsPluginsPage: 'Extensions',
- selfServiceAdminPage: 'Administration',
- backupPage: 'Sauvegarde',
- backupOverviewPage: 'Vue d\'ensemble',
- backupNewPage: 'Créer',
- backupRemotesPage: 'Emplacement',
- backupRestorePage: 'Restaurer',
- updatePage: 'Mises à jour',
- settingsPage: 'Paramètres',
- aboutPage: 'À propos',
- newMenu: 'Nouveau',
- newVmPage: 'VM',
- newServerPage: 'Serveur',
- newSrPage: 'Stockage',
- newImport: 'Importer',
- // ----- Home view -----
- homeDisplayedVms: '{displayed}x {vmIcon} (sur {total})',
- homeSelectedVms: '{selected}x {vmIcon} sélectionnée{selected, plural, zero {} one {} other {s}} (sur {total})',
- homeMigrateTo: 'Migrer sur…',
- // ----- General Stuff -----
- homePage: 'Accueil',
- usernameLabel: 'Nom :',
- passwordLabel: 'Mot de passe :',
- signInButton: 'Connexion',
- signOut: 'Déconnexion',
- add: 'Ajouter',
- remove: 'Supprimer',
- schedule: 'Plan',
- newVmBackup: 'Nouvelle sauvegarde de VM',
- editVmBackup: 'Edition d\'un job de backup',
- backup: 'Sauvegarde',
- rollingSnapshot: 'Sauvegarde continue',
- deltaBackup: 'Sauvegarde différentielle',
- disasterRecovery: 'Reprise après panne',
- continuousReplication: 'Réplication continue',
- preview: 'Aperçu',
- item: 'Objet',
- noSelectedValue: 'Pas de valeur sélectionnée',
- selectSubjects: 'Select. utilisateurs et/ou groupe(s)',
- selectHosts: 'Selectionner Hôte(s)…',
- selectNetworks: 'Selectionner Network(s)…',
- selectPifs: 'Sélectionner PIF(s)…',
- selectHostsVms: 'Selectionner objet(s)…',
- selectPools: 'Selectionner Pool(s)…',
- selectRemotes: 'Selectionner Remote(s)…',
- selectSrs: 'Selectionner Stockages(s)…',
- selectVms: 'Selectionner VM(s)…',
- selectVmTemplates: 'Selectionner patrons de VM…',
- selectTags: 'Selectionner tag(s)…',
- selectVdis: 'Selectionner disque(s)…',
- fillRequiredInformations: 'Remplir les champs requis.',
- fillOptionalInformations: 'Remplir informations (optionnel)',
- selectTableReset: 'Réinitialiser',
- schedulingMonth: 'Mois',
- schedulingEveryMonth: 'Tous les mois',
- schedulingEachSelectedMonth: 'Chaque mois sélectionné',
- schedulingMonthDay: 'Jour du mois',
- schedulingEveryMonthDay: 'Tous les jours',
- schedulingEachSelectedMonthDay: 'Chaque jour sélectionné',
- schedulingWeekDay: 'Jour de la semaine',
- schedulingEveryWeekDay: 'Tous les jours',
- schedulingEachSelectedWeekDay: 'Chaque jour sélectionné',
- schedulingHour: 'Heure',
- schedulingEveryHour: 'Toutes les heures',
- schedulingEveryNHour: 'Toutes les N heures',
- schedulingEachSelectedHour: 'Chaque heure sélectionnée',
- schedulingMinute: 'Minute',
- schedulingEveryMinute: 'Toutes les minutes',
- schedulingEveryNMinute: 'Toutes les N minutes',
- schedulingEachSelectedMinute: 'Chaque minute sélectionnée',
- schedulingReset: 'Reset',
- unknownSchedule: 'Inconnu',
- job: 'Job',
- jobTag: 'Tag',
- jobScheduling: 'Plan d\'exécution',
- jobState: 'Etat',
- runJob: 'Execution d\'un job',
- runJobVerbose: 'Une exécution a été lancée. Voir l\'overview pour plus de détails.',
- jobStarted: 'Démarré',
- jobFinished: 'Terminé',
- saveBackupJob: 'Sauvegarder',
- deleteJob: 'Supprimer Job',
- deleteJobQuestion: 'Etes-vous sûr de vouloir supprimer ce job ?',
- noScheduledJobs: 'Aucun job programmé.',
- newBackupSelection: 'Sélectionner votre type de sauvegarde :',
- autoloadPlugin: 'Charger au démarrage du serveur',
- savePluginConfiguration: 'Sauvegarder config.',
- deletePluginConfiguration: 'Supprimer config.',
- pluginError: 'Erreur plugin',
- unknownPluginError: 'Erreur inconnue',
- purgePluginConfiguration: 'Suppression de la config. du plugin',
- purgePluginConfigurationQuestion: 'Etes-vous sûr de vouloir supprimer la configuration de ce plugin ?',
- editPluginConfiguration: 'Editer',
- cancelPluginEdition: 'Annuler',
- pluginConfigurationSuccess: 'Configuration du plugin',
- pluginConfigurationChanges: 'La configuration du plugin a été sauvegardée !',
- startVmLabel: 'Démarrer',
- recoveryModeLabel: 'Démarrer en mode sans échec',
- suspendVmLabel: 'Suspendre',
- stopVmLabel: 'Arrêter',
- forceShutdownVmLabel: 'Forcer l\'arrêt',
- rebootVmLabel: 'Redémarrer',
- forceRebootVmLabel: 'Forcer le redémarrage',
- deleteVmLabel: 'Supprimer',
- migrateVmLabel: 'Migrer',
- snapshotVmLabel: 'Prendre un instantané',
- exportVmLabel: 'Exporter',
- copyVmLabel: 'Copier',
- cloneVmLabel: 'Cloner',
- convertToTemplateLabel: 'Convertir en modèle',
- // ----- host tab names -----
- storageTabName: 'Stockage',
- patchesTabName: 'Patches',
- // ----- host advanced tab -----
- hardwareHostSettingsLabel: 'Matériel',
- hostAddress: 'Adresse',
- hostStatus: 'Statut',
- hostBuildNumber: 'Numéro de build',
- hostIscsiName: 'Nom iSCSI',
- hostXenServerVersion: 'Version',
- hostStatusEnabled: 'Activé',
- hostStatusDisabled: 'Désactivé',
- hostPowerOnMode: 'Mode d\'allumage',
- powerOnDisabled: 'Désactivé',
- hostStartedSince: 'Système',
- hostStackStartedSince: 'XAPI',
- hostCpusModel: 'Modèle de processeur',
- hostCpusNumber: 'Cœur (socket)',
- hostManufacturerinfo: 'Informations constructeur',
- hostBiosinfo: 'Informations BIOS',
- licenseHostSettingsLabel: 'Licence',
- hostLicenseType: 'Type de licence',
- hostLicenseSocket: 'Nombre de socket',
- hostLicenseExpiry: 'Expiration',
- // ----- VM stat tab -----
- statLoad: 'Charge système',
- // ----- VM tab names -----
- vmConsoleLabel: 'Console',
- generalTabName: 'Général',
- statsTabName: 'Stats',
- consoleTabName: 'Console',
- snapshotsTabName: 'Instantanés',
- logsTabName: 'Journaux',
- advancedTabName: 'Avancé',
- networkTabName: 'Réseau',
- disksTabName: 'Disque{disks, plural, zero {} one {} other {s}}',
- powerStateHalted: 'arrêtée',
- powerStateRunning: 'en marche',
- started: 'Démarrée {ago}',
- noToolsDetected: 'Pas d\'outils Xen détectés',
- noIpv4Record: 'Aucune IPv4',
- noIpRecord: 'Aucune IP',
- virtualizationMode: 'Mode de virtualisation',
- // ----- VM stat tab -----
- statsCpu: 'Utilisation processeur',
- statsMemory: 'Utilisation mémoire',
- statsNetwork: 'Débit réseau',
- statDisk: 'Débit disque',
- statLastTenMinutes: 'Il y a 10 minutes',
- statLastTwoHours: 'Il y a 2 heures',
- statLastWeek: 'La semaine dernière',
- statLastYear: 'L\'année dernière',
- // ----- VM console tab -----
- copyToClipboardLabel: 'Copier',
- ctrlAltDelButtonLabel: 'Ctrl+Alt+Suppr',
- tipLabel: 'Conseil :',
- tipConsoleLabel: 'Les agencements de clavier hors États-Unis ont des problèmes avec la console: passez le votre en "US".',
- // ----- VM disk tab -----
- vdiAttachDeviceButton: 'Brancher un disque',
- vbdCreateDeviceButton: 'Nouveau disque',
- vdiBootOrder: 'Ordre de démarrage',
- vdiNameLabel: 'Nom',
- vdiNameDescription: 'Déscription',
- vdiTags: 'Tags',
- vdiSize: 'Taille',
- vdiSr: 'Stockage',
- vdbBootableStatus: 'Démarrable ?',
- vdbBootable: 'Démarrable',
- vdbNotBootable: 'Non démarrable',
- vdbStatus: 'Statut',
- vbdStatusConnected: 'Connecté',
- vbdStatusDisconnected: 'Déconnecté',
- vbdNoVbd: 'Pas de disque',
- // ----- VM network tab -----
- vifCreateDeviceButton: 'Nouvelle interface',
- vifNoInterface: 'Aucune interface',
- vifDeviceLabel: 'Interface',
- vifMacLabel: 'Adresse physique',
- vifMtuLabel: 'MTU',
- vifNetworkLabel: 'Réseau',
- vifStatusLabel: 'Statut',
- vifStatusConnected: 'Connecté',
- vifStatusDisconnected: 'Déconnecté',
- // ----- VM snapshot tab -----
- noSnapshot: 'Aucun instantané',
- snapshotCreateButton: 'Nouvel instantané',
- tipCreateSnapshotLabel: 'Cliquez sur le bouton pour en créer un !',
- snapshotDate: 'Date de l\'instantané',
- snapshotName: 'Nom',
- snapshotAction: 'Action',
- // ----- VM log tab -----
- logRemoveAll: 'Supprimer tous les journaux',
- noLogs: 'Aucun journal pour l\'instant',
- logDate: 'Date du journal',
- logName: 'Nom',
- logContent: 'Contenu',
- logAction: 'Action',
- // ----- VM advanced tab -----
- uuid: 'Identifiant unique',
- miscLabel: 'Divers',
- xenSettingsLabel: 'Paramètres Xen',
- guestOsLabel: 'Système d\'exploitatation',
- paraVirtualizedMode: 'Paravirtualisation (PV)',
- hardwareVirtualizedMode: 'Virtualisation matérielle (HVM)',
- xenToolsStatus: 'État des outils Xen',
- xenToolsStatusValue: `{status, select,
- unknown {Inconnu}
- up-to-date {À jour}
- out-of-date {Obsolètes}
- not-installed {Pas installés}
- }`,
- osName: 'Nom du système d\'exploitation',
- cpuWeightLabel: 'Poids CPU',
- defaultCpuWeight: 'Par défaut',
- osKernel: 'Noyau du système d\'exploitation',
- autoPowerOn: 'Démarrage automatique',
- ha: 'Haute disponibilité',
- originalTemplate: 'Modèle d\'origine',
- unknownOsName: 'Inconnu',
- unknownOsKernel: 'Inconnu',
- vmLimitsLabel: 'Limites',
- vmCpuLimitsLabel: 'Limites processeur',
- vmMemoryLimitsLabel: 'Limites mémoire',
- unknownOriginalTemplate: 'Inconnu',
- // ----- VM placholders -----
- vmHomeNamePlaceholder: 'Clic long pour ajouter un nom',
- vmHomeDescriptionPlaceholder: 'Clic long pour ajouter une description',
- vmViewNamePlaceholder: 'Cliquer pour ajouter un nom',
- vmViewDescriptionPlaceholder: 'Cliquer pour ajouter une description',
-
- // ----- Dashboard -----
- poolPanel: 'Pool{pools, plural, zero {} one {} other {s}}',
- hostPanel: 'Hôte{hosts, plural, zero {} one {} other {s}}',
- vmPanel: 'VM{vms, plural, zero {} one {} other {s}}',
- memoryStatePanel: 'Utilisation mémoire',
- cpuStatePanel: 'Attribution CPU',
- srUsageStatePanel: 'Utilisation du stockage',
- vmStatePanel: 'État des VMs',
- srStatePanel: 'État du stockage',
- taskStatePanel: 'Tâches en cours',
- usersStatePanel: 'Utilisateurs',
- ofUsage: 'sur',
- noSrs: 'Aucun stockage',
- srName: 'Nom',
- srPool: 'Pool',
- srHost: 'Hôte',
- srFormat: 'Type',
- srSize: 'Taille',
- srUsage: 'Utilisation',
- srTopUsageStatePanel: 'Top 5 d\'utilisation des stockages (en %)',
- // --- Stats board --
- weekHeatmapNoData: 'Pas de données.',
- statsDashboardGenericErrorTitle: 'Erreur stats',
- statsDashboardGenericErrorMessage: 'Pas de stats disponibles pour :',
- noSelectedMetric: 'Pas de métrique sélectionnée',
- statsDashboardSelectObjects: 'Valider',
- metricsLoading: 'Chargement…',
- // ----- Health -----
- orphanedVdis: 'Disques orphelins',
- orphanedVms: 'VM orphelines',
- noOrphanedObject: 'Pas d\'orphelin',
- vmNameLabel: 'Nom',
- vmNameDescription: 'Description',
- vmContainer: 'Présent sur',
- alarmMessage: 'Alarmes',
- noAlarms: 'Aucune alarme',
- alarmDate: 'Date',
- alarmContent: 'Contenu',
- alarmObject: 'Concernant',
- alarmPool: 'Pool',
- alarmRemoveAll: 'Supprimer toutes les alarmes',
- // ----- New VM -----
- newVmCreateNewVmOn: 'Créer une nouvelle VM sur {pool}',
- newVmInfoPanel: 'Informations',
- newVmNameLabel: 'Nom',
- newVmTemplateLabel: 'Modèle',
- newVmDescriptionLabel: 'Description',
- newVmPerfPanel: 'Performances',
- newVmVcpusLabel: 'vCPUs',
- newVmRamLabel: 'RAM',
- newVmInstallSettingsPanel: 'Paramètres d\'installation',
- newVmIsoDvdLabel: 'ISO/DVD',
- newVmNetworkLabel: 'Network',
- newVmPvArgsLabel: 'PV Args',
- newVmPxeLabel: 'PXE',
- newVmInterfacesPanel: 'Interfaces',
- newVmMacLabel: 'MAC',
- newVmAddInterface: 'Ajouter une interface',
- newVmDisksPanel: 'Disques',
- newVmSrLabel: 'SR',
- newVmBootableLabel: 'Amorçable',
- newVmSizeLabel: 'Taille',
- newVmAddDisk: 'Ajouter un disque',
- newVmSummaryPanel: 'Résumé',
- newVmCreate: 'Créer',
- newVmReset: 'Effacer',
- newVmSelectTemplate: 'Sélectionner un template',
- newVmSshKey: 'Clé SSH',
- newVmCustomConfig: 'Configuration personnalisée',
- newVmBootAfterCreate: 'Démarrer la VM après sa création',
- newVmMacPlaceholder: 'Auto-généré si vide',
- newVmCpuWeightLabel: 'Poids CPU',
- newVmCpuWeightQuarter: 'Quart (1/4)',
- newVmCpuWeightHalf: 'Moitié (1/2)',
- newVmCpuWeightNormal: 'Normal',
- newVmCpuWeightDouble: 'Double (x2)',
-
- // ---- VM import ---
- importVmsList: 'Glissez des backups ici ou cliquez pour sélectionner des backups à envoyer. Accepte seulement les fichiers .xva.',
- noSelectedVms: 'Pas de VMs sélectionnées.',
- vmImportToPool: 'Sur le Pool:',
- vmImportToSr: 'Sur le SR:',
- vmsToImport: 'VMs à importer',
- importVmsCleanList: 'Reset',
- vmImportSuccess: 'Import de VM réussi',
- vmImportFailed: 'Import de VM échoué',
- startVmImport: 'Lancement de l\'import…',
- startVmExport: 'Lancement de l\'export…',
- // ----- Modals -----
- startVmsModalTitle: 'Démarrer {vms, plural, one {la} other {les}} VM{vms, plural, one {} other {s}}',
- startVmsModalMessage: 'Voulez-vous vraiment démarrer {vms} VM{vms, plural, one {} other {s}} ?',
- stopVmsModalTitle: 'Arrêter {vms, plural, one {la} other {les}} VM{vms, plural, one {} other {s}}',
- stopVmsModalMessage: 'Voulez-vous vraiment arrêter {vms} VM{vms, plural, one {} other {s}} ?',
- restartVmsModalTitle: 'Redémarrer {vms, plural, one {la} other {les}} VM{vms, plural, one {} other {s}}',
- restartVmsModalMessage: 'Voulez-vous vraiment redémarrer {vms} VM{vms, plural, one {} other {s}} ?',
- migrateVmModalTitle: 'Migrer la VM',
- migrateVmModalBody: 'Voulez-vous vraiment migrer cette VM sur {hostName} ?',
- migrateVmAdvancedModalSelectHost: 'Sélectionnez un hôte de destination:',
- migrateVmAdvancedModalSelectNetwork: 'Sélectionnez un réseau pour la migration:',
- migrateVmAdvancedModalSelectSrs: 'Pour chaque VDI, sélectionnez un SR:',
- migrateVmAdvancedModalSelectNetworks: 'Pour chaque VIF, sélectionnez un réseau:',
- migrateVmAdvancedModalName: 'Nom',
- migrateVmAdvancedModalSr: 'SR',
- migrateVmAdvancedModalVif: 'VIF',
- migrateVmAdvancedModalNetwork: 'Réseau',
- migrateVmAdvancedModalNoRemapping: 'Migration intra-pool : le re-mappage n\'est pas requis',
- // ------ Self ------
- resourceSets: 'Ensemble de ressources',
- resourceSetName: 'Nom de l\'ensemble de ressources',
- resourceSetCreation: 'Création and édition',
- saveResourceSet: 'Sauvegarder',
- resetResourceSet: 'Effacer',
- editResourceSet: 'Editer',
- deleteResourceSet: 'Supprimer',
- deleteResourceSetWarning: 'Suppression d\'un ensemble de ressources.',
- deleteResourceSetQuestion: 'Etes-vous sûr de vouloir supprimer cet ensemble ?',
- resourceSetMissingObjects: 'Objets manquants :',
- resourceSetVcpus: 'vCPUs',
- resourceSetMemory: 'Mémoire',
- resourceSetStorage: 'Stockage',
- unknownResourceSetValue: 'Inconnu',
- availableHosts: 'Hôtes disponibles',
- excludedHosts: 'Hôtes exclus',
- noHostsAvailable: 'Pas d\'hôtes disponibles.',
- availableHostsDescription: 'Les VMs crées par cet ensemble de ressources doivent tourner sur les hôtes suivants.',
- maxCpus: 'Nombre max de CPUs',
- maxRam: 'Maximum RAM (GiB)',
- maxDiskSpace: 'Maximum d\'espace disque',
- totalResource: 'Total :',
- remainingResource: 'Restants :',
- usedResource: 'Utilisés :',
- noResourceSetLimits: 'Pas de limites.',
- // ----- Copy VM -----
- copyVm: 'Copier la VM',
- copyVmConfirm: 'Voulez-vous vraiment copier cette VM sur {SR} ?',
- copyVmName: 'Nom',
- copyVmNamePlaceholder: 'Si vide : nom de la VM copiée',
- copyVmSelectSr: 'Sélectionnez un SR',
- copyVmCompress: 'Utiliser la compression',
- // ----- Network -----
- networkCreate: 'Créer un réseau',
- deleteNetwork: 'Supprimer le réseau',
- deleteNetworkConfirm: 'Etes-vous sûr de vouloir supprimer ce réseau ?',
- // ----- PIF -----
- connectPif: 'Connecter la PIF',
- connectPifConfirm: 'Etes-vous sûr de vouloir connecter cette PIF ?',
- disconnectPif: 'Déconnecter la PIF',
- disconnectPifConfirm: 'Etes-vous sûr de vouloir déconnecter cette PIF ?',
- deletePif: 'Supprimer la PIF',
- deletePifConfirm: 'Etes-vous sûr de vouloir supprimer cette PIF ?'
-}
-
-// ===================================================================
-
-// Params:
-//
-// - props (optional): properties to add to the FormattedMessage
-// - messageId: identifier of the message to format/translate
-// - values (optional): values to pass to the message
-// - render (optional): a function receiving the React nodes of the
-// translated message and returning the React node to render
-const getMessage = (props, messageId, values, render) => {
- if (isString(props)) {
- render = values
- values = messageId
- messageId = props
- props = undefined
- }
-
- const message = messages[messageId]
- if (process.env.NODE_ENV !== 'production' && !message) {
- throw new Error(`no message defined for ${messageId}`)
- }
-
- if (isFunction(values)) {
- render = values
- values = undefined
- }
-
- return
- {render}
-
-}
-
-export { getMessage as default }
-
-@connect(({ lang }) => ({ lang }))
-export class IntlProvider extends Component {
- static propTypes = {
- children: PropTypes.node.isRequired,
- lang: PropTypes.string.isRequired
- };
-
- render () {
- const { lang, children } = this.props
- return
- {children}
-
- }
-}
-
-@connect(({ lang }) => ({ lang }))
-export class FormattedDuration extends Component {
- render () {
- const {
- duration,
- lang
- } = this.props
- return {moment.duration(duration).locale(lang).humanize()}
- }
-}
diff --git a/src/common/modal.js b/src/common/modal.js
index 815561f10..76573db17 100644
--- a/src/common/modal.js
+++ b/src/common/modal.js
@@ -1,4 +1,4 @@
-import _ from 'messages'
+import _ from 'intl'
import Icon from 'icon'
import isArray from 'lodash/isArray'
import isString from 'lodash/isString'
diff --git a/src/common/scheduling.js b/src/common/scheduling.js
index 805835450..65021319e 100644
--- a/src/common/scheduling.js
+++ b/src/common/scheduling.js
@@ -1,6 +1,6 @@
import Component from 'base-component'
import React from 'react'
-import _ from 'messages'
+import _ from 'intl'
import forEach from 'lodash/forEach'
import includes from 'lodash/includes'
import join from 'lodash/join'
diff --git a/src/common/select-objects.js b/src/common/select-objects.js
index c0faeba4d..bb3ba50b9 100644
--- a/src/common/select-objects.js
+++ b/src/common/select-objects.js
@@ -1,6 +1,6 @@
import Component from 'base-component'
import React from 'react'
-import _ from 'messages'
+import _ from 'intl'
import assign from 'lodash/assign'
import classNames from 'classnames'
import filter from 'lodash/filter'
diff --git a/src/common/tab-button.js b/src/common/tab-button.js
index 1f9326424..6d8715c86 100644
--- a/src/common/tab-button.js
+++ b/src/common/tab-button.js
@@ -1,4 +1,4 @@
-import _ from 'messages'
+import _ from 'intl'
import ActionButton from 'action-button'
import React from 'react'
diff --git a/src/common/wizard/index.js b/src/common/wizard/index.js
index c73071012..ea370b044 100644
--- a/src/common/wizard/index.js
+++ b/src/common/wizard/index.js
@@ -1,4 +1,4 @@
-import _ from 'messages'
+import _ from 'intl'
import classNames from 'classnames'
import every from 'lodash/every'
import Icon from 'icon'
diff --git a/src/common/xo-week-heatmap/index.js b/src/common/xo-week-heatmap/index.js
index d728a37b6..a4192e7c8 100644
--- a/src/common/xo-week-heatmap/index.js
+++ b/src/common/xo-week-heatmap/index.js
@@ -1,5 +1,5 @@
import React from 'react'
-import _ from 'messages'
+import _ from 'intl'
import forEach from 'lodash/forEach'
import map from 'lodash/map'
import moment from 'moment'
diff --git a/src/common/xo/copy-vm-modal/index.js b/src/common/xo/copy-vm-modal/index.js
index 96c445ab1..167e80e23 100644
--- a/src/common/xo/copy-vm-modal/index.js
+++ b/src/common/xo/copy-vm-modal/index.js
@@ -1,6 +1,6 @@
import React, { Component } from 'react'
-import _, { messages } from '../../messages'
+import _, { messages } from '../../intl'
import SingleLineRow from '../../single-line-row'
import Upgrade from 'xoa-upgrade'
import { Col } from '../../grid'
diff --git a/src/common/xo/create-network-modal/index.js b/src/common/xo/create-network-modal/index.js
index 5de570ded..ef71bc0ad 100644
--- a/src/common/xo/create-network-modal/index.js
+++ b/src/common/xo/create-network-modal/index.js
@@ -3,7 +3,7 @@ import { injectIntl } from 'react-intl'
import { createSelector } from 'selectors'
import SingleLineRow from '../../single-line-row'
-import _, { messages } from '../../messages'
+import _, { messages } from '../../intl'
import { SelectPif } from '../../select-objects'
import { Col } from '../../grid'
diff --git a/src/common/xo/index.js b/src/common/xo/index.js
index 7259da64b..430eba4ab 100644
--- a/src/common/xo/index.js
+++ b/src/common/xo/index.js
@@ -14,7 +14,7 @@ import Xo from 'xo-lib'
import { createBackoff } from 'jsonrpc-websocket-client'
import { resolve } from 'url'
-import _ from '../messages'
+import _ from '../intl'
import logError from '../log-error'
import { confirm } from '../modal'
import { error, info } from '../notification'
diff --git a/src/common/xo/migrate-vm-modal/index.js b/src/common/xo/migrate-vm-modal/index.js
index 845cab14f..6372d6543 100644
--- a/src/common/xo/migrate-vm-modal/index.js
+++ b/src/common/xo/migrate-vm-modal/index.js
@@ -3,7 +3,7 @@ import find from 'lodash/find'
import map from 'lodash/map'
import React, { Component } from 'react'
-import _ from '../../messages'
+import _ from '../../intl'
import SingleLineRow from '../../single-line-row'
import { Col } from '../../grid'
import {
diff --git a/src/common/xoa-upgrade.js b/src/common/xoa-upgrade.js
index 65afaa55e..7c47fdc79 100644
--- a/src/common/xoa-upgrade.js
+++ b/src/common/xoa-upgrade.js
@@ -1,4 +1,4 @@
-import _ from 'messages'
+import _ from 'intl'
import Icon from 'icon'
import Link from 'react-router/lib/Link'
import React from 'react'
diff --git a/src/xo-app/about/index.js b/src/xo-app/about/index.js
index 764e89be3..4fb2a46ca 100644
--- a/src/xo-app/about/index.js
+++ b/src/xo-app/about/index.js
@@ -1,4 +1,4 @@
-import _ from 'messages'
+import _ from 'intl'
import Component from 'base-component'
import Copiable from 'copiable'
import Icon from 'icon'
diff --git a/src/xo-app/backup/index.js b/src/xo-app/backup/index.js
index 0c5b56258..b07d03c69 100644
--- a/src/xo-app/backup/index.js
+++ b/src/xo-app/backup/index.js
@@ -1,4 +1,4 @@
-import _ from 'messages'
+import _ from 'intl'
import Icon from 'icon'
import Page from '../page'
import React from 'react'
diff --git a/src/xo-app/backup/new/index.js b/src/xo-app/backup/new/index.js
index cfd56c8f5..bfcb3a740 100644
--- a/src/xo-app/backup/new/index.js
+++ b/src/xo-app/backup/new/index.js
@@ -6,7 +6,7 @@ import React from 'react'
import Upgrade from 'xoa-upgrade'
import Scheduler, { SchedulePreview } from 'scheduling'
import Wizard, { Section } from 'wizard'
-import _, { messages } from 'messages'
+import _, { messages } from 'intl'
import map from 'lodash/map'
import { Container } from 'grid'
import { injectIntl } from 'react-intl'
diff --git a/src/xo-app/backup/overview/index.js b/src/xo-app/backup/overview/index.js
index 325022b1f..723b73bff 100644
--- a/src/xo-app/backup/overview/index.js
+++ b/src/xo-app/backup/overview/index.js
@@ -1,4 +1,4 @@
-import _ from 'messages'
+import _ from 'intl'
import ActionRowButton from 'action-row-button'
import ActionToggle from 'action-toggle'
import filter from 'lodash/filter'
diff --git a/src/xo-app/backup/restore/index.js b/src/xo-app/backup/restore/index.js
index 358d6db35..828b436db 100644
--- a/src/xo-app/backup/restore/index.js
+++ b/src/xo-app/backup/restore/index.js
@@ -1,4 +1,4 @@
-import _ from 'messages'
+import _ from 'intl'
import ActionButton from 'action-button'
import ActionRowButton from 'action-row-button'
import find from 'lodash/find'
diff --git a/src/xo-app/dashboard/health/index.js b/src/xo-app/dashboard/health/index.js
index 60155b076..c32838055 100644
--- a/src/xo-app/dashboard/health/index.js
+++ b/src/xo-app/dashboard/health/index.js
@@ -1,4 +1,4 @@
-import _ from 'messages'
+import _ from 'intl'
import ActionRowButton from 'action-row-button'
import Icon from 'icon'
import isEmpty from 'lodash/isEmpty'
diff --git a/src/xo-app/dashboard/index.js b/src/xo-app/dashboard/index.js
index 735c51283..878dd4dba 100644
--- a/src/xo-app/dashboard/index.js
+++ b/src/xo-app/dashboard/index.js
@@ -1,4 +1,4 @@
-import _ from 'messages'
+import _ from 'intl'
import Icon from 'icon'
import Page from '../page'
import React from 'react'
diff --git a/src/xo-app/dashboard/overview/index.js b/src/xo-app/dashboard/overview/index.js
index 659197437..cc7c6a2ba 100644
--- a/src/xo-app/dashboard/overview/index.js
+++ b/src/xo-app/dashboard/overview/index.js
@@ -1,4 +1,4 @@
-import _ from 'messages'
+import _ from 'intl'
import ChartistGraph from 'react-chartist'
import forEach from 'lodash/forEach'
import Icon from 'icon'
diff --git a/src/xo-app/dashboard/stats/index.js b/src/xo-app/dashboard/stats/index.js
index 281c5a7e2..9d16f0a2a 100644
--- a/src/xo-app/dashboard/stats/index.js
+++ b/src/xo-app/dashboard/stats/index.js
@@ -3,7 +3,7 @@ import Component from 'base-component'
import Icon from 'icon'
import React from 'react'
import XoWeekHeatmap from 'xo-week-heatmap'
-import _ from 'messages'
+import _ from 'intl'
import cloneDeep from 'lodash/cloneDeep'
import forEach from 'lodash/forEach'
import map from 'lodash/map'
diff --git a/src/xo-app/dashboard/visualizations/index.js b/src/xo-app/dashboard/visualizations/index.js
index d0faed957..b58d02ca6 100644
--- a/src/xo-app/dashboard/visualizations/index.js
+++ b/src/xo-app/dashboard/visualizations/index.js
@@ -1,4 +1,4 @@
-import _ from 'messages'
+import _ from 'intl'
import React from 'react'
import { Container, Row, Col } from 'grid'
diff --git a/src/xo-app/home/host-item.js b/src/xo-app/home/host-item.js
index b49af7a03..e016a9f01 100644
--- a/src/xo-app/home/host-item.js
+++ b/src/xo-app/home/host-item.js
@@ -1,4 +1,4 @@
-import _ from 'messages'
+import _ from 'intl'
import Component from 'base-component'
import Ellipsis, { EllipsisContainer } from 'ellipsis'
import Icon from 'icon'
diff --git a/src/xo-app/home/index.js b/src/xo-app/home/index.js
index 5ab485353..6ef8bdc33 100644
--- a/src/xo-app/home/index.js
+++ b/src/xo-app/home/index.js
@@ -1,5 +1,5 @@
import * as ComplexMatcher from 'complex-matcher'
-import _ from 'messages'
+import _ from 'intl'
import ActionButton from 'action-button'
import ceil from 'lodash/ceil'
import CenterPanel from 'center-panel'
diff --git a/src/xo-app/home/vm-item.js b/src/xo-app/home/vm-item.js
index 59579da4c..b416927ef 100644
--- a/src/xo-app/home/vm-item.js
+++ b/src/xo-app/home/vm-item.js
@@ -1,4 +1,4 @@
-import _ from 'messages'
+import _ from 'intl'
import Component from 'base-component'
import Ellipsis, { EllipsisContainer } from 'ellipsis'
import Icon from 'icon'
diff --git a/src/xo-app/host/index.js b/src/xo-app/host/index.js
index 6ba7c2852..15ebf6ac2 100644
--- a/src/xo-app/host/index.js
+++ b/src/xo-app/host/index.js
@@ -1,4 +1,4 @@
-import _ from 'messages'
+import _ from 'intl'
import assign from 'lodash/assign'
import HostActionBar from './action-bar'
import Icon from 'icon'
diff --git a/src/xo-app/host/tab-advanced.js b/src/xo-app/host/tab-advanced.js
index c0bc93f6c..194a0ad88 100644
--- a/src/xo-app/host/tab-advanced.js
+++ b/src/xo-app/host/tab-advanced.js
@@ -1,4 +1,4 @@
-import _ from 'messages'
+import _ from 'intl'
import Copiable from 'copiable'
import React from 'react'
import TabButton from 'tab-button'
diff --git a/src/xo-app/host/tab-console.js b/src/xo-app/host/tab-console.js
index ead849ce1..fbadf28b3 100644
--- a/src/xo-app/host/tab-console.js
+++ b/src/xo-app/host/tab-console.js
@@ -1,4 +1,4 @@
-import _ from 'messages'
+import _ from 'intl'
import Component from 'base-component'
import CopyToClipboard from 'react-copy-to-clipboard'
import debounce from 'lodash/debounce'
diff --git a/src/xo-app/host/tab-general.js b/src/xo-app/host/tab-general.js
index 570f1c197..3f6e278b6 100644
--- a/src/xo-app/host/tab-general.js
+++ b/src/xo-app/host/tab-general.js
@@ -1,4 +1,4 @@
-import _ from 'messages'
+import _ from 'intl'
import Copiable from 'copiable'
import Icon from 'icon'
import map from 'lodash/map'
diff --git a/src/xo-app/host/tab-logs.js b/src/xo-app/host/tab-logs.js
index 8c1e09c08..01870d601 100644
--- a/src/xo-app/host/tab-logs.js
+++ b/src/xo-app/host/tab-logs.js
@@ -1,4 +1,4 @@
-import _ from 'messages'
+import _ from 'intl'
import ActionRowButton from 'action-row-button'
import Component from 'base-component'
import isEmpty from 'lodash/isEmpty'
diff --git a/src/xo-app/host/tab-network.js b/src/xo-app/host/tab-network.js
index 4d3e56efc..2940e8da3 100644
--- a/src/xo-app/host/tab-network.js
+++ b/src/xo-app/host/tab-network.js
@@ -1,4 +1,4 @@
-import _ from 'messages'
+import _ from 'intl'
import ActionRowButton from 'action-row-button'
import React from 'react'
import isEmpty from 'lodash/isEmpty'
diff --git a/src/xo-app/host/tab-patches.js b/src/xo-app/host/tab-patches.js
index 01cbab240..f5fe8c6bc 100644
--- a/src/xo-app/host/tab-patches.js
+++ b/src/xo-app/host/tab-patches.js
@@ -1,4 +1,4 @@
-import _ from 'messages'
+import _ from 'intl'
import ActionRowButton from 'action-row-button'
import isEmpty from 'lodash/isEmpty'
import SortedTable from 'sorted-table'
diff --git a/src/xo-app/host/tab-stats.js b/src/xo-app/host/tab-stats.js
index 0f7908963..e522d72d1 100644
--- a/src/xo-app/host/tab-stats.js
+++ b/src/xo-app/host/tab-stats.js
@@ -1,4 +1,4 @@
-import _ from 'messages'
+import _ from 'intl'
import Component from 'base-component'
import Icon from 'icon'
import React from 'react'
diff --git a/src/xo-app/host/tab-storage.js b/src/xo-app/host/tab-storage.js
index 690a43be9..f5b810e59 100644
--- a/src/xo-app/host/tab-storage.js
+++ b/src/xo-app/host/tab-storage.js
@@ -1,4 +1,4 @@
-import _ from 'messages'
+import _ from 'intl'
import isEmpty from 'lodash/isEmpty'
import map from 'lodash/map'
import React from 'react'
diff --git a/src/xo-app/index.js b/src/xo-app/index.js
index 21fa01eca..21e9793b6 100644
--- a/src/xo-app/index.js
+++ b/src/xo-app/index.js
@@ -3,7 +3,7 @@ import cookies from 'cookies-js'
import React from 'react'
import { blockXoaAccess } from 'xoa-updater'
import { connectStore, routes } from 'utils'
-import { _, IntlProvider } from 'messages'
+import { _, IntlProvider } from 'intl'
import { Notification } from 'notification'
// import {
// keyHandler
diff --git a/src/xo-app/jobs/index.js b/src/xo-app/jobs/index.js
index ce02881d6..18ae5586f 100644
--- a/src/xo-app/jobs/index.js
+++ b/src/xo-app/jobs/index.js
@@ -1,4 +1,4 @@
-import _ from 'messages'
+import _ from 'intl'
import Icon from 'icon'
import Page from '../page'
import React from 'react'
diff --git a/src/xo-app/jobs/new/index.js b/src/xo-app/jobs/new/index.js
index 93aae0c14..392d86f72 100644
--- a/src/xo-app/jobs/new/index.js
+++ b/src/xo-app/jobs/new/index.js
@@ -1,4 +1,4 @@
-import _ from 'messages'
+import _ from 'intl'
import ActionButton from 'action-button'
import ActionRowButton from 'action-row-button'
import delay from 'lodash/delay'
diff --git a/src/xo-app/jobs/overview/index.js b/src/xo-app/jobs/overview/index.js
index 38f4b77e9..9723ee57a 100644
--- a/src/xo-app/jobs/overview/index.js
+++ b/src/xo-app/jobs/overview/index.js
@@ -1,4 +1,4 @@
-import _ from 'messages'
+import _ from 'intl'
import ActionRowButton from 'action-row-button'
import ActionToggle from 'action-toggle'
import filter from 'lodash/filter'
diff --git a/src/xo-app/jobs/scheduling/index.js b/src/xo-app/jobs/scheduling/index.js
index d7199d83c..e4703ebed 100644
--- a/src/xo-app/jobs/scheduling/index.js
+++ b/src/xo-app/jobs/scheduling/index.js
@@ -1,4 +1,4 @@
-import _ from 'messages'
+import _ from 'intl'
import ActionButton from 'action-button'
import find from 'lodash/find'
import Icon from 'icon'
diff --git a/src/xo-app/logs/index.js b/src/xo-app/logs/index.js
index 6561debb1..563e3e3df 100644
--- a/src/xo-app/logs/index.js
+++ b/src/xo-app/logs/index.js
@@ -2,7 +2,7 @@ import ActionButton from 'action-button'
import ActionRowButton from 'action-row-button'
import Icon from 'icon'
import React, { Component } from 'react'
-import _, { FormattedDuration } from 'messages'
+import _, { FormattedDuration } from 'intl'
import ceil from 'lodash/ceil'
import classnames from 'classnames'
import forEach from 'lodash/forEach'
diff --git a/src/xo-app/menu/index.js b/src/xo-app/menu/index.js
index 0b19649c8..0a9d3ad20 100644
--- a/src/xo-app/menu/index.js
+++ b/src/xo-app/menu/index.js
@@ -1,4 +1,4 @@
-import _ from 'messages'
+import _ from 'intl'
import Component from 'base-component'
import classNames from 'classnames'
import Icon from 'icon'
diff --git a/src/xo-app/new-vm/index.js b/src/xo-app/new-vm/index.js
index d2459ce82..17171b5c0 100644
--- a/src/xo-app/new-vm/index.js
+++ b/src/xo-app/new-vm/index.js
@@ -1,4 +1,4 @@
-import _, { messages } from 'messages'
+import _, { messages } from 'intl'
import { Button } from 'react-bootstrap-4/lib'
import { injectIntl } from 'react-intl'
import ActionButton from 'action-button'
diff --git a/src/xo-app/new/sr/index.js b/src/xo-app/new/sr/index.js
index 4651e5fb0..061a2d27e 100644
--- a/src/xo-app/new/sr/index.js
+++ b/src/xo-app/new/sr/index.js
@@ -1,4 +1,4 @@
-import _, { messages } from 'messages'
+import _, { messages } from 'intl'
import ActionButton from 'action-button'
import filter from 'lodash/filter'
import Icon from 'icon'
diff --git a/src/xo-app/pool/index.js b/src/xo-app/pool/index.js
index 9554748c0..ec25f2e30 100644
--- a/src/xo-app/pool/index.js
+++ b/src/xo-app/pool/index.js
@@ -1,4 +1,4 @@
-import _ from 'messages'
+import _ from 'intl'
import assign from 'lodash/assign'
import Icon from 'icon'
import PoolActionBar from './action-bar'
diff --git a/src/xo-app/pool/tab-advanced.js b/src/xo-app/pool/tab-advanced.js
index 3e7068cd7..747349c05 100644
--- a/src/xo-app/pool/tab-advanced.js
+++ b/src/xo-app/pool/tab-advanced.js
@@ -1,4 +1,4 @@
-import _ from 'messages'
+import _ from 'intl'
import Copiable from 'copiable'
import React from 'react'
import { Container, Row, Col } from 'grid'
diff --git a/src/xo-app/pool/tab-host.js b/src/xo-app/pool/tab-host.js
index 087704c81..0e486cc43 100644
--- a/src/xo-app/pool/tab-host.js
+++ b/src/xo-app/pool/tab-host.js
@@ -1,4 +1,4 @@
-import _ from 'messages'
+import _ from 'intl'
import React from 'react'
import isEmpty from 'lodash/isEmpty'
import map from 'lodash/map'
diff --git a/src/xo-app/pool/tab-logs.js b/src/xo-app/pool/tab-logs.js
index 76d80a180..4e7817181 100644
--- a/src/xo-app/pool/tab-logs.js
+++ b/src/xo-app/pool/tab-logs.js
@@ -1,4 +1,4 @@
-import _ from 'messages'
+import _ from 'intl'
import ActionRow from 'action-row-button'
import isEmpty from 'lodash/isEmpty'
import map from 'lodash/map'
diff --git a/src/xo-app/pool/tab-network.js b/src/xo-app/pool/tab-network.js
index 4c4262aea..5a7134572 100644
--- a/src/xo-app/pool/tab-network.js
+++ b/src/xo-app/pool/tab-network.js
@@ -1,4 +1,4 @@
-import _ from 'messages'
+import _ from 'intl'
import ActionRowButton from 'action-row-button'
import isEmpty from 'lodash/isEmpty'
import map from 'lodash/map'
diff --git a/src/xo-app/pool/tab-patches.js b/src/xo-app/pool/tab-patches.js
index dffbcba03..41d09b83c 100644
--- a/src/xo-app/pool/tab-patches.js
+++ b/src/xo-app/pool/tab-patches.js
@@ -1,4 +1,4 @@
-import _ from 'messages'
+import _ from 'intl'
import React from 'react'
import { Container, Row, Col } from 'grid'
diff --git a/src/xo-app/pool/tab-storage.js b/src/xo-app/pool/tab-storage.js
index a08460b89..d119d237a 100644
--- a/src/xo-app/pool/tab-storage.js
+++ b/src/xo-app/pool/tab-storage.js
@@ -1,4 +1,4 @@
-import _ from 'messages'
+import _ from 'intl'
import React from 'react'
import isEmpty from 'lodash/isEmpty'
import map from 'lodash/map'
diff --git a/src/xo-app/self/admin/index.js b/src/xo-app/self/admin/index.js
index e3570657c..4a783078d 100644
--- a/src/xo-app/self/admin/index.js
+++ b/src/xo-app/self/admin/index.js
@@ -1,7 +1,7 @@
import ActionButton from 'action-button'
import Icon from 'icon'
import React, { Component } from 'react'
-import _, { messages } from 'messages'
+import _, { messages } from 'intl'
import differenceBy from 'lodash/differenceBy'
import filter from 'lodash/filter'
import forEach from 'lodash/forEach'
diff --git a/src/xo-app/self/dashboard/index.js b/src/xo-app/self/dashboard/index.js
index b2a845ed4..8f3cdb617 100644
--- a/src/xo-app/self/dashboard/index.js
+++ b/src/xo-app/self/dashboard/index.js
@@ -4,7 +4,7 @@ import Collapse from 'collapse'
import Icon from 'icon'
import Upgrade from 'xoa-upgrade'
import React, { Component } from 'react'
-import _ from 'messages'
+import _ from 'intl'
import map from 'lodash/map'
import renderXoItem from 'render-xo-item'
import { Container, Row, Col } from 'grid'
diff --git a/src/xo-app/self/helpers.js b/src/xo-app/self/helpers.js
index d7d2b09a7..071a0ed1d 100644
--- a/src/xo-app/self/helpers.js
+++ b/src/xo-app/self/helpers.js
@@ -1,5 +1,5 @@
import React, { Component } from 'react'
-import _ from 'messages'
+import _ from 'intl'
import forEach from 'lodash/forEach'
import keyBy from 'lodash/keyBy'
import map from 'lodash/map'
diff --git a/src/xo-app/self/index.js b/src/xo-app/self/index.js
index f39301bb6..bc362056f 100644
--- a/src/xo-app/self/index.js
+++ b/src/xo-app/self/index.js
@@ -1,4 +1,4 @@
-import _ from 'messages'
+import _ from 'intl'
import Icon from 'icon'
import Page from '../page'
import React from 'react'
diff --git a/src/xo-app/settings/acls/index.js b/src/xo-app/settings/acls/index.js
index ca8ad9286..5450efee5 100644
--- a/src/xo-app/settings/acls/index.js
+++ b/src/xo-app/settings/acls/index.js
@@ -1,4 +1,4 @@
-import _ from 'messages'
+import _ from 'intl'
import ActionButton from 'action-button'
import ActionRowButton from 'action-row-button'
import Component from 'base-component'
diff --git a/src/xo-app/settings/groups/index.js b/src/xo-app/settings/groups/index.js
index d197a837e..454f49c3a 100644
--- a/src/xo-app/settings/groups/index.js
+++ b/src/xo-app/settings/groups/index.js
@@ -1,4 +1,4 @@
-import _, { messages } from 'messages'
+import _, { messages } from 'intl'
import ActionButton from 'action-button'
import Component from 'base-component'
import includes from 'lodash/includes'
diff --git a/src/xo-app/settings/index.js b/src/xo-app/settings/index.js
index f593a2c98..15894a548 100644
--- a/src/xo-app/settings/index.js
+++ b/src/xo-app/settings/index.js
@@ -1,4 +1,4 @@
-import _ from 'messages'
+import _ from 'intl'
import Icon from 'icon'
import Page from '../page'
import React from 'react'
diff --git a/src/xo-app/settings/plugins/index.js b/src/xo-app/settings/plugins/index.js
index 6c900aad1..5933537be 100644
--- a/src/xo-app/settings/plugins/index.js
+++ b/src/xo-app/settings/plugins/index.js
@@ -3,7 +3,7 @@ import ActionToggle from 'action-toggle'
import GenericInput from 'json-schema-input'
import Icon from 'icon'
import React, { Component } from 'react'
-import _ from 'messages'
+import _ from 'intl'
import map from 'lodash/map'
import { addSubscriptions } from 'utils'
import { lastly } from 'promise-toolbox'
diff --git a/src/xo-app/settings/remotes/index.js b/src/xo-app/settings/remotes/index.js
index 5bdd5435b..c39ff364f 100644
--- a/src/xo-app/settings/remotes/index.js
+++ b/src/xo-app/settings/remotes/index.js
@@ -1,4 +1,4 @@
-import _ from 'messages'
+import _ from 'intl'
import ActionButton from 'action-button'
import ActionRowButton from 'action-row-button'
import filter from 'lodash/filter'
diff --git a/src/xo-app/settings/servers/index.js b/src/xo-app/settings/servers/index.js
index cbde89c83..e25e4a03f 100644
--- a/src/xo-app/settings/servers/index.js
+++ b/src/xo-app/settings/servers/index.js
@@ -1,4 +1,4 @@
-import _ from 'messages'
+import _ from 'intl'
import ActionButton from 'action-button'
import ActionRowButton from 'action-row-button'
import map from 'lodash/map'
diff --git a/src/xo-app/settings/users/index.js b/src/xo-app/settings/users/index.js
index b96c7ccc2..bce77492d 100644
--- a/src/xo-app/settings/users/index.js
+++ b/src/xo-app/settings/users/index.js
@@ -1,5 +1,5 @@
import * as Editable from 'editable'
-import _, { messages } from 'messages'
+import _, { messages } from 'intl'
import ActionButton from 'action-button'
import ActionRowButton from 'action-row-button'
import isEmpty from 'lodash/isEmpty'
diff --git a/src/xo-app/sign-in/index.js b/src/xo-app/sign-in/index.js
index cf72bc3fc..d372202ea 100644
--- a/src/xo-app/sign-in/index.js
+++ b/src/xo-app/sign-in/index.js
@@ -1,4 +1,4 @@
-import _ from 'messages'
+import _ from 'intl'
import React, {
Component
} from 'react'
diff --git a/src/xo-app/sr/index.js b/src/xo-app/sr/index.js
index d75aebb8e..ff4cd3cb9 100644
--- a/src/xo-app/sr/index.js
+++ b/src/xo-app/sr/index.js
@@ -1,4 +1,4 @@
-import _ from 'messages'
+import _ from 'intl'
import assign from 'lodash/assign'
import Icon from 'icon'
import map from 'lodash/map'
diff --git a/src/xo-app/sr/tab-advanced.js b/src/xo-app/sr/tab-advanced.js
index f82aa5e1a..a26f9528d 100644
--- a/src/xo-app/sr/tab-advanced.js
+++ b/src/xo-app/sr/tab-advanced.js
@@ -1,4 +1,4 @@
-import _ from 'messages'
+import _ from 'intl'
import Copiable from 'copiable'
import React from 'react'
import TabButton from 'tab-button'
diff --git a/src/xo-app/sr/tab-disks.js b/src/xo-app/sr/tab-disks.js
index a12fc7da3..7a9f77598 100644
--- a/src/xo-app/sr/tab-disks.js
+++ b/src/xo-app/sr/tab-disks.js
@@ -2,7 +2,7 @@ import ActionRow from 'action-row-button'
import Icon from 'icon'
import React from 'react'
import SortedTable from 'sorted-table'
-import _ from 'messages'
+import _ from 'intl'
import isEmpty from 'lodash/isEmpty'
import { Container, Row, Col } from 'grid'
import { Text } from 'editable'
diff --git a/src/xo-app/sr/tab-general.js b/src/xo-app/sr/tab-general.js
index 2bc3e4c99..e8a45d785 100644
--- a/src/xo-app/sr/tab-general.js
+++ b/src/xo-app/sr/tab-general.js
@@ -1,4 +1,4 @@
-import _ from 'messages'
+import _ from 'intl'
import Icon from 'icon'
import map from 'lodash/map'
import React from 'react'
diff --git a/src/xo-app/sr/tab-host.js b/src/xo-app/sr/tab-host.js
index f3eb8226e..73de67ba7 100644
--- a/src/xo-app/sr/tab-host.js
+++ b/src/xo-app/sr/tab-host.js
@@ -1,4 +1,4 @@
-import _ from 'messages'
+import _ from 'intl'
import ActionRowButton from 'action-row-button'
import React from 'react'
import isEmpty from 'lodash/isEmpty'
diff --git a/src/xo-app/sr/tab-logs.js b/src/xo-app/sr/tab-logs.js
index 817c37dc7..ac95968a0 100644
--- a/src/xo-app/sr/tab-logs.js
+++ b/src/xo-app/sr/tab-logs.js
@@ -1,4 +1,4 @@
-import _ from 'messages'
+import _ from 'intl'
import ActionRow from 'action-row-button'
import isEmpty from 'lodash/isEmpty'
import map from 'lodash/map'
diff --git a/src/xo-app/tasks/index.js b/src/xo-app/tasks/index.js
index bdbcb7caa..723d5473e 100644
--- a/src/xo-app/tasks/index.js
+++ b/src/xo-app/tasks/index.js
@@ -1,4 +1,4 @@
-import _ from 'messages'
+import _ from 'intl'
import CenterPanel from 'center-panel'
import Icon from 'icon'
import isEmpty from 'lodash/isEmpty'
diff --git a/src/xo-app/vm-import/index.js b/src/xo-app/vm-import/index.js
index de103e97d..5a760298c 100644
--- a/src/xo-app/vm-import/index.js
+++ b/src/xo-app/vm-import/index.js
@@ -4,7 +4,7 @@ import Dropzone from 'react-dropzone'
import * as FormGrid from 'form-grid'
import Icon from 'icon'
import React from 'react'
-import _ from 'messages'
+import _ from 'intl'
import filter from 'lodash/filter'
import map from 'lodash/map'
import Upgrade from 'xoa-upgrade'
diff --git a/src/xo-app/vm/index.js b/src/xo-app/vm/index.js
index 5fd4cf881..73e1bf073 100644
--- a/src/xo-app/vm/index.js
+++ b/src/xo-app/vm/index.js
@@ -1,4 +1,4 @@
-import _ from 'messages'
+import _ from 'intl'
import assign from 'lodash/assign'
import forEach from 'lodash/forEach'
import Icon from 'icon'
diff --git a/src/xo-app/vm/tab-advanced.js b/src/xo-app/vm/tab-advanced.js
index 425335874..003b90735 100644
--- a/src/xo-app/vm/tab-advanced.js
+++ b/src/xo-app/vm/tab-advanced.js
@@ -1,4 +1,4 @@
-import _ from 'messages'
+import _ from 'intl'
import Copiable from 'copiable'
import Icon from 'icon'
import isEmpty from 'lodash/isEmpty'
diff --git a/src/xo-app/vm/tab-console.js b/src/xo-app/vm/tab-console.js
index 8011fbbf2..df63c8304 100644
--- a/src/xo-app/vm/tab-console.js
+++ b/src/xo-app/vm/tab-console.js
@@ -1,4 +1,4 @@
-import _ from 'messages'
+import _ from 'intl'
import Component from 'base-component'
import CopyToClipboard from 'react-copy-to-clipboard'
import debounce from 'lodash/debounce'
diff --git a/src/xo-app/vm/tab-disks.js b/src/xo-app/vm/tab-disks.js
index 2dcc39330..84110cea2 100644
--- a/src/xo-app/vm/tab-disks.js
+++ b/src/xo-app/vm/tab-disks.js
@@ -1,4 +1,4 @@
-import _ from 'messages'
+import _ from 'intl'
import ActionButton from 'action-button'
import ActionRowButton from 'action-row-button'
import Component from 'base-component'
diff --git a/src/xo-app/vm/tab-general.js b/src/xo-app/vm/tab-general.js
index 7734cde27..9c5bd4d14 100644
--- a/src/xo-app/vm/tab-general.js
+++ b/src/xo-app/vm/tab-general.js
@@ -1,4 +1,4 @@
-import _ from 'messages'
+import _ from 'intl'
import Copiable from 'copiable'
import Icon from 'icon'
import isEmpty from 'lodash/isEmpty'
diff --git a/src/xo-app/vm/tab-logs.js b/src/xo-app/vm/tab-logs.js
index abca5b4a4..ddc3f613b 100644
--- a/src/xo-app/vm/tab-logs.js
+++ b/src/xo-app/vm/tab-logs.js
@@ -1,4 +1,4 @@
-import _ from 'messages'
+import _ from 'intl'
import ActionRowButton from 'action-row-button'
import isEmpty from 'lodash/isEmpty'
import map from 'lodash/map'
diff --git a/src/xo-app/vm/tab-network.js b/src/xo-app/vm/tab-network.js
index 2e4917127..5e62dd7af 100644
--- a/src/xo-app/vm/tab-network.js
+++ b/src/xo-app/vm/tab-network.js
@@ -1,4 +1,4 @@
-import _ from 'messages'
+import _ from 'intl'
import isEmpty from 'lodash/isEmpty'
import map from 'lodash/map'
import React, { Component } from 'react'
diff --git a/src/xo-app/vm/tab-snapshots.js b/src/xo-app/vm/tab-snapshots.js
index 816ae7b97..dadeaf079 100644
--- a/src/xo-app/vm/tab-snapshots.js
+++ b/src/xo-app/vm/tab-snapshots.js
@@ -1,4 +1,4 @@
-import _ from 'messages'
+import _ from 'intl'
import ActionRowButton from 'action-row-button'
import Icon from 'icon'
import isEmpty from 'lodash/isEmpty'
diff --git a/src/xo-app/vm/tab-stats.js b/src/xo-app/vm/tab-stats.js
index d914c1d71..2d1041e0f 100644
--- a/src/xo-app/vm/tab-stats.js
+++ b/src/xo-app/vm/tab-stats.js
@@ -1,4 +1,4 @@
-import _, { messages } from 'messages'
+import _, { messages } from 'intl'
import Component from 'base-component'
import Icon from 'icon'
import React from 'react'
diff --git a/src/xo-app/xoa-updates/index.js b/src/xo-app/xoa-updates/index.js
index 1734f304d..53cfef69f 100644
--- a/src/xo-app/xoa-updates/index.js
+++ b/src/xo-app/xoa-updates/index.js
@@ -1,4 +1,4 @@
-import _ from 'messages'
+import _ from 'intl'
import ActionButton from 'action-button'
import ansiUp from 'ansi_up'
import assign from 'lodash/assign'
diff --git a/tools/generate-index b/tools/generate-index
new file mode 100755
index 000000000..a4f75032d
--- /dev/null
+++ b/tools/generate-index
@@ -0,0 +1,84 @@
+#!/usr/bin/env node
+
+var join = require('path').join
+var readdir = require('fs').readdirSync
+var stat = require('fs').statSync
+var writeFile = require('fs').writeFileSync
+
+// ===================================================================
+
+function bind (fn, thisArg) {
+ return function () {
+ return fn.apply(thisArg, arguments)
+ }
+}
+
+function camelCase (str) {
+ return str.toLowerCase().replace(/[^a-z0-9]+([a-z0-9])/g, function (_, str) {
+ return str.toUpperCase()
+ })
+}
+
+function removeSuffix (str, sfx) {
+ var strLength = str.length
+ var sfxLength = sfx.length
+
+ var pos = strLength - sfxLength
+ if (pos < 0 || str.indexOf(sfx, pos) !== pos) {
+ return false
+ }
+
+ return str.slice(0, pos)
+}
+
+// ===================================================================
+
+function handleEntry (entry, dir) {
+ var stats = stat(join(dir, entry))
+ var base
+ if (stats.isDirectory()) {
+ base = entry
+ } else if (!(
+ stats.isFile() && (
+ (base = removeSuffix(entry, '.coffee')) ||
+ (base = removeSuffix(entry, '.js'))
+ )
+ )) {
+ return
+ }
+
+ var identifier = camelCase(base)
+ this(
+ 'import ' + identifier + " from './" + base + "'",
+ 'defaults.' + identifier + ' = ' + identifier,
+ 'export * as ' + identifier + " from './" + base + "'",
+ ''
+ )
+}
+
+function generateIndex (dir) {
+ var content = [
+ '//',
+ '// This file has been generated by /tools/generate-index',
+ '//',
+ '// It is automatically re-generated each time a build is started.',
+ '//',
+ '',
+ 'const defaults = {}',
+ 'export default defaults',
+ ''
+ ]
+ var write = bind(content.push, content)
+
+ readdir(dir).map(function (entry) {
+ if (entry === 'index.js') {
+ return
+ }
+
+ handleEntry.call(write, entry, dir)
+ })
+
+ writeFile(dir + '/index.js', content.join('\n'))
+}
+
+process.argv.slice(2).map(generateIndex)