chore(intl): split messages data

This commit is contained in:
Julien Fontanet
2016-06-23 15:05:53 +02:00
parent 83cad000e7
commit a2d88f7fbf
91 changed files with 1453 additions and 2670 deletions

View File

@@ -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",

View File

@@ -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'

View File

@@ -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'

81
src/common/intl/index.js Normal file
View File

@@ -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 <FormattedMessage {...props} {...message} values={values}>
{render}
</FormattedMessage>
}
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 <IntlProvider_
locale={lang}
messages={locales[lang]}
>
{children}
</IntlProvider_>
}
}
@connect(({ lang }) => ({ lang }))
export class FormattedDuration extends Component {
render () {
const {
duration,
lang
} = this.props
return <span>{moment.duration(duration).locale(lang).humanize()}</span>
}
}

1
src/common/intl/locales/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
/index.js

View File

@@ -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 ?'
}

783
src/common/intl/messages.js Normal file
View File

@@ -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

View File

@@ -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'

View File

@@ -1,5 +1,5 @@
import React from 'react'
import _ from 'messages'
import _ from 'intl'
import map from 'lodash/map'
import AbstractInput from './abstract-input'

View File

@@ -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'

File diff suppressed because it is too large Load Diff

View File

@@ -1,4 +1,4 @@
import _ from 'messages'
import _ from 'intl'
import Icon from 'icon'
import isArray from 'lodash/isArray'
import isString from 'lodash/isString'

View File

@@ -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'

View File

@@ -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'

View File

@@ -1,4 +1,4 @@
import _ from 'messages'
import _ from 'intl'
import ActionButton from 'action-button'
import React from 'react'

View File

@@ -1,4 +1,4 @@
import _ from 'messages'
import _ from 'intl'
import classNames from 'classnames'
import every from 'lodash/every'
import Icon from 'icon'

View File

@@ -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'

View File

@@ -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'

View File

@@ -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'

View File

@@ -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'

View File

@@ -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 {

View File

@@ -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'

View File

@@ -1,4 +1,4 @@
import _ from 'messages'
import _ from 'intl'
import Component from 'base-component'
import Copiable from 'copiable'
import Icon from 'icon'

View File

@@ -1,4 +1,4 @@
import _ from 'messages'
import _ from 'intl'
import Icon from 'icon'
import Page from '../page'
import React from 'react'

View File

@@ -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'

View File

@@ -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'

View File

@@ -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'

View File

@@ -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'

View File

@@ -1,4 +1,4 @@
import _ from 'messages'
import _ from 'intl'
import Icon from 'icon'
import Page from '../page'
import React from 'react'

View File

@@ -1,4 +1,4 @@
import _ from 'messages'
import _ from 'intl'
import ChartistGraph from 'react-chartist'
import forEach from 'lodash/forEach'
import Icon from 'icon'

View File

@@ -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'

View File

@@ -1,4 +1,4 @@
import _ from 'messages'
import _ from 'intl'
import React from 'react'
import { Container, Row, Col } from 'grid'

View File

@@ -1,4 +1,4 @@
import _ from 'messages'
import _ from 'intl'
import Component from 'base-component'
import Ellipsis, { EllipsisContainer } from 'ellipsis'
import Icon from 'icon'

View File

@@ -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'

View File

@@ -1,4 +1,4 @@
import _ from 'messages'
import _ from 'intl'
import Component from 'base-component'
import Ellipsis, { EllipsisContainer } from 'ellipsis'
import Icon from 'icon'

View File

@@ -1,4 +1,4 @@
import _ from 'messages'
import _ from 'intl'
import assign from 'lodash/assign'
import HostActionBar from './action-bar'
import Icon from 'icon'

View File

@@ -1,4 +1,4 @@
import _ from 'messages'
import _ from 'intl'
import Copiable from 'copiable'
import React from 'react'
import TabButton from 'tab-button'

View File

@@ -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'

View File

@@ -1,4 +1,4 @@
import _ from 'messages'
import _ from 'intl'
import Copiable from 'copiable'
import Icon from 'icon'
import map from 'lodash/map'

View File

@@ -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'

View File

@@ -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'

View File

@@ -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'

View File

@@ -1,4 +1,4 @@
import _ from 'messages'
import _ from 'intl'
import Component from 'base-component'
import Icon from 'icon'
import React from 'react'

View File

@@ -1,4 +1,4 @@
import _ from 'messages'
import _ from 'intl'
import isEmpty from 'lodash/isEmpty'
import map from 'lodash/map'
import React from 'react'

View File

@@ -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

View File

@@ -1,4 +1,4 @@
import _ from 'messages'
import _ from 'intl'
import Icon from 'icon'
import Page from '../page'
import React from 'react'

View File

@@ -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'

View File

@@ -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'

View File

@@ -1,4 +1,4 @@
import _ from 'messages'
import _ from 'intl'
import ActionButton from 'action-button'
import find from 'lodash/find'
import Icon from 'icon'

View File

@@ -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'

View File

@@ -1,4 +1,4 @@
import _ from 'messages'
import _ from 'intl'
import Component from 'base-component'
import classNames from 'classnames'
import Icon from 'icon'

View File

@@ -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'

View File

@@ -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'

View File

@@ -1,4 +1,4 @@
import _ from 'messages'
import _ from 'intl'
import assign from 'lodash/assign'
import Icon from 'icon'
import PoolActionBar from './action-bar'

View File

@@ -1,4 +1,4 @@
import _ from 'messages'
import _ from 'intl'
import Copiable from 'copiable'
import React from 'react'
import { Container, Row, Col } from 'grid'

View File

@@ -1,4 +1,4 @@
import _ from 'messages'
import _ from 'intl'
import React from 'react'
import isEmpty from 'lodash/isEmpty'
import map from 'lodash/map'

View File

@@ -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'

View File

@@ -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'

View File

@@ -1,4 +1,4 @@
import _ from 'messages'
import _ from 'intl'
import React from 'react'
import { Container, Row, Col } from 'grid'

View File

@@ -1,4 +1,4 @@
import _ from 'messages'
import _ from 'intl'
import React from 'react'
import isEmpty from 'lodash/isEmpty'
import map from 'lodash/map'

View File

@@ -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'

View File

@@ -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'

View File

@@ -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'

View File

@@ -1,4 +1,4 @@
import _ from 'messages'
import _ from 'intl'
import Icon from 'icon'
import Page from '../page'
import React from 'react'

View File

@@ -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'

View File

@@ -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'

View File

@@ -1,4 +1,4 @@
import _ from 'messages'
import _ from 'intl'
import Icon from 'icon'
import Page from '../page'
import React from 'react'

View File

@@ -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'

View File

@@ -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'

View File

@@ -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'

View File

@@ -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'

View File

@@ -1,4 +1,4 @@
import _ from 'messages'
import _ from 'intl'
import React, {
Component
} from 'react'

View File

@@ -1,4 +1,4 @@
import _ from 'messages'
import _ from 'intl'
import assign from 'lodash/assign'
import Icon from 'icon'
import map from 'lodash/map'

View File

@@ -1,4 +1,4 @@
import _ from 'messages'
import _ from 'intl'
import Copiable from 'copiable'
import React from 'react'
import TabButton from 'tab-button'

View File

@@ -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'

View File

@@ -1,4 +1,4 @@
import _ from 'messages'
import _ from 'intl'
import Icon from 'icon'
import map from 'lodash/map'
import React from 'react'

View File

@@ -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'

View File

@@ -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'

View File

@@ -1,4 +1,4 @@
import _ from 'messages'
import _ from 'intl'
import CenterPanel from 'center-panel'
import Icon from 'icon'
import isEmpty from 'lodash/isEmpty'

View File

@@ -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'

View File

@@ -1,4 +1,4 @@
import _ from 'messages'
import _ from 'intl'
import assign from 'lodash/assign'
import forEach from 'lodash/forEach'
import Icon from 'icon'

View File

@@ -1,4 +1,4 @@
import _ from 'messages'
import _ from 'intl'
import Copiable from 'copiable'
import Icon from 'icon'
import isEmpty from 'lodash/isEmpty'

View File

@@ -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'

View File

@@ -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'

View File

@@ -1,4 +1,4 @@
import _ from 'messages'
import _ from 'intl'
import Copiable from 'copiable'
import Icon from 'icon'
import isEmpty from 'lodash/isEmpty'

View File

@@ -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'

View File

@@ -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'

View File

@@ -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'

View File

@@ -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'

View File

@@ -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'

84
tools/generate-index Executable file
View File

@@ -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)