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)