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>
<rd-header-title title="Container details"> <rd-header-title title="CONTAINER_DETAILS.HEADER.TITLE">
<i id="loadingViewSpinner" class="fa fa-cog fa-spin"></i> <i id="loadingViewSpinner" class="fa fa-cog fa-spin"></i>
</rd-header-title> </rd-header-title>
<rd-header-content> <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-content>
</rd-header> </rd-header>
<div class="row"> <div class="row">
<div class="col-lg-12 col-md-12 col-xs-12"> <div class="col-lg-12 col-md-12 col-xs-12">
<rd-widget> <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"> <rd-widget-body classes="padding">
<div class="btn-group" role="group" aria-label="..."> <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-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>Stop</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>Kill</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>Restart</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>Pause</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>Resume</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>Remove</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>Recreate</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>Duplicate/Edit</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> </div>
</rd-widget-body> </rd-widget-body>
</rd-widget> </rd-widget>
@ -31,16 +31,16 @@
<div class="row"> <div class="row">
<div class="col-lg-12 col-md-12 col-xs-12"> <div class="col-lg-12 col-md-12 col-xs-12">
<rd-widget> <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"> <rd-widget-body classes="no-padding">
<table class="table"> <table class="table">
<tbody> <tbody>
<tr> <tr>
<td>ID</td> <td><por-translation key="COMMON.DOCKER.ID"></por-translation></td>
<td>{{ container.Id }}</td> <td>{{ container.Id }}</td>
</tr> </tr>
<tr> <tr>
<td>Name</td> <td><por-translation key="CONTAINER_DETAILS.WIDGET_CONTAINER_STATUS.ROW_NAME"></por-translation></td>
<td ng-if="!container.edit"> <td ng-if="!container.edit">
{{ container.Name|trimcontainername }} {{ container.Name|trimcontainername }}
<a href="" data-toggle="tooltip" title="Edit container name" ng-click="container.edit = true;"><i class="fa fa-edit"></i></a> <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> </td>
</tr> </tr>
<tr ng-if="container.NetworkSettings.IPAddress"> <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> <td>{{ container.NetworkSettings.IPAddress }}</td>
</tr> </tr>
<tr> <tr>
<td>Status</td> <td><por-translation key="COMMON.NOUNS.STATUS"></por-translation></td>
<td> <td>
<i class="fa fa-heartbeat space-right green-icon" ng-if="container.State.Running"></i> <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> <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> </td>
</tr> </tr>
<tr> <tr>
<td>Created</td> <td><por-translation key="CONTAINER_DETAILS.WIDGET_CONTAINER_STATUS.ROW_CREATED"></por-translation></td>
<td>{{ container.Created|getisodate }}</td> <td>{{ container.Created|getisodate }}</td>
</tr> </tr>
<tr ng-if="container.State.Running"> <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> <td>{{ container.State.StartedAt|getisodate }}</td>
</tr> </tr>
<tr ng-if="!container.State.Running && container.State.Status !== 'created'"> <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> <td>{{ container.State.FinishedAt|getisodate }}</td>
</tr> </tr>
<tr> <tr>
<td colspan="2"> <td colspan="2">
<div class="btn-group" role="group" aria-label="..."> <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="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>Logs</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>Console</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> </div>
</td> </td>
</tr> </tr>
@ -105,23 +108,23 @@
<div ng-if="container.State.Health" class="row"> <div ng-if="container.State.Health" class="row">
<div class="col-lg-12 col-md-12 col-xs-12"> <div class="col-lg-12 col-md-12 col-xs-12">
<rd-widget> <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"> <rd-widget-body classes="no-padding">
<table class="table"> <table class="table">
<tbody> <tbody>
<tr> <tr>
<td>Status</td> <td><por-translation key="COMMON.NOUNS.STATUS"></por-translation></td>
<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> <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 }} {{ container.State.Health.Status }}
</td> </td>
</tr> </tr>
<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> <td>{{ container.State.Health.FailingStreak }}</td>
</tr> </tr>
<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> <td>{{ container.State.Health.Log[container.State.Health.Log.length - 1].Output }}</td>
</tr> </tr>
</tbody> </tbody>
@ -134,15 +137,14 @@
<div class="row"> <div class="row">
<div class="col-lg-12 col-md-12 col-xs-12"> <div class="col-lg-12 col-md-12 col-xs-12">
<rd-widget> <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> <rd-widget-body>
<form class="form-horizontal"> <form class="form-horizontal">
<!-- tag-description --> <!-- tag-description -->
<div class="form-group"> <div class="form-group">
<div class="col-sm-12"> <div class="col-sm-12">
<span class="small text-muted"> <span class="small text-muted">
You can create an image from this container, this allows you to backup important data or save <por-translation key="CONTAINER_DETAILS.WIDGET_CREATE_IMAGE.DESCRIPTION"></por-translation>
helpful configurations. You'll be able to spin up another container based on this image afterward.
</span> </span>
</div> </div>
</div> </div>
@ -155,13 +157,15 @@
<!-- tag-note --> <!-- tag-note -->
<div class="form-group"> <div class="form-group">
<div class="col-sm-12"> <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>
</div> </div>
<!-- !tag-note --> <!-- !tag-note -->
<div class="form-group"> <div class="form-group">
<div class="col-sm-12"> <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> <i id="createImageSpinner" class="fa fa-cog fa-spin" style="margin-left: 5px; display: none;"></i>
</div> </div>
</div> </div>
@ -174,16 +178,16 @@
<div class="row"> <div class="row">
<div class="col-lg-12 col-md-12 col-xs-12"> <div class="col-lg-12 col-md-12 col-xs-12">
<rd-widget> <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"> <rd-widget-body classes="no-padding">
<table class="table"> <table class="table">
<tbody> <tbody>
<tr> <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> <td><a ui-sref="image({id: container.Image})">{{ container.Image }}</a></td>
</tr> </tr>
<tr ng-if="portBindings.length > 0"> <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> <td>
<div ng-repeat="portMapping in portBindings"> <div ng-repeat="portMapping in portBindings">
{{ portMapping.container }} <i class="fa fa-long-arrow-right"></i> {{ portMapping.host }} {{ portMapping.container }} <i class="fa fa-long-arrow-right"></i> {{ portMapping.host }}
@ -206,7 +210,7 @@
</td> </td>
</tr> </tr>
<tr ng-if="!(container.Config.Labels | emptyobject)"> <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> <td>
<table class="table table-bordered table-condensed"> <table class="table table-bordered table-condensed">
<tr ng-repeat="(k, v) in container.Config.Labels"> <tr ng-repeat="(k, v) in container.Config.Labels">
@ -217,11 +221,11 @@
</td> </td>
</tr> </tr>
<tr ng-if="container.HostConfig.RestartPolicy.Name !== 'no'"> <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> <td>
<table class="table table-bordered table-condensed"> <table class="table table-bordered table-condensed">
<tr> <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> <td>{{ container.HostConfig.RestartPolicy.Name }}</td>
</tr> </tr>
<tr> <tr>
@ -243,13 +247,13 @@
<div class="row" ng-if="container.HostConfig.Binds.length > 0"> <div class="row" ng-if="container.HostConfig.Binds.length > 0">
<div class="col-lg-12 col-md-12 col-xs-12"> <div class="col-lg-12 col-md-12 col-xs-12">
<rd-widget> <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"> <rd-widget-body classes="no-padding">
<table class="table"> <table class="table">
<thead> <thead>
<tr> <tr>
<th>Host</th> <th><por-translation key="CONTAINER_DETAILS.WIDGET_CONTAINER_VOLUMES.TABLE.HEADERS.HOST"></por-translation></th>
<th>Container</th> <th><por-translation key="CONTAINER_DETAILS.WIDGET_CONTAINER_VOLUMES.TABLE.HEADERS.CONTAINER"></por-translation></th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -267,11 +271,11 @@
<div class="row"> <div class="row">
<div class="col-lg-12 col-md-12 col-xs-12"> <div class="col-lg-12 col-md-12 col-xs-12">
<rd-widget> <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"> <div class="pull-right">
Items per page: <por-translation key="WIDGETS.PAGINATION.TEXT"></por-translation>
<select ng-model="state.pagination_count" ng-change="changePaginationCount()"> <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="10">10</option>
<option value="25">25</option> <option value="25">25</option>
<option value="50">50</option> <option value="50">50</option>
@ -282,11 +286,11 @@
<rd-widget-body classes="no-padding"> <rd-widget-body classes="no-padding">
<table class="table"> <table class="table">
<thead> <thead>
<th>Network Name</th> <th><por-translation key="CONTAINER_DETAILS.WIDGET_CONTAINER_NETWORKS.TABLE.HEADERS.NETWORK_NAME"></por-translation></th>
<th>IP Address</th> <th><por-translation key="CONTAINER_DETAILS.WIDGET_CONTAINER_NETWORKS.TABLE.HEADERS.IP"></por-translation></th>
<th>Gateway</th> <th><por-translation key="CONTAINER_DETAILS.WIDGET_CONTAINER_NETWORKS.TABLE.HEADERS.GATEWAY"></por-translation></th>
<th>MacAddress</th> <th><por-translation key="CONTAINER_DETAILS.WIDGET_CONTAINER_NETWORKS.TABLE.HEADERS.MAC"></por-translation></th>
<th>Actions</th> <th><por-translation key="CONTAINER_DETAILS.WIDGET_CONTAINER_NETWORKS.TABLE.HEADERS.ACTIONS"></por-translation></th>
</thead> </thead>
<tbody> <tbody>
<tr dir-paginate="(key, value) in container.NetworkSettings.Networks | itemsPerPage: state.pagination_count"> <tr dir-paginate="(key, value) in container.NetworkSettings.Networks | itemsPerPage: state.pagination_count">
@ -295,11 +299,13 @@
<td>{{ value.Gateway || '-' }}</td> <td>{{ value.Gateway || '-' }}</td>
<td>{{ value.MacAddress || '-' }}</td> <td>{{ value.MacAddress || '-' }}</td>
<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> </td>
</tr> </tr>
<tr ng-if="(container.NetworkSettings.Networks | emptyobject)"> <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> </tr>
</tbody> </tbody>
</table> </table>
@ -310,15 +316,15 @@
<form class="form-horizontal"> <form class="form-horizontal">
<!-- network-input --> <!-- network-input -->
<div class="row"> <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"> <div class="col-sm-5 col-lg-4">
<select class="form-control" ng-model="selectedNetwork" id="container_network"> <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> <option ng-repeat="net in availableNetworks" ng-value="net.Id">{{ net.Name }}</option>
</select> </select>
</div> </div>
<div class="col-sm-1"> <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>
</div> </div>
</form> </form>

View File

@ -1,7 +1,8 @@
angular.module('portainer').component('porTranslation', { angular.module('portainer').component('porTranslation', {
bindings: { bindings: {
'key': '@', '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); 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() { .filter('stripprotocol', function() {
'use strict'; 'use strict';
return function (url) { return function (url) {

View File

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

View File

@ -1,15 +1,38 @@
{ {
"COMMON": { "COMMON": {
"NOUNS": {
"STATUS": "Status",
"NAME": "Name"
},
"VERBS": { "VERBS": {
"CREATE": "Create", "CREATE": "Create",
"REFRESH": "Refresh", "REFRESH": "Refresh",
"HIDE": "Hide", "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": { "DOCKER": {
"ID": "ID",
"CONTAINER": "container", "CONTAINER": "container",
"CONTAINERS": "Containers",
"VOLUME": "volume", "VOLUME": "volume",
"HOST": "host" "HOST": "host",
"CONTAINER_STATUS": {
"DEAD": "Dead",
"GHOST": "Ghost",
"RUNNING": "Running",
"CREATED": "Created",
"STOPPED": "Stopped"
}
}, },
"UI": { "UI": {
"LOADING": "Loading...", "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": { "TEMPLATES": {
"HEADER": { "HEADER": {
"TITLE": "Application templates list", "TITLE": "Application templates list",
@ -84,7 +178,6 @@
"LABEL": "Port mapping", "LABEL": "Port mapping",
"MAP_PORT": "map additional port", "MAP_PORT": "map additional port",
"NOTE": "Portainer will automatically assign a port if you leave the host port empty.", "NOTE": "Portainer will automatically assign a port if you leave the host port empty.",
"HOST": "host"
}, },
"VOLUME_MAPPING": { "VOLUME_MAPPING": {
"LABEL": "Volume mapping", "LABEL": "Volume mapping",

View File

@ -1,15 +1,38 @@
{ {
"COMMON": { "COMMON": {
"NOUNS": {
"STATUS": "Statut",
"NAME": "Nom"
},
"VERBS": { "VERBS": {
"CREATE": "Créer", "CREATE": "Créer",
"REFRESH": "Rafraîchir", "REFRESH": "Rafraîchir",
"HIDE": "Cacher", "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": { "DOCKER": {
"ID": "ID",
"CONTAINER": "conteneur", "CONTAINER": "conteneur",
"CONTAINERS": "Containers",
"VOLUME": "volume", "VOLUME": "volume",
"HOST": "hôte" "HOST": "hôte",
"CONTAINER_STATUS": {
"DEAD": "Mort",
"GHOST": "Fantôme",
"RUNNING": "Démarré",
"CREATED": "Créé",
"STOPPED": "Stoppé"
}
}, },
"UI": { "UI": {
"LOADING": "Chargement...", "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": { "TEMPLATES": {
"HEADER": { "HEADER": {
"TITLE": "Liste de templates applicatifs", "TITLE": "Liste de templates applicatifs",

View File

@ -8,7 +8,7 @@ js:
- bower_components/Chart.js/Chart.js - bower_components/Chart.js/Chart.js
- bower_components/filesize/lib/filesize.js - bower_components/filesize/lib/filesize.js
- bower_components/lodash/dist/lodash.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/splitargs/src/splitargs.js
- bower_components/toastr/toastr.js - bower_components/toastr/toastr.js
- bower_components/xterm.js/dist/xterm.js - bower_components/xterm.js/dist/xterm.js
@ -22,7 +22,7 @@ js:
- bower_components/Chart.js/Chart.min.js - bower_components/Chart.js/Chart.min.js
- bower_components/filesize/lib/filesize.min.js - bower_components/filesize/lib/filesize.min.js
- bower_components/lodash/dist/lodash.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/splitargs/src/splitargs.js
- bower_components/toastr/toastr.min.js - bower_components/toastr/toastr.min.js
- bower_components/xterm.js/dist/xterm.js - bower_components/xterm.js/dist/xterm.js