feat(i18n): translate container-details

feat807-i18n
Anthony Lapenna 2017-08-21 10:31:48 +02:00
parent e03340272a
commit c06765a5df
7 changed files with 259 additions and 88 deletions

View File

@ -1,27 +1,27 @@
<rd-header>
<rd-header-title title="Container details">
<rd-header-title title="CONTAINER_DETAILS.HEADER.TITLE">
<i id="loadingViewSpinner" class="fa fa-cog fa-spin"></i>
</rd-header-title>
<rd-header-content>
<a ui-sref="containers">Containers</a> &gt; <a ui-sref="container({id: container.Id})">{{ container.Name|trimcontainername }}</a>
<a ui-sref="containers"><por-translation key="COMMON.DOCKER.CONTAINERS"></por-translation></a> &gt; <a ui-sref="container({id: container.Id})">{{ container.Name|trimcontainername }}</a>
</rd-header-content>
</rd-header>
<div class="row">
<div class="col-lg-12 col-md-12 col-xs-12">
<rd-widget>
<rd-widget-header icon="fa-cogs" title="Actions"></rd-widget-header>
<rd-widget-header icon="fa-cogs" title="CONTAINER_DETAILS.WIDGET_ACTIONS.TITLE"></rd-widget-header>
<rd-widget-body classes="padding">
<div class="btn-group" role="group" aria-label="...">
<button class="btn btn-success" ng-click="start()" ng-disabled="container.State.Running"><i class="fa fa-play space-right" aria-hidden="true"></i>Start</button>
<button class="btn btn-danger" ng-click="stop()" ng-disabled="!container.State.Running"><i class="fa fa-stop space-right" aria-hidden="true"></i>Stop</button>
<button class="btn btn-danger" ng-click="kill()" ng-disabled="!container.State.Running"><i class="fa fa-bomb space-right" aria-hidden="true"></i>Kill</button>
<button class="btn btn-primary" ng-click="restart()" ng-disabled="!container.State.Running"><i class="fa fa-refresh space-right" aria-hidden="true"></i>Restart</button>
<button class="btn btn-primary" ng-click="pause()" ng-disabled="!container.State.Running || container.State.Paused"><i class="fa fa-pause space-right" aria-hidden="true"></i>Pause</button>
<button class="btn btn-primary" ng-click="unpause()" ng-disabled="!container.State.Paused"><i class="fa fa-play space-right" aria-hidden="true"></i>Resume</button>
<button class="btn btn-danger" ng-click="confirmRemove()"><i class="fa fa-trash space-right" aria-hidden="true"></i>Remove</button>
<button class="btn btn-danger" ng-click="recreate()"><i class="fa fa-refresh space-right" aria-hidden="true"></i>Recreate</button>
<button class="btn btn-primary" ng-click="duplicate()"><i class="fa fa-files-o space-right" aria-hidden="true"></i>Duplicate/Edit</button>
<button class="btn btn-success" ng-click="start()" ng-disabled="container.State.Running"><i class="fa fa-play space-right" aria-hidden="true"></i><por-translation key="COMMON.VERBS.START"></por-translation></button>
<button class="btn btn-danger" ng-click="stop()" ng-disabled="!container.State.Running"><i class="fa fa-stop space-right" aria-hidden="true"></i><por-translation key="COMMON.VERBS.STOP"></por-translation></button>
<button class="btn btn-danger" ng-click="kill()" ng-disabled="!container.State.Running"><i class="fa fa-bomb space-right" aria-hidden="true"></i><por-translation key="COMMON.VERBS.KILL"></por-translation></button>
<button class="btn btn-primary" ng-click="restart()" ng-disabled="!container.State.Running"><i class="fa fa-refresh space-right" aria-hidden="true"></i><por-translation key="COMMON.VERBS.RESTART"></por-translation></button>
<button class="btn btn-primary" ng-click="pause()" ng-disabled="!container.State.Running || container.State.Paused"><i class="fa fa-pause space-right" aria-hidden="true"></i><por-translation key="COMMON.VERBS.PAUSE"></por-translation></button>
<button class="btn btn-primary" ng-click="unpause()" ng-disabled="!container.State.Paused"><i class="fa fa-play space-right" aria-hidden="true"></i><por-translation key="COMMON.VERBS.RESUME"></por-translation></button>
<button class="btn btn-danger" ng-click="confirmRemove()"><i class="fa fa-trash space-right" aria-hidden="true"></i><por-translation key="COMMON.VERBS.REMOVE"></por-translation></button>
<button class="btn btn-danger" ng-click="recreate()"><i class="fa fa-refresh space-right" aria-hidden="true"></i><por-translation key="COMMON.VERBS.RECREATE"></por-translation></button>
<button class="btn btn-primary" ng-click="duplicate()"><i class="fa fa-files-o space-right" aria-hidden="true"></i><por-translation key="COMMON.VERBS.DUPLICATE"></por-translation> / <por-translation key="COMMON.VERBS.EDIT"></por-translation></button>
</div>
</rd-widget-body>
</rd-widget>
@ -31,16 +31,16 @@
<div class="row">
<div class="col-lg-12 col-md-12 col-xs-12">
<rd-widget>
<rd-widget-header icon="fa-server" title="Container status"></rd-widget-header>
<rd-widget-header icon="fa-server" title="CONTAINER_DETAILS.WIDGET_CONTAINER_STATUS.TITLE"></rd-widget-header>
<rd-widget-body classes="no-padding">
<table class="table">
<tbody>
<tr>
<td>ID</td>
<td><por-translation key="COMMON.DOCKER.ID"></por-translation></td>
<td>{{ container.Id }}</td>
</tr>
<tr>
<td>Name</td>
<td><por-translation key="CONTAINER_DETAILS.WIDGET_CONTAINER_STATUS.ROW_NAME"></por-translation></td>
<td ng-if="!container.edit">
{{ container.Name|trimcontainername }}
<a href="" data-toggle="tooltip" title="Edit container name" ng-click="container.edit = true;"><i class="fa fa-edit"></i></a>
@ -54,35 +54,38 @@
</td>
</tr>
<tr ng-if="container.NetworkSettings.IPAddress">
<td>IP address</td>
<td><por-translation key="CONTAINER_DETAILS.WIDGET_CONTAINER_STATUS.ROW_IP"></por-translation></td>
<td>{{ container.NetworkSettings.IPAddress }}</td>
</tr>
<tr>
<td>Status</td>
<td><por-translation key="COMMON.NOUNS.STATUS"></por-translation></td>
<td>
<i class="fa fa-heartbeat space-right green-icon" ng-if="container.State.Running"></i>
<i class="fa fa-heartbeat space-right red-icon" ng-if="!container.State.Running && container.State.Status !== 'created'"></i>
{{ container.State|getstatetext }} since {{ activityTime }}<span ng-if="!container.State.Running && container.State.Status !== 'created'"> with exit code {{ container.State.ExitCode }}</span>
<por-translation key="CONTAINER_DETAILS.WIDGET_CONTAINER_STATUS.STATUS.RUNNING" values="{time: activityTime}" ng-if="container.State.Running"></por-translation>
<por-translation key="CONTAINER_DETAILS.WIDGET_CONTAINER_STATUS.STATUS.CREATED" values="{time: activityTime}" ng-if="container.State.Status === 'created'"></por-translation>
<por-translation key="CONTAINER_DETAILS.WIDGET_CONTAINER_STATUS.STATUS.STOPPED" values="{time: activityTime, code: container.State.ExitCode}" ng-if="!container.state.Running && container.State.Status !== 'created'"></por-translation>
<por-translation key="CONTAINER_DETAILS.WIDGET_CONTAINER_STATUS.STATUS.DEAD" values="{time: activityTime, code: container.State.ExitCode}" ng-if="container.State.Dead"></por-translation>
</td>
</tr>
<tr>
<td>Created</td>
<td><por-translation key="CONTAINER_DETAILS.WIDGET_CONTAINER_STATUS.ROW_CREATED"></por-translation></td>
<td>{{ container.Created|getisodate }}</td>
</tr>
<tr ng-if="container.State.Running">
<td>Start time</td>
<td><por-translation key="CONTAINER_DETAILS.WIDGET_CONTAINER_STATUS.ROW_START_TIME"></por-translation></td>
<td>{{ container.State.StartedAt|getisodate }}</td>
</tr>
<tr ng-if="!container.State.Running && container.State.Status !== 'created'">
<td>Finished</td>
<td><por-translation key="CONTAINER_DETAILS.WIDGET_CONTAINER_STATUS.ROW_FINISHED"></por-translation></td>
<td>{{ container.State.FinishedAt|getisodate }}</td>
</tr>
<tr>
<td colspan="2">
<div class="btn-group" role="group" aria-label="...">
<a class="btn btn-outline-secondary" type="button" ui-sref="stats({id: container.Id})"><i class="fa fa-area-chart space-right" aria-hidden="true"></i>Stats</a>
<a class="btn btn-outline-secondary" type="button" ui-sref="containerlogs({id: container.Id})"><i class="fa fa-exclamation-circle space-right" aria-hidden="true"></i>Logs</a>
<a class="btn btn-outline-secondary" type="button" ui-sref="console({id: container.Id})"><i class="fa fa-terminal space-right" aria-hidden="true"></i>Console</a>
<a class="btn btn-outline-secondary" type="button" ui-sref="stats({id: container.Id})"><i class="fa fa-area-chart space-right" aria-hidden="true"></i><por-translation key="CONTAINER_DETAILS.WIDGET_CONTAINER_STATUS.ACTIONS.STATS"></por-translation></a>
<a class="btn btn-outline-secondary" type="button" ui-sref="containerlogs({id: container.Id})"><i class="fa fa-exclamation-circle space-right" aria-hidden="true"></i><por-translation key="CONTAINER_DETAILS.WIDGET_CONTAINER_STATUS.ACTIONS.LOGS"></por-translation></a>
<a class="btn btn-outline-secondary" type="button" ui-sref="console({id: container.Id})"><i class="fa fa-terminal space-right" aria-hidden="true"></i><por-translation key="CONTAINER_DETAILS.WIDGET_CONTAINER_STATUS.ACTIONS.CONSOLE"></por-translation></a>
</div>
</td>
</tr>
@ -105,23 +108,23 @@
<div ng-if="container.State.Health" class="row">
<div class="col-lg-12 col-md-12 col-xs-12">
<rd-widget>
<rd-widget-header icon="fa-server" title="Container health"></rd-widget-header>
<rd-widget-header icon="fa-server" title="CONTAINER_DETAILS.WIDGET_CONTAINER_HEALTH.TITLE"></rd-widget-header>
<rd-widget-body classes="no-padding">
<table class="table">
<tbody>
<tr>
<td>Status</td>
<td><por-translation key="COMMON.NOUNS.STATUS"></por-translation></td>
<td>
<i ng-class="{'healthy': 'fa fa-heartbeat space-right green-icon', 'unhealthy': 'fa fa-heartbeat space-right red-icon', 'starting': 'fa fa-heartbeat space-right orange-icon'}[container.State.Health.Status]"></i>
{{ container.State.Health.Status }}
</td>
</tr>
<tr>
<td>Failure count</td>
<td><por-translation key="CONTAINER_DETAILS.WIDGET_CONTAINER_HEALTH.FAILURE_COUNT"></por-translation></td>
<td>{{ container.State.Health.FailingStreak }}</td>
</tr>
<tr>
<td>Last output</td>
<td><por-translation key="CONTAINER_DETAILS.WIDGET_CONTAINER_HEALTH.LAST_OUTPUT"></por-translation></td>
<td>{{ container.State.Health.Log[container.State.Health.Log.length - 1].Output }}</td>
</tr>
</tbody>
@ -134,15 +137,14 @@
<div class="row">
<div class="col-lg-12 col-md-12 col-xs-12">
<rd-widget>
<rd-widget-header icon="fa-clone" title="Create image"></rd-widget-header>
<rd-widget-header icon="fa-clone" title="CONTAINER_DETAILS.WIDGET_CREATE_IMAGE.TITLE"></rd-widget-header>
<rd-widget-body>
<form class="form-horizontal">
<!-- tag-description -->
<div class="form-group">
<div class="col-sm-12">
<span class="small text-muted">
You can create an image from this container, this allows you to backup important data or save
helpful configurations. You'll be able to spin up another container based on this image afterward.
<por-translation key="CONTAINER_DETAILS.WIDGET_CREATE_IMAGE.DESCRIPTION"></por-translation>
</span>
</div>
</div>
@ -155,13 +157,15 @@
<!-- tag-note -->
<div class="form-group">
<div class="col-sm-12">
<span class="small text-muted">Note: if you don't specify the tag in the image name, <span class="label label-default">latest</span> will be used.</span>
<span class="small text-muted">
<por-translation key="CONTAINER_DETAILS.WIDGET_CREATE_IMAGE.TAG_NOTE"></por-translation>
</span>
</div>
</div>
<!-- !tag-note -->
<div class="form-group">
<div class="col-sm-12">
<button type="button" class="btn btn-primary btn-sm" ng-disabled="!config.Image" ng-click="commit()">Create</button>
<button type="button" class="btn btn-primary btn-sm" ng-disabled="!config.Image" ng-click="commit()"><por-translation key="COMMON.VERBS.CREATE"></por-translation></button>
<i id="createImageSpinner" class="fa fa-cog fa-spin" style="margin-left: 5px; display: none;"></i>
</div>
</div>
@ -174,16 +178,16 @@
<div class="row">
<div class="col-lg-12 col-md-12 col-xs-12">
<rd-widget>
<rd-widget-header icon="fa-server" title="Container details"></rd-widget-header>
<rd-widget-header icon="fa-server" title="CONTAINER_DETAILS.WIDGET_CONTAINER_DETAILS.TITLE"></rd-widget-header>
<rd-widget-body classes="no-padding">
<table class="table">
<tbody>
<tr>
<td>Image</td>
<td><por-translation key="CONTAINER_DETAILS.WIDGET_CONTAINER_DETAILS.ROW_IMAGE"></por-translation></td>
<td><a ui-sref="image({id: container.Image})">{{ container.Image }}</a></td>
</tr>
<tr ng-if="portBindings.length > 0">
<td>Port configuration</td>
<td><por-translation key="CONTAINER_DETAILS.WIDGET_CONTAINER_DETAILS.ROW_PORT"></por-translation></td>
<td>
<div ng-repeat="portMapping in portBindings">
{{ portMapping.container }} <i class="fa fa-long-arrow-right"></i> {{ portMapping.host }}
@ -206,7 +210,7 @@
</td>
</tr>
<tr ng-if="!(container.Config.Labels | emptyobject)">
<td>Labels</td>
<td><por-translation key="CONTAINER_DETAILS.WIDGET_CONTAINER_DETAILS.ROW_LABELS"></por-translation></td>
<td>
<table class="table table-bordered table-condensed">
<tr ng-repeat="(k, v) in container.Config.Labels">
@ -217,11 +221,11 @@
</td>
</tr>
<tr ng-if="container.HostConfig.RestartPolicy.Name !== 'no'">
<td>Restart policies</td>
<td><por-translation key="CONTAINER_DETAILS.WIDGET_CONTAINER_DETAILS.ROW_RESTART_POLICIES"></por-translation></td>
<td>
<table class="table table-bordered table-condensed">
<tr>
<td class="col-md-3">Name</td>
<td class="col-md-3"><por-translation key="COMMON.NOUNS.NAME"></por-translation></td>
<td>{{ container.HostConfig.RestartPolicy.Name }}</td>
</tr>
<tr>
@ -243,13 +247,13 @@
<div class="row" ng-if="container.HostConfig.Binds.length > 0">
<div class="col-lg-12 col-md-12 col-xs-12">
<rd-widget>
<rd-widget-header icon="fa-cubes" title="Volumes"></rd-widget-header>
<rd-widget-header icon="fa-cubes" title="CONTAINER_DETAILS.WIDGET_CONTAINER_VOLUMES.TITLE"></rd-widget-header>
<rd-widget-body classes="no-padding">
<table class="table">
<thead>
<tr>
<th>Host</th>
<th>Container</th>
<th><por-translation key="CONTAINER_DETAILS.WIDGET_CONTAINER_VOLUMES.TABLE.HEADERS.HOST"></por-translation></th>
<th><por-translation key="CONTAINER_DETAILS.WIDGET_CONTAINER_VOLUMES.TABLE.HEADERS.CONTAINER"></por-translation></th>
</tr>
</thead>
<tbody>
@ -267,11 +271,11 @@
<div class="row">
<div class="col-lg-12 col-md-12 col-xs-12">
<rd-widget>
<rd-widget-header icon="fa-sitemap" title="Connected networks">
<rd-widget-header icon="fa-sitemap" title="CONTAINER_DETAILS.WIDGET_CONTAINER_NETWORKS.TITLE">
<div class="pull-right">
Items per page:
<por-translation key="WIDGETS.PAGINATION.TEXT"></por-translation>
<select ng-model="state.pagination_count" ng-change="changePaginationCount()">
<option value="0">All</option>
<option value="0" translate>COMMON.UI.ALL</option>
<option value="10">10</option>
<option value="25">25</option>
<option value="50">50</option>
@ -282,11 +286,11 @@
<rd-widget-body classes="no-padding">
<table class="table">
<thead>
<th>Network Name</th>
<th>IP Address</th>
<th>Gateway</th>
<th>MacAddress</th>
<th>Actions</th>
<th><por-translation key="CONTAINER_DETAILS.WIDGET_CONTAINER_NETWORKS.TABLE.HEADERS.NETWORK_NAME"></por-translation></th>
<th><por-translation key="CONTAINER_DETAILS.WIDGET_CONTAINER_NETWORKS.TABLE.HEADERS.IP"></por-translation></th>
<th><por-translation key="CONTAINER_DETAILS.WIDGET_CONTAINER_NETWORKS.TABLE.HEADERS.GATEWAY"></por-translation></th>
<th><por-translation key="CONTAINER_DETAILS.WIDGET_CONTAINER_NETWORKS.TABLE.HEADERS.MAC"></por-translation></th>
<th><por-translation key="CONTAINER_DETAILS.WIDGET_CONTAINER_NETWORKS.TABLE.HEADERS.ACTIONS"></por-translation></th>
</thead>
<tbody>
<tr dir-paginate="(key, value) in container.NetworkSettings.Networks | itemsPerPage: state.pagination_count">
@ -295,11 +299,13 @@
<td>{{ value.Gateway || '-' }}</td>
<td>{{ value.MacAddress || '-' }}</td>
<td>
<button type="button" class="btn btn-xs btn-danger" ng-click="containerLeaveNetwork(container, value.NetworkID)"><i class="fa fa-trash space-right" aria-hidden="true"></i>Leave Network</button>
<button type="button" class="btn btn-xs btn-danger" ng-click="containerLeaveNetwork(container, value.NetworkID)"><i class="fa fa-trash space-right" aria-hidden="true"></i><por-translation key="CONTAINER_DETAILS.WIDGET_CONTAINER_NETWORKS.DISCONNECT"></por-translation></button>
</td>
</tr>
<tr ng-if="(container.NetworkSettings.Networks | emptyobject)">
<td colspan="5" class="text-center text-muted">No networks connected.</td>
<td colspan="5" class="text-center text-muted">
<por-translation key="CONTAINER_DETAILS.WIDGET_CONTAINER_NETWORKS.TABLE.EMPTY"></por-translation>
</td>
</tr>
</tbody>
</table>
@ -310,15 +316,15 @@
<form class="form-horizontal">
<!-- network-input -->
<div class="row">
<label for="container_network" class="col-sm-3 col-lg-2 control-label text-left">Join a Network</label>
<label for="container_network" class="col-sm-3 col-lg-2 control-label text-left"><por-translation key="CONTAINER_DETAILS.WIDGET_CONTAINER_NETWORKS.CONNECT_NETWORK"></por-translation></label>
<div class="col-sm-5 col-lg-4">
<select class="form-control" ng-model="selectedNetwork" id="container_network">
<option selected disabled hidden value="">Select a network</option>
<option selected disabled hidden value="" translate>CONTAINER_DETAILS.WIDGET_CONTAINER_NETWORKS.SELECT_NETWORK</option>
<option ng-repeat="net in availableNetworks" ng-value="net.Id">{{ net.Name }}</option>
</select>
</div>
<div class="col-sm-1">
<button type="button" class="btn btn-primary btn-sm" ng-disabled="!selectedNetwork" ng-click="containerJoinNetwork(container, selectedNetwork)">Join Network</button>
<button type="button" class="btn btn-primary btn-sm" ng-disabled="!selectedNetwork" ng-click="containerJoinNetwork(container, selectedNetwork)"><por-translation key="CONTAINER_DETAILS.WIDGET_CONTAINER_NETWORKS.CONNECT"></por-translation></button>
</div>
</div>
</form>

View File

@ -1,7 +1,8 @@
angular.module('portainer').component('porTranslation', {
bindings: {
'key': '@',
'compile': '@'
'compile': '@',
'values': '<'
},
template: '<span translate translate-compile="{{ $ctrl.compile ? $ctrl.compile : false }}">{{ $ctrl.key }}</span>'
template: '<span translate translate-compile="{{ $ctrl.compile ? $ctrl.compile : false }}" translate-values="{{ $ctrl.values }}">{{ $ctrl.key }}</span>'
});

View File

@ -113,30 +113,6 @@ angular.module('portainer.filters', [])
return _.capitalize(text);
};
})
.filter('getstatetext', function () {
'use strict';
return function (state) {
if (state === undefined) {
return '';
}
if (state.Dead) {
return 'Dead';
}
if (state.Ghost && state.Running) {
return 'Ghost';
}
if (state.Running && state.Paused) {
return 'Running (Paused)';
}
if (state.Running) {
return 'Running';
}
if (state.Status === 'created') {
return 'Created';
}
return 'Stopped';
};
})
.filter('stripprotocol', function() {
'use strict';
return function (url) {

View File

@ -5,6 +5,7 @@ angular.module('portainer.services')
var service = {};
service.setLang = function(lang) {
moment.locale(lang);
$translate.use(lang);
};

View File

@ -1,15 +1,38 @@
{
"COMMON": {
"NOUNS": {
"STATUS": "Status",
"NAME": "Name"
},
"VERBS": {
"CREATE": "Create",
"REFRESH": "Refresh",
"HIDE": "Hide",
"FILTER": "Filter"
"FILTER": "Filter",
"START": "Start",
"STOP": "Stop",
"KILL": "Kill",
"RESTART": "Restart",
"PAUSE": "Pause",
"RESUME": "Resume",
"REMOVE": "Remove",
"RECREATE": "Recreate",
"DUPLICATE": "Duplicate",
"EDIT": "Edit"
},
"DOCKER": {
"ID": "ID",
"CONTAINER": "container",
"CONTAINERS": "Containers",
"VOLUME": "volume",
"HOST": "host"
"HOST": "host",
"CONTAINER_STATUS": {
"DEAD": "Dead",
"GHOST": "Ghost",
"RUNNING": "Running",
"CREATED": "Created",
"STOPPED": "Stopped"
}
},
"UI": {
"LOADING": "Loading...",
@ -65,6 +88,77 @@
}
}
},
"CONTAINER_DETAILS": {
"HEADER": {
"TITLE": "Container details"
},
"WIDGET_ACTIONS": {
"TITLE": "Actions"
},
"WIDGET_CONTAINER_STATUS": {
"TITLE": "Container status",
"ROW_NAME": "Name",
"ROW_IP": "IP address",
"ROW_STATUS": "Status",
"ROW_CREATED": "Created",
"ROW_START_TIME": "Start time",
"ROW_FINISHED": "Finished",
"STATUS": {
"RUNNING": "Running since {{ time }}",
"CREATED": "Created since {{ time }}",
"STOPPED": "Stopped since {{ time }} with exit code {{ code }}",
"DEAD": "Dead since {{ time }} with exit code {{ code }}"
},
"ACTIONS": {
"STATS": "Stats",
"LOGS": "Logs",
"CONSOLE": "Console"
}
},
"WIDGET_CONTAINER_HEALTH": {
"TITLE": "Container health",
"FAILURE_COUNT": "Failure count",
"LAST_OUTPUT": "Last output"
},
"WIDGET_CREATE_IMAGE": {
"TITLE": "Create image",
"DESCRIPTION": "You can create an image from this container, this allows you to backup important data or save helpful configurations. You'll be able to spin up another container based on this image afterward.",
"TAG_NOTE": "Note: if you don't specify the tag in the image name, <span class='label label-default'>latest</span> will be used."
},
"WIDGET_CONTAINER_DETAILS": {
"TITLE": "Container details",
"ROW_IMAGE": "Image",
"ROW_PORT": "Port configuration",
"ROW_LABELS": "Labels",
"ROW_RESTART_POLICIES": "Restart policies"
},
"WIDGET_CONTAINER_VOLUMES": {
"TITLE": "Volumes",
"TABLE": {
"HEADERS": {
"HOST": "Host",
"CONTAINER": "Container"
}
}
},
"WIDGET_CONTAINER_NETWORKS": {
"TITLE": "Connected networks",
"TABLE": {
"HEADERS": {
"NETWORK_NAME": "Network name",
"IP": "IP address",
"GATEWAY": "Gateway",
"MAC": "MAC address",
"ACTIONS": "Actions"
},
"EMPTY": "No networks connected."
},
"CONNECT_NETWORK": "Join a network",
"SELECT_NETWORK": "Select a network",
"CONNECT": "Join network",
"DISCONNECT": "Leaver network"
}
},
"TEMPLATES": {
"HEADER": {
"TITLE": "Application templates list",
@ -84,7 +178,6 @@
"LABEL": "Port mapping",
"MAP_PORT": "map additional port",
"NOTE": "Portainer will automatically assign a port if you leave the host port empty.",
"HOST": "host"
},
"VOLUME_MAPPING": {
"LABEL": "Volume mapping",

View File

@ -1,15 +1,38 @@
{
"COMMON": {
"NOUNS": {
"STATUS": "Statut",
"NAME": "Nom"
},
"VERBS": {
"CREATE": "Créer",
"REFRESH": "Rafraîchir",
"HIDE": "Cacher",
"FILTER": "Filtrer"
"FILTER": "Filtrer",
"START": "Démarrer",
"STOP": "Stopper",
"KILL": "Tuer",
"RESTART": "Redémarrer",
"PAUSE": "Pause",
"RESUME": "Reprendre",
"REMOVE": "Supprimer",
"RECREATE": "Re-créer",
"DUPLICATE": "Dupliquer",
"EDIT": "Editer"
},
"DOCKER": {
"ID": "ID",
"CONTAINER": "conteneur",
"CONTAINERS": "Containers",
"VOLUME": "volume",
"HOST": "hôte"
"HOST": "hôte",
"CONTAINER_STATUS": {
"DEAD": "Mort",
"GHOST": "Fantôme",
"RUNNING": "Démarré",
"CREATED": "Créé",
"STOPPED": "Stoppé"
}
},
"UI": {
"LOADING": "Chargement...",
@ -65,6 +88,77 @@
}
}
},
"CONTAINER_DETAILS": {
"HEADER": {
"TITLE": "Informations à propos du conteneur"
},
"WIDGET_ACTIONS": {
"TITLE": "Actions"
},
"WIDGET_CONTAINER_STATUS": {
"TITLE": "Statut du conteneur",
"ROW_NAME": "Nom",
"ROW_IP": "Adresse IP",
"ROW_STATUS": "Statut",
"ROW_CREATED": "Date de création",
"ROW_START_TIME": "Date de démarrage",
"ROW_FINISHED": "Date de fin",
"STATUS": {
"RUNNING": "Démarré depuis {{ time }}",
"CREATED": "Créé depuis {{ time }}",
"STOPPED": "Stoppé depuis {{ time }} avec code de retour {{ code }}",
"DEAD": "Mort depuis {{ time }} avec code de retour {{ code }}"
},
"ACTIONS": {
"STATS": "Stats",
"LOGS": "Logs",
"CONSOLE": "Console"
}
},
"WIDGET_CONTAINER_HEALTH": {
"TITLE": "Santé du conteneur (health check)",
"FAILURE_COUNT": "Nombre d'échecs",
"LAST_OUTPUT": "Dernière sortie"
},
"WIDGET_CREATE_IMAGE": {
"TITLE": "Créer une image",
"DESCRIPTION": "Vous pouvez créer une image à partir de ce conteneur, ceci vous permettra de sauvegarder les données ou toute configuration présente dans ce conteneur. Vous pourrez ensuite démarrer un autre conteneur basé sur cette image.",
"TAG_NOTE": "Note: si vous ne spécifiez pas de tag dans le nom de l'image, le tag <span class='label label-default'>latest</span> sera utilisé."
},
"WIDGET_CONTAINER_DETAILS": {
"TITLE": "A propos du conteneur",
"ROW_IMAGE": "Image",
"ROW_PORT": "Configuration des ports",
"ROW_LABELS": "Labels",
"ROW_RESTART_POLICIES": "Politiques de redémarrage"
},
"WIDGET_CONTAINER_VOLUMES": {
"TITLE": "Volumes",
"TABLE": {
"HEADERS": {
"HOST": "Hôte",
"CONTAINER": "Conteneur"
}
}
},
"WIDGET_CONTAINER_NETWORKS": {
"TITLE": "Réseaux connectés",
"TABLE": {
"HEADERS": {
"NETWORK_NAME": "Nom du réseau",
"IP": "Adresse IP",
"GATEWAY": "Passerelle",
"MAC": "Adresse MAC",
"ACTIONS": "Actions"
},
"EMPTY": "Aucun réseau connecté."
},
"CONNECT_NETWORK": "Connecter à un réseau",
"SELECT_NETWORK": "Choisir un réseau",
"CONNECT": "Connecter",
"DISCONNECT": "Déconnecter"
}
},
"TEMPLATES": {
"HEADER": {
"TITLE": "Liste de templates applicatifs",

View File

@ -8,7 +8,7 @@ js:
- bower_components/Chart.js/Chart.js
- bower_components/filesize/lib/filesize.js
- bower_components/lodash/dist/lodash.js
- bower_components/moment/moment.js
- bower_components/moment/min/moment-with-locales.js
- bower_components/splitargs/src/splitargs.js
- bower_components/toastr/toastr.js
- bower_components/xterm.js/dist/xterm.js
@ -22,7 +22,7 @@ js:
- bower_components/Chart.js/Chart.min.js
- bower_components/filesize/lib/filesize.min.js
- bower_components/lodash/dist/lodash.min.js
- bower_components/moment/min/moment.min.js
- bower_components/moment/min/moment-with-locales.min.js
- bower_components/splitargs/src/splitargs.js
- bower_components/toastr/toastr.min.js
- bower_components/xterm.js/dist/xterm.js