Merge branch 'dev' into permission_protection

This commit is contained in:
Kay0u 2020-09-14 11:26:14 +02:00
commit 03190046fa
No known key found for this signature in database
GPG key ID: AAFEEB16CFA2AE2D
40 changed files with 8451 additions and 379 deletions

1
.gitignore vendored
View file

@ -16,5 +16,4 @@ ca.crt
# Debug CSS file
src/css/style.css
src/bower_components
src/dist

9
.travis.yml Normal file
View file

@ -0,0 +1,9 @@
language: node_js
node_js:
- "10"
before_install:
- cd src
script:
- npm ci
- gulp build --dev
- gulp lint --dev

104
debian/changelog vendored
View file

@ -1,3 +1,101 @@
yunohost-admin (4.0.4) stable; urgency=low
- [fix] migrations link in french translation (#309)
- [fix] Stupid typo breaking yunopaste for service logs (7e03213)
- [fix] In log views, sometimes 'error' is empty despite success:false ... so rely on the value of success instead (7894c84)
Thanks to all contributors <3 ! (opi)
-- Alexandre Aubin <alex.aubin@mailoo.org> Fri, 04 Sep 2020 14:54:01 +0200
yunohost-admin (4.0.3) stable; urgency=low
- Bump version number for stable release
-- Alexandre Aubin <alex.aubin@mailoo.org> Wed, 29 Jul 2020 17:00:00 +0200
yunohost-admin (4.0.2~beta) testing; urgency=low
- Bump version number for beta release
-- Alexandre Aubin <alex.aubin@mailoo.org> Fri, 19 Jun 2020 15:41:15 +0200
yunohost-admin (4.0.1~alpha) testing; urgency=low
- [mod] Update deb dependencies and build workflow (fd9949d, 01e452a, f6b8202, 8d35eac, 1a9b16c)
- [fix] Update npm dependencies and build workflow (#304)
Thanks to all contributors <3 ! (Arthur Lutz, Kay0u)
-- Alexandre Aubin <alex.aubin@mailoo.org> Fri, 05 Jun 2020 17:21:38 +0200
yunohost-admin (3.8.3.5) stable; urgency=low
- [fix] Add a hack to have some sort of cache management as well for .ms files, to avoid stupid issue where people need to force the browser cache refresh after upgrades (7bb8a90)
- [i18n] Translations updated for Catalan, French, German, Italian
Thanks to all contributors <3 ! (Jibec, L. Noferini, ppr, V. Rubiolo, xaloc33, Yasss Gurl)
-- Alexandre Aubin <alex.aubin@mailoo.org> Mon, 27 Jul 2020 17:36:43 +0200
yunohost-admin (3.8.3.4) stable; urgency=low
- [enh] Add a tip about pending migrations on update view (7bf9669)
- [i18n] Translations updated for Occitan
Thanks to all contributors <3 ! (Quentí)
-- Alexandre Aubin <alex.aubin@mailoo.org> Sat, 06 Jun 2020 02:23:20 +0200
yunohost-admin (3.8.3.3) stable; urgency=low
- [i18n] Translations updated for Arabic, Italian
Thanks to all contributors <3 ! (ButterflyOfFire, L. Noferini)
-- Alexandre Aubin <alex.aubin@mailoo.org> Tue, 26 May 2020 03:45:09 +0200
yunohost-admin (3.8.3.2) stable; urgency=low
- [fix] Install button in case of multi instance capability (#300)
- [fix] Enforce yunohost 3.8 requirement (3400a43)
- [i18n] Improve translations for Catalan, Chinese (Simplified), French, Occitan, Portuguese
Thanks to all contributors <3 ! (Aleks, amirale qt, clecle266, Kay0u, QuentÃ, Raphael Pessanha, xaloc33)
-- Kay0u <pierre@kayou.io> Wed, 20 May 2020 19:12:27 +0000
yunohost-admin (3.8.3.1) testing; urgency=low
- Add tip about the diagnosis page if domain seems not ready for ACME (e7a4df1)
- Support raw string in 'ask' fields from manifest (for upcoming thing in core about default strings for install questions) (ee20f55)
-- Alexandre Aubin <alex.aubin@mailoo.org> Sat, 09 May 2020 20:24:00 +0200
yunohost-admin (3.8.3) testing; urgency=low
- [enh] Add a note and explanation about sharing the logs when viewing logs of shared operations
- [enh] Filter non-relevant line in operation log view
- [fix] Remove an unecessary call to app list on domain view
-- Alexandre Aubin <alex.aubin@mailoo.org> Thu, 07 Apr 2020 04:15:00 +0000
yunohost-admin (3.8.2) testing; urgency=low
- [enh] Highlight error/warnings/... in tools > logs (#294)
- [enh] Hide stop button for critical services ? (#295)
- [fix] Stupid typo in upgrade controller prevented upgrading all apps (a3a0d8f)
- [fix] Custom app install + misc detail in regular app install (1592ab4)
- [fix] Make the 'all apps' button look like the others (9694d8a)
- [mod] Simplify log view (4480836)
- [enh] Save/restore collapse states when refreshing diagnosis view (a110e56)
- [enh] Add an explanation text on top of the diagnosis view (ccefdd6)
- [i18n] Improve translations for Esperanto, Spanish, French, Occitan, Polish, Nepali
Thanks to all contributors <3 ! (Quentí, Simon, amirale qt)
-- Alexandre Aubin <alex.aubin@mailoo.org> Wed, 29 Apr 2020 23:20:00 +0000
yunohost-admin (3.8.1.1) testing; urgency=low
- [hotfix] Pacman hanging forever after fetching version number..
@ -43,6 +141,12 @@ yunohost-admin (3.8.0) testing; urgency=low
-- Kay0u <pierre@kayou.io> Thu, 09 Apr 2020 20:18:35 +0000
yunohost-admin (3.7.1.1) stable; urgency=low
- [fix] Aleks forgot to properly fix the conflicts in oc.json ~.~
-- Alexandre Aubin <alex.aubin@mailoo.org> Thu, 9 Apr 2020 19:03:00 +0000
yunohost-admin (3.7.1) stable; urgency=low
- [fix] Misc fixes for action / config panel (#289, #282)

8
debian/control vendored
View file

@ -2,17 +2,15 @@ Source: yunohost-admin
Section: utils
Priority: extra
Maintainer: YunoHost Contributors <contrib@yunohost.org>
Build-Depends: debhelper (>=9)
, nodejs (>=4.4.0), git
Build-Depends: debhelper (>=12)
, nodejs (>=10.15.2), npm (>=5.8.0), git
Standards-Version: 3.9.6
Homepage: https://yunohost.org/
Package: yunohost-admin
Architecture: all
Conflicts: yunohost-apps-admin
Replaces: yunohost-apps-admin
Depends: ${misc:Depends}
, yunohost (>= 3.7)
, yunohost (>= 4.0.0~alpha)
Description: web administration interface for yunohost
YunoHost aims to make self-hosting accessible to everyone. It configures
an email, Web and IM server alongside a LDAP base. It also provides

8
debian/rules vendored
View file

@ -15,13 +15,13 @@ TMPDIR = $$(pwd)/debian/yunohost-admin
dh $@
override_dh_auto_build:
# Run npm/bower/gulp
cd src ; npm --progress false --loglevel warn --color false install
# Run npm/gulp
#cd src ; npm ci --progress false --loglevel warn --color false
cd src ; node_modules/gulp/bin/gulp.js build
rm -rf src/node_modules
override_dh_clean:
dh_clean
rm -rf src/node_modules
rm -rf src/bower_components
#rm -rf src/node_modules
rm -rf src/dist

View file

@ -1,17 +0,0 @@
{
"name": "yunohost-admin",
"description": "YunoHost Admin web interface",
"license": "AGPL-3.0",
"private": true,
"dependencies": {
"bootstrap": "3.3.6",
"fork-awesome": "1.1.7",
"handlebars-helper-intl": "1.1.2",
"handlebars": "4.0.11",
"sammy": "0.7.6",
"js-cookie": "2.1.0",
"isotope-layout": "3.0.6",
"source-sans-pro": "git://github.com/adobe-fonts/source-sans-pro.git#2.020R-ro/1.075R-it",
"source-code-pro": "git://github.com/adobe-fonts/source-code-pro.git#2.010R-ro/1.030R-it"
}
}

View file

@ -3,7 +3,7 @@
/*
* Bootstrap
*/
@import "../bower_components/bootstrap/less/bootstrap.less";
@import "../node_modules/bootstrap/less/bootstrap.less";
// Bootstrap variables override
@font-family-sans-serif: "Source Sans Pro", "Helvetica Neue", Helvetica, Arial, sans-serif;
@ -25,7 +25,7 @@
/*
* FontAwesome
*/
@import "../bower_components/fork-awesome/less/fork-awesome.less";
@import "../node_modules/fork-awesome/less/fork-awesome.less";
// Fixes
@ -795,6 +795,7 @@ input[type='radio'].nice-radio {
padding-left:6px;
border-left: #ccc 1px solid;
color:lighten(@label-info-bg,20);
background-color:transparent;
text-decoration: none;
}

View file

@ -6,6 +6,7 @@ var concat = require('gulp-concat'),
uglify = require('gulp-uglify'),
csslint = require('gulp-csslint'),
jshint = require('gulp-jshint'),
mustache = require('gulp-mustache'),
less = require('gulp-less'),
autoprefixer = require('gulp-autoprefixer'),
cssmin = require('gulp-cssmin'),
@ -19,35 +20,18 @@ var concat = require('gulp-concat'),
isDev = (util.env.dev) ? true : false;
isProduction = !isDev;
// Global build task
gulp.task('build', [
'css',
'fonts',
'js',
'img',
]);
// Watch task
gulp.task('watch', function(){
gulp.watch('js/**/*.js', ['js']);
gulp.watch('css/*.less', ['css']);
});
// JS task
gulp.task('js', function() {
return gulp.src([
'bower_components/jquery/dist/jquery.js',
'bower_components/js-cookie/src/js.cookie.js',
'bower_components/handlebars/handlebars.js',
'bower_components/handlebars-helper-intl/dist/handlebars-intl-with-locales.js',
'bower_components/sammy/lib/sammy.js',
'bower_components/sammy/lib/plugins/sammy.handlebars.js',
'bower_components/sammy/lib/plugins/sammy.json.js',
'bower_components/sammy/lib/plugins/sammy.storage.js',
'bower_components/bootstrap/dist/js/bootstrap.js',
'bower_components/isotope-layout/dist/isotope.pkgd.js',
'node_modules/jquery/dist/jquery.js',
'node_modules/handlebars/dist/handlebars.js',
'node_modules/handlebars-intl/dist/handlebars-intl-with-locales.js',
'node_modules/sammy/lib/sammy.js',
'node_modules/sammy/lib/plugins/sammy.handlebars.js',
'node_modules/sammy/lib/plugins/sammy.json.js',
'node_modules/sammy/lib/plugins/sammy.storage.js',
'node_modules/bootstrap/dist/js/bootstrap.js',
'node_modules/isotope-layout/dist/isotope.pkgd.js',
'js/yunohost/y18n.js',
'js/yunohost/main.js',
'js/yunohost/helpers.js',
@ -63,25 +47,26 @@ gulp.task('js', function() {
// JS Lint task
gulp.task('js-lint', function() {
return gulp.src('js/*.js')
return gulp.src('js/**/*.js')
.pipe(jshint())
.pipe(jshint.reporter('default'));
.pipe(jshint.reporter('default'))
.pipe(jshint.reporter('fail'))
});
// Fonts
gulp.task('fonts', function() {
return gulp.src([
'bower_components/fork-awesome/fonts/*',
'bower_components/source-code-pro/EOT/*.eot',
'bower_components/source-code-pro/OTF/*.otf',
'bower_components/source-code-pro/TTF/*.ttf',
'bower_components/source-code-pro/WOFF/OTF/*.woff',
'bower_components/source-code-pro/WOFF2/TTF/*.woff2',
'bower_components/source-sans-pro/EOT/*.eot',
'bower_components/source-sans-pro/OTF/*.otf',
'bower_components/source-sans-pro/TTF/*.ttf',
'bower_components/source-sans-pro/WOFF/OTF/*.woff',
'bower_components/source-sans-pro/WOFF2/TTF/*.woff2',
'node_modules/fork-awesome/fonts/*',
'node_modules/source-code-pro/EOT/*.eot',
'node_modules/source-code-pro/OTF/*.otf',
'node_modules/source-code-pro/TTF/*.ttf',
'node_modules/source-code-pro/WOFF/OTF/*.woff',
'node_modules/source-code-pro/WOFF2/TTF/*.woff2',
'node_modules/source-sans-pro/EOT/*.eot',
'node_modules/source-sans-pro/OTF/*.otf',
'node_modules/source-sans-pro/TTF/*.ttf',
'node_modules/source-sans-pro/WOFF/OTF/*.woff',
'node_modules/source-sans-pro/WOFF2/TTF/*.woff2',
])
.pipe(gulp.dest('./dist/fonts'))
});
@ -105,8 +90,7 @@ gulp.task('css-lint', function() {
.pipe(less())
.pipe(autoprefixer())
.pipe(csslint())
.pipe(csslint.reporter('compact'))
.pipe(gulp.dest('./css/'))
.pipe(csslint.formatter())
});
@ -116,3 +100,23 @@ gulp.task('img', function () {
.pipe(gulpif(isProduction, imagemin()))
.pipe(gulp.dest('./dist/img'))
});
// Views task
gulp.task('views', function () {
return gulp.src('views/**/*.ms')
.pipe(gulp.dest("./dist/views"));
});
// Global build task
gulp.task('build', gulp.series('css', 'fonts', 'js', 'img', 'views'));
// Watch task
gulp.task('watch', function() {
gulp.watch('js/**/*.js', gulp.series('js'));
gulp.watch('css/*.less', gulp.series('css'));
gulp.watch('views/**/*.ms', gulp.series('views'));
});
gulp.task('lint', gulp.series('css-lint', 'js-lint'));
gulp.task('default', gulp.series('build', 'watch'));

View file

@ -154,7 +154,7 @@
app.manifest.maintainer = extractMaintainer(app.manifest);
var isWorking = (app.state === 'working' || app.state === "high-quality") && app.level > 0;
app.installable = (!app.installed || app.manifest.supports_multi_instance)
app.installable = (!app.installed || app.manifest.multi_instance)
app.levelFormatted = isNaN(app.level) ? '?' : app.level;
app.levelColor = levelToColor(app.level);
@ -235,6 +235,22 @@
jQuery("#filter-app-cards").on("keyup", function() {
cardGrid.isotope({ filter: filterApps });
});
$("#install-custom-app a[role='button']").on('click', function() {
var url = $("#install-custom-app input[name='url']")[0].value;
if (url.indexOf("github.com") < 0) {
return;
}
c.confirm(
y18n.t('applications'),
y18n.t('confirm_install_custom_app'),
function(){
c.redirect_to('#/apps/install/custom/' + encodeURIComponent(url));
}
);
});
};
// render
@ -376,13 +392,6 @@
});
})
// Special case for custom app installation.
app.get('#/apps/install/custom', function (c) {
// If we try to GET /apps/install/custom, it means that installation fail.
// Need to redirect to apps/install to get rid of pacamn and see the log.
c.redirect_to('#/apps/install');
});
// Helper function that formats YunoHost style arguments for generating a form
function formatYunoHostStyleArguments(args, params) {
if (!args) {
@ -403,10 +412,16 @@
args[k].helpLink = "";
// Multilingual label
args[k].label = (typeof args[k].ask[y18n.locale] !== 'undefined') ?
args[k].ask[y18n.locale] :
args[k].ask['en']
;
if (typeof args[k].ask === "string")
{
args[k].label = args[k].ask;
}
else if (typeof args[k].ask[y18n.locale] !== 'undefined') {
args[k].label = args[k].ask[y18n.locale];
}
else {
args[k].label = args[k].ask['en'];
}
// Multilingual help text
if (typeof args[k].help !== 'undefined') {
@ -533,16 +548,24 @@
displayLicense: (manifest['license'] !== undefined && manifest['license'] !== 'free')
};
formatYunoHostStyleArguments(data.manifest.arguments.install, params);
formatYunoHostStyleArguments(manifest.arguments.install, params);
// Multilingual description
data.description = (typeof data.manifest.description[y18n.locale] !== 'undefined') ?
data.manifest.description[y18n.locale] :
data.manifest.description['en']
;
if (typeof manifest.description === 'string')
{
data.description = manifest.description;
}
else if (typeof manifest.description[y18n.locale] !== 'undefined')
{
data.description = manifest.description[y18n.locale];
}
else
{
data.description = manifest.description['en'];
}
// Multi Instance settings boolean to text
data.manifest.multi_instance = data.manifest.multi_instance ? y18n.t('yes') : y18n.t('no');
data.manifest.multi_instance = manifest.multi_instance ? y18n.t('yes') : y18n.t('no');
// View app install form
c.view('app/app_install', data);
@ -573,13 +596,16 @@
app_infos.manifest,
c.params
);
},
function () {
c.redirect_to('#/apps/catalog');
}
);
}
else
{
c.appInstallForm(
c.params['app'],
app_name,
app_infos.manifest,
c.params
);
@ -624,45 +650,31 @@
});
// Install custom app from github
app.post('#/apps/install/custom', function(c) {
app.get('#/apps/install/custom/:url', function(c) {
var params = {
label: c.params['label'],
app: c.params['url']
};
delete c.params['label'];
delete c.params['url'];
// Force trailing slash
url = c.params['url'];
url = url.replace(/\/?$/, '/');
raw_manifest_url = url.replace('github.com', 'raw.githubusercontent.com') + 'master/manifest.json'
c.confirm(
y18n.t('applications'),
y18n.t('confirm_install_custom_app'),
function(){
// Fetch manifest.json
jQuery.ajax({ url: raw_manifest_url, type: 'GET' })
.done(function(manifest) {
// raw.githubusercontent.com serve content as plain text
manifest = jQuery.parseJSON(manifest) || {};
// Force trailing slash
params.app = params.app.replace(/\/?$/, '/');
c.appInstallForm(
url,
manifest,
c.params
);
// Get manifest.json to get additional parameters
jQuery.ajax({
url: params.app.replace('github.com', 'raw.githubusercontent.com') + 'master/manifest.json',
type: 'GET',
})
.done(function(manifest) {
// raw.githubusercontent.com serve content as plain text
manifest = jQuery.parseJSON(manifest) || {};
})
.fail(function(xhr) {
c.flash('fail', y18n.t('app_install_custom_no_manifest'));
c.redirect("#/apps/catalog/");
});
c.appInstallForm(
params.app,
manifest,
c.params
);
})
.fail(function(xhr) {
c.flash('fail', y18n.t('app_install_custom_no_manifest'));
c.refresh();
});
}
);
});
// A small utility to convert a string to title case

View file

@ -13,8 +13,8 @@
});
});
function updateDiagnosisView(state) {
function updateDiagnosisView() {
c.api('GET', '/diagnosis/show?full', {}, function(data) {
if (typeof(data.reports) === "undefined")
@ -41,6 +41,9 @@
if (type_ == "success") {
icon = "check-circle";
}
else if (type_ == "info") {
icon = "info-circle";
}
else if (ignored == true) {
icon = type_;
if (type_ == "error") {
@ -75,6 +78,8 @@
// Render and display the view
c.view('diagnosis/diagnosis_show', data, function() {
restoreDiagnosisViewState(state);
// Button for first diagnosis
$("button[data-action='run-full-diagnosis']").click(function() {
c.api('POST', '/diagnosis/run', {}, function(data) {
@ -94,7 +99,7 @@
$("button[data-action='rerun-diagnosis']").click(function() {
var category = $(this).data("category");
c.api('POST', '/diagnosis/run?force', {"categories": [category]}, function(data) {
updateDiagnosisView();
updateDiagnosisView(saveDiagnosisViewState());
});
});
@ -102,19 +107,46 @@
$("button[data-action='ignore']").click(function() {
var filter_args = $(this).data("filter-args");
c.api('POST', '/diagnosis/ignore', {'add_filter': filter_args.split(',') }, function(data) {
updateDiagnosisView();
updateDiagnosisView(saveDiagnosisViewState());
})
});
$("button[data-action='unignore']").click(function() {
var filter_args = $(this).data("filter-args");
c.api('POST', '/diagnosis/ignore', {'remove_filter': filter_args.split(',') }, function(data) {
updateDiagnosisView();
updateDiagnosisView(saveDiagnosisViewState());
})
});
});
});
}
// Save current level of scroll + which panels are collapsed / not collapsed
function saveDiagnosisViewState() {
var collapse = {};
$(".panel-diagnosis").each(function(i, el) {
collapse[$(el).data("category")] = $($(".panel-body", el)[0]).hasClass("in");
});
return { "scroll": document.documentElement.scrollTop, "collapse": collapse };
}
// Restore scroll + panel collapse state
function restoreDiagnosisViewState(state) {
if (typeof state === "undefined") { return; }
Object.keys(state.collapse).forEach(function(category) {
if (state.collapse[category]) {
$(".panel-diagnosis[data-category='"+category+"'] .panel-body").addClass("in");
}
else
{
$(".panel-diagnosis[data-category='"+category+"'] .panel-body").removeClass("in");
}
});
window.scroll(0,state.scroll);
}
})();

View file

@ -84,40 +84,37 @@
// Get existing domain info
app.get('#/domains/:domain', function (c) {
c.api('PUT', '/domains/main', {}, function(dataMain) {
c.api('GET', '/apps?installed', {}, function(data) {
var domain = {
name: c.params['domain'],
main: (c.params['domain'] == dataMain.current_main_domain) ? true : false,
url: "https://"+c.params['domain']
};
c.view('domain/domain_info', domain, function() {
var domain = {
name: c.params['domain'],
main: (c.params['domain'] == dataMain.current_main_domain) ? true : false,
url: "https://"+c.params['domain']
};
c.view('domain/domain_info', domain, function() {
// Configure "set default" button
$('button[data-action="set_default"]').on("click", function() {
var domain = $(this).data("domain");
c.confirm(
y18n.t('domains'),
y18n.t('confirm_change_maindomain'),
function() {
c.api('PUT', '/domains/main', {new_main_domain: domain}, function() { c.refresh() });
}
)
});
// Configure "set default" button
$('button[data-action="set_default"]').on("click", function() {
var domain = $(this).data("domain");
c.confirm(
y18n.t('domains'),
y18n.t('confirm_change_maindomain'),
function() {
c.api('PUT', '/domains/main', {new_main_domain: domain}, function() { c.refresh() });
}
)
});
// Configure delete button
$('button[data-action="delete"]').on("click", function() {
var domain = $(this).data("domain");
c.confirm(
y18n.t('domains'),
y18n.t('confirm_delete', [domain]),
function(){
c.api('DELETE', '/domains/'+ domain, {}, function(data) {
c.redirect_to('#/domains');
});
}
);
});
// Configure delete button
$('button[data-action="delete"]').on("click", function() {
var domain = $(this).data("domain");
c.confirm(
y18n.t('domains'),
y18n.t('confirm_delete', [domain]),
function(){
c.api('DELETE', '/domains/'+ domain, {}, function() {
c.redirect_to('#/domains');
});
}
);
});
});
});

View file

@ -58,6 +58,18 @@
c.view('service/service_info', data, function() {
// Don't allow user to stop critical services from the webadmin
$('button[data-action="stop"]').each(function() {
var critical = ['nginx', 'ssh', 'slapd', 'yunohost-api'];
var service = $(this).data('service');
if (critical.indexOf(service) >= 0)
{
$(this).hide();
}
});
// Configure behavior for enable/disable and start/stop buttons
$('button[data-action="start"], button[data-action="restart"], button[data-action="stop"]').on('click', function() {
@ -96,7 +108,7 @@
url: 'https://paste.yunohost.org/documents',
data: $("#logs").text(),
})
.success(function(data, textStatus, jqXHR) {
.done(function(data, textStatus, jqXHR) {
window.open('https://paste.yunohost.org/' + data.key, '_blank');
})
.fail(function() {

View file

@ -50,6 +50,8 @@
// System update & upgrade
app.get('#/update', function (c) {
c.api('PUT', '/update', {}, function(data) {
c.api('GET', '/migrations?pending', {}, function(pending_migrations) {
data.pending_migrations = pending_migrations.migrations;
c.view('tools/tools_update', data, function() {
// Configure buttons behaviors
$("button[data-upgrade]").on("click", function() {
@ -58,7 +60,7 @@
// Upgrade all apps or the system
if ((what == "system") || (what == "system"))
if ((what == "system") || (what == "apps"))
{
var confirm_message = y18n.t('confirm_update_' + what);
var api_url = '/upgrade?'+what;
@ -84,42 +86,25 @@
});
});
});
});
});
// Display journals list
app.get('#/tools/logs', function (c) {
c.api('GET', "/logs?limit=25&with_details", {}, function(categories) {
data = [];
category_icons = {
'operation': 'wrench',
'history': 'history',
'package': 'puzzle-piece',
'system': 'cogs',
'access': 'ban',
'service': 'cog',
'app': 'cubes'
}
c.api('GET', "/logs?limit=40&with_details", {}, function(operations) {
operations = operations["operation"];
success_icons = {
true: 'check text-success',
false: 'close text-danger',
'?': 'question text-warning'
}
for (var category in categories) {
for (var log in categories[category])
{
categories[category][log].success_icon = success_icons[categories[category][log].success]
}
if (categories.hasOwnProperty(category)) {
data.push({
key:category,
icon:(category in category_icons)?category_icons[category]:'info-circle',
value:categories[category]
});
}
for (var log in operations)
{
operations[log].success_icon = success_icons[operations[log].success]
}
c.view('tools/tools_logs', {
"data": data,
"operations": operations,
"locale": y18n.locale
});
});
@ -128,20 +113,22 @@
// One journal
app.get(/\#\/tools\/logs\/(.*)(\?number=(\d+))?/, function (c) {
var params = "?path=" + c.params["splat"][0];
var number = (c.params["number"])?c.params["number"]:50;
params += "&number=" + number;
var number = (c.params["number"])?c.params["number"]:25;
params += "&filter_irrelevant&with_suboperations&number=" + number;
c.api('GET', "/logs/display" + params, {}, function(log) {
if ('metadata' in log) {
if (!'env' in log.metadata && 'args' in log.metadata) {
log.metadata.env = log.metadata.args
}
}
c.view('tools/tools_log', {
"log": log,
"next_number": log.logs.length == number ? number * 10:false,
"locale": y18n.locale
}, function() {
log = $("#main #log").html();
log = log.replace(/.*: ERROR - .*/g, function (match) { return '<span class="alert-danger">'+match+'</span>'});
log = log.replace(/.*: WARNING - .*/g, function (match) { return '<span class="alert-warning">'+match+'</span>'});
log = log.replace(/.*: SUCCESS - .*/g, function (match) { return '<span class="alert-success">'+match+'</span>'});
log = log.replace(/.*: INFO - .*/g, function (match) { return '<span class="alert-info">'+match+'</span>'});
$("#main #log").html(log);
// Configure behavior for the button to share log on Yunohost (it calls display --share)
$('button[data-action="share"]').on("click", function() {
c.api('GET', '/logs/display?path='+$(this).data('log-id')+'&share', {},

View file

@ -187,11 +187,9 @@
data.password_min_length = PASSWORD_MIN_LENGTH;
c.view('user/user_create', data, function(){
var usernameField = $('#username');
usernameField.on('blur', function(){
var emailField = $('#email');
if (emailField.val() == '') {
emailField.val(usernameField.val());
}
usernameField.on('input', function(){
var emailLeft = $('#email-left');
emailLeft.html(usernameField.val());
});
});
});
@ -209,9 +207,7 @@
c.params['mailbox_quota'] += "M";
}
else {c.params['mailbox_quota'] = 0;}
// Compute email field
c.params['mail'] = c.params['email'] + c.params['domain'];
c.params['domain'] = c.params['domain'].slice(1);
c.api('POST', '/users', c.params.toHash(), function(data) {
c.redirect_to('#/users');

View file

@ -28,6 +28,8 @@
app.before(/domains\/add/, prefetchDomains);
app.before(/apps\/install\//, prefetchDomains);
app.before(/apps\/install\//, prefetchUsers);
app.before(/apps\/install\/custom\//, prefetchDomains);
app.before(/apps\/install\/custom\//, prefetchUsers);
app.before(/apps\/\w+\/actions/, prefetchUsers);
app.before(/apps\/\w+\/actions/, prefetchDomains);
app.before(/apps\/\w+\/config-panel/, prefetchUsers);

View file

@ -1,4 +1,10 @@
(function() {
// This is to fetch the "RANDOMID" after script.min.js?version= in
// index.html
// We later use the same ID as a hacky cache mechanism for the .ms files
var ynh_assets_version = document.getElementsByTagName('script')[0].src.split("=")[1];
// Get application context
var app = Sammy.apps['#main'];
var store = app.store;
@ -118,13 +124,13 @@
$.ajax({
dataType: "json",
url: 'https://'+ baseUrl +'/installed',
timeout: 3000
})
.success(function(data) {
callback(data.installed);
})
.fail(function() {
callback(undefined);
timeout: 3000,
success: function(data) {
callback(data.installed);
},
fail: function() {
callback(undefined);
}
});
},
@ -319,7 +325,7 @@
$('#modal').modal('hide');
// Render content
var rendered = this.render('views/'+ view +'.ms', data);
var rendered = this.render('dist/views/' + view + '.ms?version=' + ynh_assets_version, data);
// Update content helper
var leSwap = function() {
@ -336,11 +342,11 @@
}
});
// Run callback
callback();
// Force scrollTop on page load
$('html, body').scrollTop(0);
// Run callback
callback();
});
};

View file

@ -4,7 +4,7 @@
"remove": "حذف",
"administration_password": "كلمة السر الإدارية",
"allowed_users": "المستخدمون المصرح لهم",
"api_not_responding": "واجهة برمجة التطبيقات API لا تستجيب",
"api_not_responding": "واجهة برمجة تطبيقات API الخاصة بـ YunoHost لا تستجيب. ربما 'yunohost-api' معطّلة أو تم إعادة تشغيلها؟",
"app_access": "النفاذ",
"app_access_addall_btn": "السماح بالنفاذ للجميع",
"app_access_addall_desc": "سيُسمح لكافة المستخدمين الموجودين النفاذ إلى %s.",
@ -17,7 +17,7 @@
"app_change_url": "تغيير عنوان الرابط",
"app_debug_no_logs": "سجلات هذا البرنامج غير متوفرة",
"app_debug_tab": "إظهار معلومات التنقيح",
"app_info_access_desc": "إدارة تصريحات النفاذ. المستخدمون المصرح لهم : %s",
"app_info_access_desc": "الفِرَق / المستخدمون المصرّح لهم للنفاذ إلى هذا التطبيق:",
"app_info_changelabel_desc": "تعديل تسمية البرنامج على البوابة.",
"app_info_debug_desc": "عرض معلومات التنقيح الخاصة بهذا البرنامج.",
"app_info_default_desc": "تحويل مسار جذر النطاق نحو هذا البرنامج (%s).",
@ -30,7 +30,7 @@
"app_make_default": "تعيينه كافتراضي",
"app_repository": "مصدر البرنامج : ",
"app_state": "حالة البرنامج : ",
"app_state_inprogress": "جارٍ العمل عليه",
"app_state_inprogress": "لا يعمل بعد",
"app_state_notworking": "لا يعمل بعدُ",
"app_state_validated": "موافَق عليها",
"app_state_working": "يشتغل",
@ -242,7 +242,7 @@
"save": "حفظ",
"select_user": "إختر مستخدما",
"service_log": "%s log",
"service_start_on_boot": "Start on boot: ",
"service_start_on_boot": "تُطلَق عند بداية التشغيل",
"service_status": "الحالة : ",
"services": "الخدمات",
"services_list": "قائمة الخدمات",
@ -257,11 +257,11 @@
"swap": "Swap",
"system": "النظام",
"system_apps": "التطبيقات",
"system_apps_nothing": "لا يوجد هناك أي برنامج بحاجة إلى تحديث.",
"system_apps_nothing": "كافة التطبيقات حديثة!",
"system_delayed_upgrade": "ترقية أو تحديث مؤجل",
"system_delayed_upgrade_warning": "سوف يُحدَّث <b>%s</b> تلقائيا خلال الساعة القادمة.",
"system_packages": "الحزم",
"system_packages_nothing": "ليس هناك أية حزمة تحتاج إلى ترقية أو تحديث.",
"system_packages_nothing": "كافة حزم النظام حديثة!",
"system_update": "تحديث النظام",
"system_upgrade": "تحديث النظام",
"system_upgrade_btn": "ترقية",
@ -328,7 +328,7 @@
"wrong_password": "كلمة السر خاطئة",
"yes": "نعم",
"certificate_alert_not_valid": "حرِج : إنّ شهادة الأمان الحالية لم تعُد صالحة! لن يُصبح بالإمكان النفاذ عبر بروتوكول الـ HTTPS !",
"certificate_alert_selfsigned": "تحذير : إنّ شهادة الأمان الحالية مُوقّعة شخصيا. سوف تُظهِر متصفحات الويب رسالة تحذير قد تثير هلع الزوار الجُدد !",
"certificate_alert_selfsigned": "تحذير : إنّ شهادة الأمان الحالية مُوقّعة ذاتيًا. سوف تُظهِر متصفحات الويب رسالة تحذير قد تثير هلع الزوار الجُدد!",
"certificate_alert_letsencrypt_about_to_expire": "إن مدة صلاحية الشهادة سوف تنتهي قريبًا. سوف يتم تجديدها بصورة تلقائية.",
"certificate_alert_about_to_expire": "تحذير : إنّ مدة صلاحية الشهادة سوف تنتهي قريبًا ! و لن يتم تجديدها تلقائيًا !",
"certificate_alert_good": "حسنًا، يبدو أنّ شهادتك الحالية جيدة !",
@ -409,7 +409,7 @@
"unmaintained": "غير مُصان",
"app_state_high-quality": "جودة عالية",
"license": "الرخصة",
"orphaned": "غير مصانة",
"orphaned": "غير مصان",
"advanced": "متقدّم",
"from_to": "مِن %s إلى %s",
"maintained": "مُصان",
@ -421,5 +421,37 @@
"experimental_warning": "تحذير: هذه الميزة تجريبية ولا تعتبر مستقرة ، يجب ألا تستخدمها إلا إذا كنت تعرف ما تفعله.",
"hook_conf_ynh_currenthost": "النطاق الرئيسي الحالي",
"logs_package": "سِجلّ إدارة حزم ديبيان",
"error_connection_interrupted": "أغلق الخادم الاتصال بدلاً من الاستجابة. هل تم إعادة تشغيل Nginx أو تم إيقاف تشغيل واجهة برمجة تطبيقات YunoHost؟ (رمز/رسالة الخطأ: %s)"
"error_connection_interrupted": "أغلق الخادم الاتصال بدلاً من الاستجابة. هل تم إعادة تشغيل Nginx أو تم إيقاف تشغيل واجهة برمجة تطبيقات YunoHost؟ (رمز/رسالة الخطأ: %s)",
"warnings": "%s تحذيرات",
"unignore": "إلغاء التجاهل",
"since": "منذ",
"restart": "إعادة التشغيل",
"rerun_diagnosis": "إعادة تشغيل الفحص مجددًا",
"logs_access": "قائمة تصريحات النفاذ المسموحة والمرفوضة",
"others": "أخرى",
"nobody": "لا أحد",
"last_ran": "آخر تشغيل:",
"issues": "%s مشاكل",
"ignored": "تم تجاهل %s",
"ignore": "تجاهل",
"permissions": "التصريحات",
"groups_and_permissions_manage": "إدارة الفِرَق والتصريحات",
"groups_and_permissions": "الفِرَق والتصريحات",
"groups": "الفِرَق",
"group_new": "فريق جديد",
"group_add_permission": "إضافة إذن",
"group_add_member": "إضافة مستخدم",
"group_all_users": "كل المستخدمين",
"group_name": "اسم الفريق",
"group": "الفريق",
"everything_good": "كل شيء على ما يرام!",
"run_first_diagnosis": "شغّل الفحص الأوّلي",
"details": "التفاصيل",
"confirm_service_restart": "أمتأكد مِن أنك تريد إعادة تشغيل %s؟",
"configuration": "الإعداد",
"catalog": "الفهرس",
"app_state_low_quality": "جودة ضعيفة",
"all": "كلها",
"group_explain_visitors": "هذا فريق خاص بالزوار المجهولين",
"group_visitors": "الزوار"
}

View file

@ -354,7 +354,7 @@
"validity": "Validesa",
"domain_is_eligible_for_ACME": "Aquest domini sembla estar configurat correctament per instal·lar el certificat Let's Encrypt!",
"run": "Executar",
"domain_not_eligible_for_ACME": "Aquest domini sembla que no està configurat per a un certificat Let's Encrypt. Comprova la configuració DNS i la accessibilitat del servidor HTTP.",
"domain_not_eligible_for_ACME": "Aquest domini sembla que no està configurat per a un certificat Let's Encrypt. Comprova la configuració DNS i la accessibilitat del servidor HTTP. Les seccions «registres DNS» i «Web» de <a href='#/diagnosis'>la pàgina de diagnòstic</a> pot ajudar-vos a entendre el que està mal configurat.",
"install_letsencrypt_cert": "Instal·la un certificat Let's Encrypt",
"manually_renew_letsencrypt_message": "El certificat es renovarà automàticament durant els últims 15 dies de validesa. El podeu renovar manualment si ho desitgeu. (No recomanat).",
"manually_renew_letsencrypt": "Renovar manualment ara",
@ -471,11 +471,14 @@
"app_state_low_quality": "baixa qualitat",
"all": "Tot",
"run_first_diagnosis": "Executa el diagnòstic inicial",
"diagnosis_first_run": "La funció de diagnòstic intentarà identificar problemes habituals de diferents aspectes del servidor per tal d'assegurar que tot funcioni de la millor manera possible. No tingueu por si veieu uns quants errors just després de configurar el servidor: està precisament fet per ajudar a identificar els problemes i oferir una guia de com arreglar-los. El diagnòstic també s'executarà dues vegades al dia i enviarà un correu a l'administrador si apareix algun error.",
"diagnosis_first_run": "La funció de diagnòstic intentarà identificar problemes habituals de diferents aspectes del servidor per tal d'assegurar que tot funcioni de la millor manera possible. No tingueu por si veieu uns quants errors just després de configurar el servidor: està precisament fet per ajudar a identificar els problemes i oferir una guia de com arreglar-los. El diagnòstic també s'executarà dues vegades al dia i s'enviarà un correu a l'administrador si es troben errors.",
"confirm_service_restart": "Esteu segur de voler reiniciar %s?",
"group_explain_visitors_needed_for_external_client": "Vigileu ja que s'ha de permetre els visitants en algunes aplicacions si voleu utilitzar-les amb clients externs. És el cas, per exemple, de Nextcloud si voleu utilitzar el client de sincronització en el telèfon mòbil o en l'ordinador.",
"groups": "Grups",
"restart": "Reiniciar",
"unmaintained_details": "Fa temps que no es manté aquesta aplicació i la persona que la mantenia ja no ho fa o no té temps per fer-ho. Us convidem a mirar el repositori de l'aplicació per oferir la vostra ajuda",
"issues": "%s problemes"
"issues": "%s problemes",
"operation_failed_explanation": "Aquesta operació ha fallat! Ens sap molt greu :( Podeu intentar <a href='https://yunohost.org/help'>demanar ajuda</a>. Si us plau doneu *el registre complet* de l'operació a la gent que intenta ajudar-vos. Podeu fer-ho fent clic al botó verd \"Compartir amb Yunopaste\". Quan compartiu els registres, YunoHost intentarà anonimitzar automàticament dades privades com els noms de domini i les IPs.",
"diagnosis_explanation": "La funció de diagnòstic intentarà identificar els errors més comuns en diferents aspectes del servidor per verificar que tot funciona correctament. El diagnòstic s'executa automàticament dues vegades al dia i s'envia un correu electrònic a l'administrador si es troben errors. Tingueu en compte que no tots els tests seran rellevants si no s'utilitzen algunes funcions específiques (com per exemple XMPP) o pot ser que falli si teniu un sistema amb una configuració complexa. En aquests casos, i si sabeu el que feu, podeu ignorar els problemes o avisos corresponents.",
"pending_migrations": "Hi ha algunes migracions pendents esperant per ser executades. Aneu a <a href='#/tools/migrations'>Eines > Migracions</a> per fer-les."
}

View file

@ -218,7 +218,7 @@
"swap": "Auslagerungsspeicher",
"system": "System",
"system_apps": "Apps",
"system_apps_nothing": "Allen Apps sind auf dem neuesten Stand!",
"system_apps_nothing": "Alle Applikationen sind auf dem neuesten Stand!",
"system_delayed_upgrade": "Zurückgestellte Aktualisierung",
"system_delayed_upgrade_warning": "<b>%s</b> wird automatisch innerhalb der nächsten Stunde aktualisiert.",
"system_packages": "Systempakete",
@ -317,7 +317,7 @@
"certificate_authority": "Zertifizierungsstelle",
"validity": "Gültigkeit",
"domain_is_eligible_for_ACME": "Die Domain scheint korrekt konfiguriert zu sein, um ein Let's Encrypt Zertifikat installieren zu können !",
"domain_not_eligible_for_ACME": "Die Domain scheint nicht korrekt konfiguriert zu sein, um ein Let's Encrypt Zertifikat installieren zu können ! Bitte überprüfe deine DNS-Konfiguration und die Erreichbarkeit deines HTTP-Servers.",
"domain_not_eligible_for_ACME": "Die Domain scheint nicht korrekt konfiguriert zu sein, um ein Let's Encrypt Zertifikat installieren zu können! Bitte überprüfen Sie Ihre DNS-Konfiguration und die Erreichbarkeit Ihres HTTP-Servers. Der 'DNS records' und 'Web' Bereich in <a href='#/diagnosis'>der Diagnose Seite</a> kann Ihnen helfen zu verstehen, was falsch konfiguriert ist.",
"install_letsencrypt_cert": "Let's Encrypt Zertifikat installieren",
"manually_renew_letsencrypt_message": "Das Zertifikat wird, innerhalb der letzten 15 Tage bevor es ungültig wird, automatisch erneuert. Du kannst es aber auch manuell erneuern. (Nicht empfohlen).",
"manually_renew_letsencrypt": "Jetzt manuell erneuern",
@ -475,10 +475,13 @@
"all": "Alle",
"confirm_service_restart": "Bist du sicher, dass du %s neustarten möchtest?",
"run_first_diagnosis": "Initiale Diagnose läuft",
"diagnosis_first_run": "Die Diagnose Funktion wird versuchen, gängige Probleme in verschiedenen Teilen deines Servers zu finden, damit alles reibungslos läuft. Bitte werde nicht panisch, wenn du ein paar Fehlermeldungen siehst nachdem du deinen Server aufgesetzt hast: es soll versuchen dir zu helfen, Probleme zu identifizieren und Tipps für Lösungen zu zeigen. Die Diagnose wird auch automatisch zweimal täglich ausgeführt, falls Fehler gefunden werden, bekommt der Administrator ein E-Mail.",
"diagnosis_first_run": "Die Diagnosefunktion wird versuchen, gängige Probleme in verschiedenen Teilen Ihres Servers zu finden. Bitte werden Sie nicht panisch, wenn Sie ein paar Fehlermeldungen sehen, nachdem Sie Ihren Server aufgesetzt haben: Es soll Ihnen hauptsächlich helfen, Probleme zu identifizieren und Tipps für Lösungen zu zeigen. Die Diagnose wird auch automatisch zweimal täglich ausgeführt. Falls Fehler gefunden werden, bekommt der Administrator eine E-Mail.",
"unmaintained_details": "Diese Anwendung wurde seit einiger Zeit nicht gewartet und der frühere Wart hat die Anwendung aufgegeben oder hat keine Zeit mehr für die Wartung. Du bist herzlich eingeladen dir die Quellen und Unterlagen anzusehen und Hilfe zu leisten",
"group_explain_visitors_needed_for_external_client": "Sei vorsichtig und beachte, dass du manche Anwendungen für externe Besucher freigeben musst, falls du beabsichtigst, diese mit externen Clients aufzurufen. Zum Beispiel trifft das auf Nextcloud zu, wenn du eine Synchronisation auf dem Smartphone oder Desktop PC haben möchtest.",
"groups": "Gruppen",
"issues": "%s Probleme",
"restart": "Neustart"
"restart": "Neustart",
"operation_failed_explanation": "Die Operation ist fehlgeschlagen! Das tut uns leid :( Sie können Sich <a href='https://yunohost.org/help'>hier Hilfe holen</a>. Bitte stellen Sie *die ganzen Logs* der Operation bereit, damit Ihnen besser geholfen werden kann. Dies tun Sie, indem Sie auf den grünen 'mit Yunopaste teilen' Knopf drücken. Wenn Sie die Logs teilen, wird Yunohost automatisch versuchen Ihre privaten Daten wie Domainnamen und IP's zu anonymisieren.",
"diagnosis_explanation": "Die Diagnose Funktion wird versuchen, gängige Probleme in verschiedenen Teilen deines Servers zu finden, damit alles reibungslos läuft. Die Diagnose wird auch automatisch zweimal täglich ausgeführt, falls Fehler gefunden werden, bekommt der Administrator ein E-Mail. Beachte, dass einige tests nicht relevant sind, wenn du einzelne Features (zum Beispiel XMPP) nicht benutzt oder du ein komplexes Setup hast. In diesem Fall und wenn du weisst was du tust ist es in Ordnung die dazugehoerigen Warnungen und Hinweise zu ignorieren.",
"pending_migrations": "Es gibt einige ausstehende Migrationen, die darauf warten, ausgeführt zu werden. Bitte gehen Sie auf <a href='#/tools/migrations'>Werkzeuge > Migrationen</a> um diese auszuführen."
}

View file

@ -83,7 +83,8 @@
"domain_dns_conf_is_just_a_recommendation": "This page shows you the *recommended* configuration. It does *not* configure the DNS for you. It is your responsability to configure your DNS zone in your DNS registrar according to this recommendation.",
"diagnosis": "Diagnosis",
"diagnosis_experimental_disclaimer": "Be aware that the diagnosis feature is still experimental and being polished, and it may not be fully reliable.",
"diagnosis_first_run": "The diagnosis feature will attempt to identify common issues on the different aspects of your server to make sure everything runs smoothly. Please do not panic if you see a bunch of errors right after setting up your server: it is precisely meant to help you to identify issues and guide you to fix them. The diagnosis will also run automatically twice a day and email the administrator if some issue arise.",
"diagnosis_first_run": "The diagnosis feature will attempt to identify common issues on the different aspects of your server to make sure everything runs smoothly. Please do not panic if you see a bunch of errors right after setting up your server: it is precisely meant to help you to identify issues and guide you to fix them. The diagnosis will also run automatically twice a day and an email is sent to the administrator if issues are found.",
"diagnosis_explanation": "The diagnosis feature will attempt to identify common issues on the different aspects of your server to make sure everything runs smoothly. The diagnosis runs automatically twice a day and an email is sent to the administrator if issues are found. Note that some tests may not be relevant if you do not want to use some specific features (for example XMPP) or may fail if you have a complex setup. In such cases, and if you know what you are doing, it is alright to ignore the corresponding issues or warnings.",
"run_first_diagnosis": "Run initial diagnosis",
"disable": "Disable",
"disabled": "Disabled",
@ -109,7 +110,7 @@
"error_retrieve_feed": "Could not retrieve feed: %s. You might have a plugin prevent your browser from performing this request (or the website is down).",
"error_select_domain": "You should indicate a domain",
"error_server_unexpected": "Unexpected server error (%s)",
"error_connection_interrupted": "The server closed the connection instead of answering it. Has nginx or the yunohost-api been restarted or stoppted for some reason? (Error code/message: %s)",
"error_connection_interrupted": "The server closed the connection instead of answering it. Has nginx or the yunohost-api been restarted or stopped for some reason? (Error code/message: %s)",
"everything_good": "Everything good!",
"experimental_warning": "Warning: this feature is experimental and not consider stable, you shouldn't be using it except if you know what you are doing.",
"firewall": "Firewall",
@ -203,6 +204,7 @@
"orphaned": "Not maintained",
"orphaned_details": "This app has not been maintained for quite some time. It may still be working, but won't receive any upgrade until somebody volunteers to take care of it. Feel free to contribute to revive it!",
"others": "Others",
"operation_failed_explanation": "This operation failed! Really sorry about that :( You can try to <a href='https://yunohost.org/help'>ask for help</a>. Please provide *the full log* of the operation to the people helping you. You can do so by clicking on the 'Share with Yunopaste' green button. When sharing the logs, YunoHost will automatically attempt to anonymize private data like domain names and IPs.",
"password": "Password",
"password_confirmation": "Password confirmation",
"password_empty": "The password field is empty",
@ -211,6 +213,7 @@
"passwords_too_short": "Password is too short",
"path": "Path",
"logs": "Logs",
"log_suboperations": "Sub-operations",
"logs_operation": "Operations made on system with YunoHost",
"logs_history": "History of command run on system",
"logs_package": "Debian packages management history",
@ -219,7 +222,6 @@
"logs_service": "Services logs",
"logs_app": "Apps logs",
"logs_no_logs_registered": "No log registered for this category",
"logs_end_with_error": "This log finished with the error:",
"logs_error": "Error",
"logs_ended_at": "End",
"logs_started_at": "Start",
@ -228,6 +230,7 @@
"logs_share_with_yunopaste": "Share with YunoPaste",
"logs_more": "Display more lines",
"path_url": "Path",
"pending_migrations": "There are some pending migrations waiting to be ran. Please go to the <a href='#/tools/migrations'>Tools > Migrations</a> view to run them.",
"port": "Port",
"ports": "Ports",
"postinstall": "Post-installation",
@ -269,6 +272,7 @@
"system_upgrade_all_applications_btn": "Upgrade all applications",
"system_upgrade_all_packages_btn": "Upgrade all packages",
"tcp": "TCP",
"tip_about_user_email": "Users are created with an associated email address (and XMPP account) with the format username@domain.tld. Additional email aliases and email forwards can later be added by the admin and the user.",
"tools": "Tools",
"tools_adminpw": "Change administration password",
"tools_adminpw_confirm_placeholder": "Confirm the new password",
@ -341,7 +345,7 @@
"certificate_authority": "Certification authority",
"validity": "Validity",
"domain_is_eligible_for_ACME": "This domain seems correctly configured to install a Let's Encrypt certificate!",
"domain_not_eligible_for_ACME": "This domain doesn't seem ready for a Let's Encrypt certificate. Please check your DNS configuration and HTTP server reachability.",
"domain_not_eligible_for_ACME": "This domain doesn't seem ready for a Let's Encrypt certificate. Please check your DNS configuration and HTTP server reachability. The 'DNS records' and 'Web' section in <a href='#/diagnosis'>the diagnosis page</a> can help you understand what is misconfigured.",
"install_letsencrypt_cert": "Install a Let's Encrypt certificate",
"manually_renew_letsencrypt_message": "Certificate will be automatically renewed during the last 15 days of validity. You can manually renew it if you want to. (Not recommended).",
"manually_renew_letsencrypt": "Manually renew now",

View file

@ -457,5 +457,13 @@
"app_state_low_quality": "malkvalita",
"app_state_low_quality_explanation": "Ĉi tiu app eble funkcias, sed ankoraŭ enhavas problemojn, aŭ ne plene integras kun YunoHost, aŭ ĝi ne respektas la bonajn praktikojn.",
"catalog": "Katalogo",
"others": "Aliaj"
"others": "Aliaj",
"confirm_service_restart": "Ĉu vi certas, ke vi volas rekomenci %s ?",
"diagnosis_first_run": "La diagnoza funkcio provos identigi oftajn problemojn pri la diversaj aspektoj de via servilo por certigi, ke ĉio funkcias glate. Bonvolu ne panikiĝi, se vi vidas amason da eraroj tuj post agordo de via servilo: ĝi ĝuste celas helpi vin identigi problemojn kaj gvidi vin ripari ilin. La diagnozo ankaŭ funkcios aŭtomate dufoje ĉiutage kaj retpoŝtu al la administranto se iuj problemoj ekestos.",
"group_explain_visitors_needed_for_external_client": "Atentu, ke vi bezonas konservi iujn aplikaĵojn permesitajn al vizitantoj se vi intencas uzi ilin kun eksteraj klientoj. Ekzemple, ĉi tiu estas la kazo de Nextcloud se vi volas intenci uzi sinkronigan klienton en via inteligenta telefono aŭ labortabla komputilo.",
"restart": "Rekomenci",
"unmaintained_details": "Ĉi tiu app ne estis ĝisdatigita antaŭ tre tempo kaj la antaŭa prizorganto foriĝis aŭ ne havas tempon por subteni ĉi tiun app. Bonvolu kontroli la app-deponejon por doni vian helpon",
"run_first_diagnosis": "Kuru komencan diagnozon",
"groups": "Grupoj",
"issues": "%s aferoj"
}

View file

@ -24,7 +24,7 @@
"app_make_default": "Establecer como predeterminado",
"app_repository": "Origen de la aplicación: ",
"app_state": "Estado de la aplicación: ",
"app_state_inprogress": "en desarollo",
"app_state_inprogress": "Todavía no trabajando",
"app_state_notworking": "no funciona",
"app_state_validated": "Validado",
"app_state_working": "funciona",
@ -222,7 +222,7 @@
"save": "Guardar",
"select_user": "Seleccionar usuario",
"service_log": "%s log",
"service_start_on_boot": "Inicio en el arranque",
"service_start_on_boot": "Inicie en el arranque",
"service_status": "Estado: ",
"services": "Servicios",
"services_list": "Lista de servicios",
@ -238,11 +238,11 @@
"swap": "Swap",
"system": "Sistema",
"system_apps": "Aplicaciones",
"system_apps_nothing": "Todas las aplicaciones están actualizadas !",
"system_apps_nothing": "¡Todas las aplicaciones están actualizadas!",
"system_delayed_upgrade": "Retraso en actualización",
"system_delayed_upgrade_warning": "<b>%s</b> será actualizada automáticamente en la próxima hora.",
"system_packages": "Paquetes",
"system_packages_nothing": "No hay paquetes para actualizar.",
"system_packages_nothing": "¡Todos los paquetes del sistema están actualizados!",
"system_update": "Actualización del sistema",
"system_upgrade": "Actualización del sistema",
"system_upgrade_btn": "Actualización",
@ -376,14 +376,14 @@
"from_to": "desde %s a %s",
"only_highquality_apps": "Solo aplicaciones de alta calidad",
"only_decent_quality_apps": "Solo aplicaciones de calidad aceptable",
"orphaned": "Sin mantenimiento",
"orphaned": "No mantenido",
"request_adoption": "pendiente de adopción",
"request_adoption_details": "Al mantenedor actual le gustaría dejar de mantener esta aplicación. ¡No dude en ofrecerse como el nuevo mantenedor!",
"request_help": "necesita ayuda",
"app_state_inprogress_explanation": "El mantenedor de esta aplicación declara que aún no está lista para su uso en producción. ¡TENGA CUIDADO!",
"app_state_high-quality_explanation": "Esta aplicación está bien integrada en YunoHost. Ha sido (¡y continua siendo!) revisada por especialistas del equipo de aplicaciones de YunoHost. Se puede esperar que sea segura y mantenida a largo plazo.",
"app_state_working_explanation": "El mantenedor de esta aplicación declara que «funciona». Significa que debería ser funcional (comparada a nivel de aplicación) pero no está revisada por especialistas necesariamente, puede tener aún problemas o no está totalmente integrada en YunoHost.",
"orphaned_details": "Esta aplicación ya no se mantiene. Puede que funcione pero no se actualizará mientras ningún voluntarie la cuide . ¡No dude en venir y reanimarla!",
"orphaned_details": "Esta aplicación no se ha mantenido durante bastante tiempo. Todavía puede estar funcionando, pero no recibirá ninguna actualización hasta que alguien se ofrezca como voluntario para encargarse de ello. ¡Siéntase libre de contribuir para revivirlo!",
"request_help_details": "Al mantenedor actual le gustaría recibir alguna ayuda con el mantenimiento de esta aplicación. ¡No dude en venir a contribuir!",
"tools_rebooting": "Su servidor se está reiniciando. Para volver a la interfaz de administración web necesita esperar a que el servidor esté listo. Puede comprobarlo recargando esta página (F5).",
"tools_shutdown_btn": "Apagar",
@ -474,5 +474,11 @@
"configuration": "Configuración",
"catalog": "Catálogo",
"app_state_low_quality_explanation": "Asta app esta probablemente funcional, pero puede fallar, no esta completamente integrada con YunoHost, o no respeta las buenas practicas.",
"app_state_low_quality": "baja qualidad"
"app_state_low_quality": "baja qualidad",
"confirm_service_restart": "¿Estás seguro de que quieres reiniciar %s ?",
"group_explain_visitors_needed_for_external_client": "Tenga cuidado de que necesita mantener algunas aplicaciones permitidas a los visitantes si tiene la intención de usarlas con clientes externos. Por ejemplo, este es el caso de Nextcloud si desea utilizar un cliente de sincronización en su teléfono inteligente o computadora de escritorio.",
"issues": "%s problemas",
"unmaintained_details": "Esta aplicación no se ha actualizado durante bastante tiempo y el responsable anterior se ha ido o no tiene tiempo para mantenerla. No dude en consultar el repositorio de aplicaciones para brindar su ayuda",
"groups": "Grupos",
"restart": "Reiniciar"
}

View file

@ -27,7 +27,7 @@
"app_state_inprogress": "ne fonctionne pas encore",
"app_state_notworking": "Non fonctionnelle",
"app_state_validated": "Validée",
"app_state_working": "Fonctionnelle",
"app_state_working": "fonctionnelle",
"application": "Application",
"applications": "Applications",
"archive_empty": "Larchive est vide",
@ -65,7 +65,7 @@
"confirm_change_maindomain": "Voulez-vous vraiment changer le domaine principal ?",
"confirm_delete": "Voulez-vous vraiment supprimer %s ?",
"confirm_firewall": "Voulez-vous vraiment %s le port %s (protocole: %s, connexion: %s)",
"confirm_install_custom_app": "AVERTISSEMENT ! Linstallation dapplications tierces peut compromettre lintégrité et la sécurité de votre système. Vous ne devriez probablement PAS linstaller si vous ne savez pas ce que vous faites. Prenez-vous ce risque ?",
"confirm_install_custom_app": "ATTENTION ! Linstallation dapplications tierces peut compromettre lintégrité et la sécurité de votre système. Vous ne devriez probablement PAS linstaller si vous ne savez pas ce que vous faites. Prenez-vous ce risque ?",
"confirm_install_domain_root": "Vous ne pourrez pas installer d'autres applications sur %s. Continuer ?",
"confirm_postinstall": "Vous êtes sur le point de lancer le processus de post-installation sur le domaine %s. Cela peut prendre du temps, *n'interrompez pas l'opération avant la fin*.",
"confirm_restore": "Voulez-vous vraiment restaurer %s ?",
@ -139,7 +139,7 @@
"hook_data_home": "Données de lutilisateur",
"hook_data_home_desc": "Les données de lutilisateur situées dans /home/USER",
"hook_data_mail": "Courriel",
"hook_data_mail_desc": "Les courriels qui sont stockés sur le serveur",
"hook_data_mail_desc": "Courriels (au format brut) stockés sur le serveur",
"hostname": "Nom d'hôte",
"id": "ID",
"inactive": "Inactif",
@ -318,7 +318,7 @@
"certificate_authority": "Autorité de certification",
"validity": "Validité",
"domain_is_eligible_for_ACME": "Ce domaine semble correctement configuré pour installer un certificat Lets Encrypt !",
"domain_not_eligible_for_ACME": "Ce domaine ne semble pas prêt pour installer un certificat Lets Encrypt. Veuillez vérifier votre configuration DNS et laccessibilité HTTP de votre serveur.",
"domain_not_eligible_for_ACME": "Ce domaine ne semble pas prêt pour installer un certificat Lets Encrypt. Veuillez vérifier votre configuration DNS et laccessibilité HTTP de votre serveur. Les sections 'enregistrement DNS' et 'Web' dans <a href='#/diagnosis'>la page de diagnostic</a> peuvent vous aider à comprendre ce qui est mal configuré.",
"install_letsencrypt_cert": "Installer un certificat Lets Encrypt",
"manually_renew_letsencrypt_message": "Le certificat sera renouvelé automatiquement durant les 15 derniers jours de sa validité. Vous pouvez le renouveler manuellement si vous le souhaitez (non recommandé).",
"manually_renew_letsencrypt": "Renouveler manuellement maintenant",
@ -396,7 +396,7 @@
"confirm_install_app_warning": "Avertissement : cette application peut fonctionner mais nest pas bien intégrée dans YunoHost. Certaines fonctionnalités telles que lauthentification unique et la sauvegarde/restauration pourraient ne pas être disponibles.",
"confirm_install_app_danger": "AVERTISSEMENT ! Cette application est encore expérimentale et risque de casser votre système ! Vous ne devriez probablement PAS linstaller si vous ne savez pas ce que vous faites. Voulez-vous vraiment prendre ce risque ?",
"current_maintainer_title": "Mainteneur actuel de ce paquet",
"error_connection_interrupted": "Le serveur a fermé la connexion au lieu dy répondre. Est-ce que Nginx a été redémarré ou est-ce que l'API YunoHost s'est-elle arrêtée pour diverses raisons ? (code/message derreur : %s)",
"error_connection_interrupted": "Le serveur a fermé la connexion au lieu dy répondre. Est-ce que NGINX ou l'API YunoHost aurait été redémarré ou arrêté ? (code/message derreur : %s)",
"experimental_warning": "Attention : cette fonctionnalité est expérimentale et ne doit pas être considérée comme stable, vous ne devriez pas lutiliser à moins que vous ne sachiez ce que vous faites...",
"good_practices_about_admin_password": "Vous êtes maintenant sur le point de définir un nouveau mot de passe administrateur. Le mot de passe doit comporter au moins 8 caractères — bien quil soit recommandé dutiliser un mot de passe plus long (cest-à-dire une phrase secrète) et/ou dutiliser différents types de caractères (majuscules, minuscules, chiffres et caractères spéciaux).",
"good_practices_about_user_password": "Vous êtes maintenant sur le point de définir un nouveau mot de passe pour l'utilisateur. Le mot de passe doit comporter au moins 8 caractères - bien quil soit recommandé dutiliser un mot de passe plus long (cest-à-dire une phrase secrète) et/ou dutiliser différents types de caractères tels que : majuscules, minuscules, chiffres et caractères spéciaux.",
@ -422,27 +422,27 @@
"logs_more": "Afficher plus de lignes",
"search_for_apps": "Recherche des applications…",
"unmaintained": "Non maintenue",
"purge_user_data_checkbox": "Purger les données de l'utilisateur %s ? (Cela supprimera le contenu de ses répertoires home et mail.)",
"purge_user_data_checkbox": "Purger les données de l'utilisateur %s ? (Cela supprimera le contenu de ses dossiers et répertoires dans home et courriel.)",
"purge_user_data_warning": "La purge des données de lutilisateur nest pas réversible. Assurez-vous de savoir ce que vous faites !",
"version": "Version",
"confirm_update_system": "Voulez-vous vraiment mettre à jour tous les paquets système ?",
"app_state_inprogress_explanation": "Le mainteneur de cette application a indiqué qu'elle n'est pas encore prête pour une utilisation en production. FAITES ATTENTION !",
"app_state_notworking_explanation": "Le mainteneur de cette application a déclaré celle-ci comme \"non fonctionnelle\" SON INSTALLATION PEUT CASSER VOTRE SYSTÈME !",
"app_state_high-quality": "Haute qualité",
"app_state_high-quality_explanation": "Cette application est bien intégrée dans YunoHost. Elle a été (et est !) revue par l'équipe applicative de YunoHost. On peut s'attendre à ce qu'elle soit sûre et maintenue sur le long terme.",
"app_state_working_explanation": "Le responsable de cette application l'a déclarée comme fonctionnelle. Cela signifie qu'elle doit être utilisable (c.f. niveau de l'application) mais n'est pas nécessairement revue, elle peut encore contenir des bogues ou bien n'est pas entièrement intégrée dans YunoHost.",
"app_state_inprogress_explanation": "Le mainteneur de cette application précise que cette application n'est pas encore prête à être utilisée en production. SOYEZ PRUDENTS !",
"app_state_notworking_explanation": "Le responsable de cette application a déclaré celle-ci comme \"non fonctionnelle\". SON INSTALLATION POURRAIT CASSER VOTRE SYSTÈME !",
"app_state_high-quality": "bonne qualité",
"app_state_high-quality_explanation": "Cette application est bien intégrée à YunoHost. Elle a été (et est !) revue par l'équipe applicative de YunoHost. On peut s'attendre à ce qu'elle soit sûre et maintenue sur le long terme.",
"app_state_working_explanation": "Le responsable de cette application l'a déclarée comme 'fonctionnelle'. Cela signifie qu'elle doit fonctionner (voir son niveau d'intégration) mais n'est pas nécessairement revue, elle peut encore contenir des bugs ou bien n'est pas entièrement intégrée à YunoHost.",
"hook_conf_ynh_currenthost": "Domaine principal actuel",
"license": "Licence",
"maintained": "Maintenue",
"maintained_details": "Cette application a été maintenue par son responsable au cours des tout derniers mois.",
"only_highquality_apps": "Uniquement des applications de haute qualité",
"maintained_details": "Cette application a été maintenue par son responsable au cours des derniers mois.",
"only_highquality_apps": "Seulement les applications de bonne qualité",
"only_decent_quality_apps": "Seulement des applications d'une qualité décente",
"orphaned": "Non maintenue",
"orphaned_details": "Cette application n'a pas été maintenue depuis un certain temps. Il peut encore fonctionner, mais ne recevra aucune mise à niveau jusqu'à ce que quelqu'un se porte volontaire pour s'en occuper. N'hésitez pas à contribuer à la faire revivre !",
"request_adoption": "en attente de repreneur",
"request_adoption_details": "Le responsable actuel aimerait arrêter de s'occuper et de maintenir cette application. N'hésitez pas à vous proposer comme nouveau responsable !",
"request_adoption": "en attente d'adoption",
"request_adoption_details": "Le responsable actuel ne souhaite plus s'occuper de cette application. N'hésitez pas à vous proposer comme nouveau responsable !",
"request_help": "besoin d'assistance",
"request_help_details": "Le responsable actuel aimerait de l'aide pour la maintenance de cette application. N'hésitez pas à y contribuer !",
"request_help_details": "Le mainteneur actuel souhaiterait de l'aide pour la maintenance de cette application. N'hésitez pas à contribuer !",
"advanced": "Avancée",
"from_to": "de %s à %s",
"group_name": "Nom du groupe",
@ -473,14 +473,19 @@
"configuration": "Configuration",
"since": "depuis",
"all": "Tout",
"app_state_low_quality": "basse qualité",
"app_state_low_quality": "faible qualité",
"app_state_low_quality_explanation": "Cette application peut être fonctionnelle, mais peut toujours contenir des problèmes, ou n'est pas entièrement intégrée à YunoHost, ou elle ne respecte pas les bonnes pratiques.",
"catalog": "Catalogue",
"others": "Autres",
"diagnosis_first_run": "La fonctionnalité de diagnostic va tenter de trouver certains problèmes communs sur différents aspects de votre serveur pour être sûr que tout fonctionne normalement. Merci de ne pas paniquer si vous voyez une multitude d'erreurs après avoir configuré votre serveur : la fonctionnalité est précisément prévue pour les identifier et vous aider à les résoudre. Le diagnostic sera également effectué deux fois par jour et enverra un mail à l'administrateur si des erreurs sont détectées.",
"diagnosis_first_run": "La fonctionnalité de diagnostic va tenter de trouver certains problèmes communs sur différents aspects de votre serveur pour être sûr que tout fonctionne normalement. Merci de ne pas paniquer si vous voyez une multitude d'erreurs après avoir configuré votre serveur : la fonctionnalité est précisément prévue pour les identifier et vous aider à les résoudre. Le diagnostic sera également effectué deux fois par jour et enverra un courriel à l'administrateur si des erreurs sont détectées.",
"run_first_diagnosis": "Démarrer le diagnostic initial",
"confirm_service_restart": "Êtes-vous certain de vouloir redémarrer %s ?",
"groups": "Groupes",
"restart": "Redémarrer",
"unmaintained_details": "Cette application n'a pas été mise à jour depuis longtemps et le responsable précédent est parti ou n'a pas le temps de maintenir cette application. N'hésitez pas à consulter le repertoire des applications pour apporter votre aide"
"unmaintained_details": "Cette application n'a pas été mise à jour depuis un bon moment et le responsable précédent est parti ou n'a pas le temps de maintenir cette application. N'hésitez pas à consulter le référentiel des applications pour apporter votre aide",
"group_explain_visitors_needed_for_external_client": "Veillez à ce que certaines applications soient autorisées pour les visiteurs si vous avez l'intention de les utiliser avec des clients externes. Par exemple, c'est le cas pour Nextcloud si vous souhaitez avoir l'intention d'utiliser un client de synchronisation sur votre smartphone ou ordinateur de bureau.",
"issues": "%s problèmes",
"operation_failed_explanation": "L'opération a échoué ! Veuillez-nous excuser pour ça :( Vous pouvez essayer de <a href='https://yunohost.org/help'>demander de l'aide</a>. Merci de fournir *le log complet* de l'opération pour les personnes qui vont vous aider. Vous pouvez cliquer sur le bouton vert 'Partager avec Yunopaste'. Quand vous partagez les logs, YunoHost essaie automatiquement d'anonymiser les informations privées comme le nom de domaine et l'adresses IP.",
"diagnosis_explanation": "La fonctionnalité de diagnostic va tenter de trouver certains problèmes communs sur différents aspects de votre serveur pour être sûr que tout fonctionne normalement. Le diagnostic sera également effectué deux fois par jour et enverra un courriel à l'administrateur si des erreurs sont détectées. À noter que certains tests ne seront pas montrés si vous n'utilisez pas certaines fonctions spécifiques (XMPP, par exemple) ou s'ils échouent à cause d'une configuration trop complexe. Dans ce cas, et si vous savez ce que vous avez modifié, vous pouvez ignorer les problèmes et les avertissements correspondantes.",
"pending_migrations": "Il y a des migrations en suspens qui attentent d'être exécutées. Veuillez aller dans <a href='#/tools/migrations'>Outils > Migrations</a> pour les exécuter."
}

View file

@ -14,7 +14,7 @@
"app_access_title": "accesso %s",
"app_debug_no_logs": "Registri dell'applicazione non disponibili",
"app_debug_tab": "Visualizzare informazioni di debug",
"app_info_access_desc": "Gestisci accesso utente. Utenti consentiti: %s",
"app_info_access_desc": "Gruppi / utenti attualmente autorizzati ad accedere a questa applicazione:",
"app_info_debug_desc": "Visualizzare informazioni di debug per quest'applicazione.",
"app_info_default_desc": "Redirigi root dominio su questa applicazione (%s).",
"app_info_uninstall_desc": "Rimuovi questa applicazione.",
@ -180,7 +180,7 @@
"save": "Salva",
"select_user": "Scegli utente",
"service_log": "%s log",
"service_start_on_boot": "In esecuzione all'avvio: ",
"service_start_on_boot": "In esecuzione all'avvio",
"service_status": "Stato: ",
"services": "Servizi",
"services_list": "Lista dei servizi",
@ -193,11 +193,11 @@
"swap": "Swap",
"system": "Sistema",
"system_apps": "App",
"system_apps_nothing": "Non ci sono applicazioni da aggiornare.",
"system_apps_nothing": "Tutte le applicazioni sono aggiornate!",
"system_delayed_upgrade": "Aggiornamento rimandato",
"system_delayed_upgrade_warning": "<b>%s</b> sarà aggiornato automaticamente entro un'ora.",
"system_packages": "Pacchetti",
"system_packages_nothing": "Non ci sono pacchetti da aggiornare.",
"system_packages_nothing": "Tutti i pacchetti di sistema sono aggiornati!",
"system_upgrade": "Aggiornamento del sistema",
"system_upgrade_btn": "Aggiorna",
"tcp": "TCP",
@ -247,12 +247,12 @@
"wrong_password": "Password sbagliata",
"yes": "Si",
"app_state": "Stato dell'applicazione: ",
"app_state_inprogress": "In corso",
"app_state_inprogress": "ancora non funzionante",
"confirm_install_custom_app": "ATTENZIONE! L'installazione di applicazioni di terze parti può compromettere l'integrità e la sicurezza del tuo sistema. Probabilmente NON dovresti installarle a meno che tu non sappia cosa stai facendo. Sei sicuro di volerti prendere questo rischio?",
"backup_archive_copy": "Copia questo archivio in un altro supporto di memoria",
"confirm_install_domain_root": "Non sarai in grado di installare qualsiasi altra applicazione su %s. Continuare ?",
"app_state_notworking": "Non funzionante",
"app_state_working": "Funzionante",
"app_state_notworking": "non funzionante",
"app_state_working": "funzionante",
"backup_experimental_warning": "Nota: la funzione backup è ancora sperimentale e potrebbe non essere completamente affidabile.",
"backup_optional_encryption": "Cifratura opzionale",
"begin": "Iniziamo",
@ -372,7 +372,7 @@
"confirm_cert_manual_renew_LE": "Sei sicuro di voler rinnovare manualmente il certificato Let's Encrypt per questo dominio ora ?",
"confirm_cert_revert_to_selfsigned": "Sei sicuro di voler ritornare ad un certificato autofirmato per questo dominio ?",
"domain_is_eligible_for_ACME": "Questo dominio sembra correttamente configurato per l'installazione di un certificato Let's Encrypt !",
"domain_not_eligible_for_ACME": "Questo dominio non sembra pronto per un certificato Let's Encrypt. Per favore controlla la tua configurazione DNS e la raggiungibilità del tuo server HTTP.",
"domain_not_eligible_for_ACME": "Questo dominio non sembra pronto per un certificato Let's Encrypt. Per favore controlla la tua configurazione DNS e la raggiungibilità del tuo server HTTP. Le sezioni 'DNS records' e 'Web' nella <a href='#/diagnosis'>pagina di diagnosi</a> può aiutarti nel capire cosa non è ben configurato.",
"manually_renew_letsencrypt_message": "Il certificato sarà rinnovato automaticamente durante gli ultimi 15 giorni di validità. Puoi rinnovarlo manualmente se lo desideri (Non consigliato).",
"meltdown": "Sei esposto alla vulnerabilità critica di sicurezza <a target=\"_blank\" href=\"https://meltdownattack.com/\">meltdown</a>. Per risolverlo, hai bisogno di <a href=\"#/update\">aggiornare il tuo sistema</a> e successivamente <a href=\"#/tools/reboot\">riavviarlo</a> per caricare il nuovo kernel linux.",
"regenerate_selfsigned_cert_message": "Se lo desideri, puoi rigenerare il certificato autofirmato.",
@ -393,7 +393,7 @@
"confirm_install_app_warning": "Attenzione: questa applicazione può funzionare ma non è ben integrata in Yunohost. Alcune funzionalità come il single sign-on (accesso unico) e backup/ripristino potrebbero non essere disponibili.",
"confirm_install_app_danger": "ATTENZIONE! Questa applicazione è ancora sperimentale (se non esplicitamente non funzionante) ed è probabile che rovini il tuo sistema! Probabilmente NON dovresti installarla a meno che tu non sappia cosa stai facendo. Sei sicuro di voler prenderti questo rischio?",
"current_maintainer_title": "Mantenitore attuale di questo pacchetto",
"error_connection_interrupted": "Il server ha chiuso la connessione invece che rispondere, magari nginx è stato riavviato per errore? (Codice di errore/messaggio: %s)",
"error_connection_interrupted": "Il server ha chiuso la connessione invece che rispondere. Probabilmente nginx o le API di YunoHost sono stato riavviati per qualche ragione? (Codice di errore/messaggio: %s)",
"experimental_warning": "Attenzione: questa funzionalità è sperimentale e non è considerata stabile, non dovresti utilizzarla a meno che tu non sappia cosa stai facendo.",
"good_practices_about_admin_password": "Ora stai per impostare una nuova password di amministratore. La password dovrebbe essere di almeno 8 caratteri - anche se è buona pratica utilizzare password più lunghe (es. una sequenza di parole) e/o utilizzare vari tipi di caratteri (maiuscole, minuscole, numeri e simboli).",
"good_practices_about_user_password": "Ora stai per impostare una nuova password utente. La password dovrebbe essere di almeno 8 caratteri - anche se è buona pratica utilizzare password più lunghe (es. una sequenza di parole) e/o utilizzare vari tipi di caratteri (maiuscole, minuscole, numeri e simboli).",
@ -437,7 +437,7 @@
"group_visitors": "Visitori",
"group_format_name_help": "È possibile utilizzare caratteri alfanumerici e spazio",
"group_add_member": "Aggiungere un utente",
"app_state_high-quality_explanation": "Questa applicazione è ben integrata con YunoHost. E 'stato (ed è!) peer-reviewed dal team di YunoHost app. Ci si può aspettare che sia sicuro e mantenuto a lungo termine.",
"app_state_high-quality_explanation": "Questa applicazione è ben integrata con YunoHost. È stata (ed è!) peer-reviewed dal team di YunoHost app. Ci si può aspettare che sia sicura e mantenuta a lungo termine.",
"details": "Dettagli",
"diagnosis_experimental_disclaimer": "Siate consapevoli che la funzione di diagnosi è ancora sperimentale e in fase di perfezionamento, e potrebbe non essere completamente affidabile.",
"errors": "%s errori",
@ -446,5 +446,45 @@
"configuration": "Configuratione",
"advanced": "Avanzate",
"app_state_working_explanation": "Il manutentore di questa applicazione lo ha dichiarato \"funzionante\". Significa che dovrebbe essere funzionale (c.f. livello di applicazione) ma non è necessariamente sottoposta a peer-reviewing, può ancora contenere problemi o non è pienamente integrata con YunoHost.",
"group_new": "Nuovo gruppo"
"group_new": "Nuovo gruppo",
"warnings": "%s avvisi",
"unmaintained_details": "Questa applicazione non è stata aggiornata da tempo e il mantainer precedente se n'è andato oppure non ha più tempo per manutenerla. Potresti controllare il repository per dare il tuo aiuto",
"unignore": "Non ignorare più",
"since": "da",
"restart": "Riavvia",
"request_help_details": "ll mantainer attuale vorrebbe un po' di aiuto nella manutenzione di questa applicazione. Potresti contribuire!",
"request_help": "necessita aiuto",
"request_adoption_details": "Il mantainer attuale vorrebbe smettere di manutenere questa applicazione. Potresti proporti come nuovo mantainer!",
"request_adoption": "in attesa di adozione",
"rerun_diagnosis": "Riavvia la diagnostica",
"operation_failed_explanation": "Questa operazione è fallita! Siamo spiacenti :( Puoi provare a <a href='https://yunohost.org/help'>chiedere aiuto</a>. Sei pregato di fornire *il log completo* dell'operazione alle persone che ti aiuteranno. Per farlo clicca sul bottone verde 'Condividi con Yunopaste'. Quando condividi i log YunoHost cercherà automaticamente di renderli anonimi eliminando dati privato come nomi di dominio e IP.",
"others": "Altre",
"orphaned_details": "Questa applicazione non è più stata manutenuta da qualche tempo. Potrebbe funzionare ancora ma non riceverà più aggiornamenti fino a quando non verrà adottata da qualche volontario. Potresti contribuire facendolo!",
"orphaned": "Non mantenuta",
"only_decent_quality_apps": "Solo applicazioni di qualità decente",
"only_highquality_apps": "Solo applicazioni di alta qualità",
"nobody": "Nessuno",
"maintained_details": "Questa applicazione è stata manutenuta dal suo mantainer negli ultimi mesi.",
"maintained": "mantenuta",
"license": "Licenza",
"last_ran": "Ultima esecuzione:",
"issues": "%s problemi",
"ignored": "%s ignorato",
"ignore": "Ignora",
"permissions": "Permessi",
"groups_and_permissions_manage": "Gestisci i gruppi e i permessi",
"groups_and_permissions": "Gruppi e permessi",
"groups": "Gruppi",
"group_specific_permissions": "Permessi specifici per l'utente",
"group_explain_visitors_needed_for_external_client": "Poni attenzione al fatto che dovrai dare l'accesso ai visitatori ad alcune applicazioni se pensi di usarle con dei client esterni. Ad esempio questo è il caso di Nextcloud nel caso tu lo voglia usare con un client di sincronizzazione dal tuo smartphone o dal computer desktop.",
"group_explain_visitors": "Questo è un gruppo speciale che individua i visitatori anonimi",
"run_first_diagnosis": "Avvio diagnosi iniziali",
"diagnosis_explanation": "La funzione di diagnosi cercherà di identificare problemi comuni nei differenti aspetti del tuo server per essere sicuri che tutto funzioni correttamente. La diagnosi si avvia automaticamente due volte al giorno e un email viene inviata all'amministratore se vengono identificati dei problemi. Nota che alcuni test possono non essere rilevanti se non vuoi usare alcune specifiche funzionalità (come ad esempio XMPP) oppure potrebbero fallire sei hai un setup complesso. In questi casi, se sai quello che stai facendo, puoi ignorare questi problemi o avvisi.",
"diagnosis_first_run": "La funzione di diagnosi cercherà di identificare problemi comuni nei differenti aspetti del tuo server per essere sicuri che tutto funzioni correttamente. Sei invitato a non farti prendere dal panico nel caso vengano indicati molti errori dopo la prima installazione del tuo server perché questa funzione cerca di aiutarti ad identificare i problemi e guidarti nella loro soluzione. La diagnosi inoltre si avvierà automaticamente due volte al giorno e un email verrà inviata all'amministratore se vengono identificati dei problemi.",
"confirm_service_restart": "Sei sicuro di voler riavviare %s?",
"catalog": "Catalogo",
"app_state_low_quality_explanation": "Questa applicazione può essere funzionale ma potrebbe presentare dei problemi oppure non essere pienamente integrata con YunoHost oppure non rispettare le pratiche consigliate.",
"app_state_low_quality": "bassa qualità",
"all": "Tutti",
"pending_migrations": "Ci sono alcune migrazioni in sospeso in attesa di essere eseguite. Consulta <a href='#/tools/migrations'>Tools > Migrations</a> per visualizzarle."
}

View file

@ -2,7 +2,7 @@
"configuration": "कन्फिगरेसन",
"close": "बन्द",
"check": "जाँच गर्नुहोस्",
"cancel": "रद्द",
"cancel": "रद्द गर्नुहोस्",
"both": "दुबै",
"begin": "सुरु गर्नुहोस्",
"backups_no": "कुनै ब्याकअप छैन",
@ -54,5 +54,8 @@
"remove": "हटाउनुहोस्",
"add": "थप्नुहोस्",
"active": "सक्रिय",
"action": "कार्य"
"action": "कार्य",
"password": "पासवर्ड",
"ok": "ठिक छ",
"logged_out": "लग आउट"
}

View file

@ -374,7 +374,7 @@
"certificate_alert_about_to_expire": "Atencion: lo certificat actual es a man dexpirar! Serà pas renovat automaticament!",
"certificate_alert_great": "Perfièch! Sètz a utilizar un certificat Lets Encrypt valid!",
"certificate_old_letsencrypt_app_conflict": "Laplicacion «letsencrypt» es actualament installada e es en conflicte amb aquesta foncionalitat. Mercés de la desinstallar per utilizar la novèla interfàcia de gestion dels certificats.",
"domain_not_eligible_for_ACME": "Aqueste domeni sembla pas prèst per un certificat Lets Encrypt. Mercés de verificar la configuracion DNS e laccessibilitat del servidor HTTP.",
"domain_not_eligible_for_ACME": "Aqueste domeni sembla pas prèst per un certificat Lets Encrypt. Mercés de verificar la configuracion DNS e laccessibilitat del servidor HTTP. Las seccions «enregistrament DNS» e «Web» de <a href='#/diagnosis'>la pagina de diagnostic</a> pòt vos ajudar a comprendre çò ques pas configurat coma cal.",
"manually_renew_letsencrypt_message": "Lo certificat serà renovat automaticament pendent los 15 darrièrs jorns de validitat. Podètz lo renovar manualament se volètz. (Pas recomandat).",
"meltdown": "Sètz vulnerable a la falha de seguretat critica <a target=\"_blank\" href=\"https://meltdownattack.com/\">meltdown</a>. Per dire de resòlvre aqueste problèma, vos cal <a href=\"#/update\">actualizar vòstre sistèma</a> puèi <a href=\"#/tools/reboot\"> lo tornar aviar</a> per cargar lo nòu nuclèu linux.",
"revert_to_selfsigned_cert_message": "So volètz vertadièrament, podètz tornar installar lo certificat auto-signat. (Pas recomandat)",
@ -443,7 +443,7 @@
"last_ran": "Darrièra execucion :",
"permissions": "Permissions",
"details": "Detalhs",
"diagnosis_experimental_disclaimer": "Remembratz-vos que lopcion de diagnostic es encara experimentala e se melhorar, e pòt pas èsser fisabla.",
"diagnosis_experimental_disclaimer": "Remembratz-vos que lopcion de diagnostic es encara experimentala e a se melhorar, e pòt pas èsser fisabla.",
"errors": "%s errors",
"everything_good": "Tot es bon !",
"group": "Grop",
@ -471,5 +471,9 @@
"app_state_low_quality": "qualitat bassa",
"catalog": "Catalòg",
"others": "Autras",
"run_first_diagnosis": "Executar lo diagnostic inicial"
"run_first_diagnosis": "Executar lo diagnostic inicial",
"confirm_service_restart": "Volètz vertadièrament reaviar %s?",
"restart": "Reaviar",
"groups": "Grops",
"issues": "%s problèmas"
}

View file

@ -1,5 +1,5 @@
{
"password": "hasło",
"password": "Hasło",
"action": "Akcja",
"active": "Aktywny",
"add": "Dodaj",

View file

@ -318,5 +318,6 @@
"diagnosis_experimental_disclaimer": "Esteja ciente de que a ferramenta de diagnóstico ainda é experimental e está em fase de aperfeiçoamento, e pode não ser totalmente confiável.",
"details": "Detalhes",
"catalog": "Catálogo",
"configuration": "Configuração"
"configuration": "Configuração",
"confirm_service_restart": "Tem certeza que deseja reiniciar %s?"
}

View file

@ -11,5 +11,32 @@
"logged_out": "登出",
"cancel": "取消",
"ok": "好",
"password": "密码"
"password": "密码",
"logged_in": "登录",
"configuration": "配置",
"close": "关闭",
"check": "检查",
"catalog": "目录",
"both": "同时",
"begin": "开始",
"backups_no": "无备份",
"backup_optional_password": "可选密码",
"backup_optional_encryption": "可选加密",
"backup_new": "新备份",
"backup_create": "创建一个备份",
"backup_content": "备份内容",
"backup_action": "备份",
"backup": "备份",
"applications": "应用程序",
"app_state_working": "工作",
"app_state_high-quality": "高质量",
"app_state_notworking": "不工作",
"app_make_default": "设为默认",
"app_install_custom_no_manifest": "manifest.json文件不存在",
"app_install_cancel": "安装已取消。",
"app_info_uninstall_desc": "删除此应用程序。",
"app_info_default_desc": "重定向域根到这个应用(%s。",
"app_info_changelabel_desc": "在门户中修改应用标签。",
"unignore": "取消忽略",
"last_ran": "最近一次运行:"
}

7792
src/package-lock.json generated Normal file

File diff suppressed because it is too large Load diff

View file

@ -6,7 +6,6 @@
"url": "https://github.com/YunoHost/yunohost-admin"
},
"scripts": {
"postinstall": "bower install",
"build": "gulp build",
"build-dev": "gulp build --dev",
"watch": "gulp watch",
@ -19,18 +18,30 @@
},
"homepage": "https://github.com/YunoHost/yunohost-admin",
"devDependencies": {
"bower": "^1.7.7",
"gulp": "^3.9.0",
"gulp-autoprefixer": "^2.3.1",
"gulp-concat": "^2.6.0",
"gulp-csslint": "^0.2.0",
"gulp-cssmin": "^0.1.7",
"gulp-if": "^2.0.0",
"gulp-imagemin": "^2.3.0",
"gulp-jshint": "^1.11.2",
"gulp-less": "^3.0.3",
"gulp-rename": "^1.2.2",
"gulp-uglify": "^1.2.0",
"gulp-util": "^3.0.7"
"gulp": "^4.0.2",
"gulp-autoprefixer": "^7.0.1",
"gulp-concat": "^2.6.1",
"gulp-csslint": "^1.0.1",
"gulp-cssmin": "^0.2.0",
"gulp-if": "^3.0.0",
"gulp-imagemin": "^7.1.0",
"gulp-jshint": "^2.1.0",
"jshint": "^2.11.1",
"gulp-less": "^4.0.1",
"gulp-rename": "^2.0.0",
"gulp-uglify": "^3.0.2",
"gulp-mustache": "^5.0.0"
},
"dependencies": {
"bootstrap": "^3.3.7",
"fork-awesome": "^1.1.7",
"handlebars": "^4.7.6",
"handlebars-intl": "1.1.2",
"isotope-layout": "^3.0.6",
"jquery": "^3.5.1",
"js-cookie": "^2.2.1",
"sammy": "^0.7.6",
"source-code-pro": "^2.30.2",
"source-sans-pro": "^3.6.0"
}
}

View file

@ -83,7 +83,7 @@
{{/apps}}
</div>
<div class="panel panel-default">
<div id="install-custom-app" class="panel panel-default">
<div class="panel-heading">
<h2 class="panel-title"><span class="fa-fw fa-download"></span> {{t 'custom_app_install'}}</h2>
</div>
@ -92,7 +92,8 @@
<span class="fa-fw fa-warning"></span>
{{t 'confirm_install_custom_app'}}
</p>
<form action="#/apps/install/custom" method="POST" class="form-horizontal">
<form class="form-horizontal">
<div class="form-group has-feedback">
<label for="url" class="col-sm-12">{{t 'url'}}</label>
<div class="col-sm-12">
@ -104,7 +105,7 @@
</div>
<div class="form-group">
<div class="text-center">
<input type="submit" role="button" class="btn btn-success slide" value="{{t 'install'}}">
<a role="button" class="btn btn-success slide">{{t 'install'}}</a>
</div>
</div>
</form>

View file

@ -7,7 +7,7 @@
<div class="separator"></div>
<div id="category-selector" class="list-group grid">
<a class="app-category-card" href="#/apps/catalog/all">
<a class="app-category-card panel panel-default" href="#/apps/catalog/all">
<div class="panel-body">
<h2 class="app-category-title" style="padding-top: 1em;"><span class="fa-fw fa-search"></span> {{t 'all_apps'}}</h2>
</div>

View file

@ -16,9 +16,9 @@
<div class="panel-body">
<dl class="dl-horizontal">
<dt>{{t 'id'}}</dt>
<dd>{{id}}</dd>
<dd>{{manifest.id}}</dd>
<dt>{{t 'description'}}</dt>
<dd>{{manifest.description}}</dd>
<dd>{{description}}</dd>
{{#displayLicense}}
<dt>{{t 'license'}}</dt>
<dd>{{manifest.license}}</dd>

View file

@ -11,21 +11,23 @@
<div class="separator"></div>
{{#unless reports}}
<div class="alert alert-info text-center">
{{#if reports}}
<p>{{t 'diagnosis_explanation'}}</p>
{{else}}
<p>{{t 'diagnosis_first_run'}}</p>
<br>
<button class="btn btn-info" data-action="run-full-diagnosis"><span class="fa-fw fa-stethoscope"></span> {{t 'run_first_diagnosis'}}</button>
{{/if}}
</div>
{{/unless}}
<div class="alert alert-warning text-center">{{t 'diagnosis_experimental_disclaimer'}}</div>
{{#reports}}
<div class="panel panel-default">
<div class="panel panel-default panel-diagnosis" data-category="{{id}}">
<div class="panel-heading">
<h2 class="panel-title" style="display: inline-block; margin-right: 10px;">
<a data-toggle="collapse" href="#category-{{id}}">{{ description }}</a>
<a data-toggle="collapse" href="#diagnosis-body-{{id}}">{{ description }}</a>
</h2>
{{#if noIssues}}{{#if items}}<span class="label label-success">{{t 'everything_good'}}</span>{{/if}}{{/if}}
{{#if errors}}<span class="label label-danger">{{t 'issues' errors }}</span>{{/if}}
@ -33,7 +35,7 @@
{{#if ignored}}<span class="label label-default">{{t 'ignored' ignored }}</span>{{/if}}
<button class="btn btn-sm {{#if items}}btn-info{{else}}btn-success{{/if}} pull-right" data-action="rerun-diagnosis" data-category="{{ id }}"><span class="fa-fw fa-refresh"></span> {{t 'rerun_diagnosis'}}</button>
</div>
<div class="panel-body collapse {{#if errors}}in{{/if}}" id="category-{{id}}">
<div class="panel-body collapse {{#if errors}}in{{/if}}" id="diagnosis-body-{{id}}">
<ul class="list-group" style="margin-bottom: 0px">
<p>{{t 'last_ran' }} {{formatRelative time day="numeric" month="long" year="numeric" hour="numeric" minute="numeric" }}</p>
{{#items}}

View file

@ -22,29 +22,24 @@
<dt>{{t 'logs_path'}}</dt> <dd>{{ log.log_path }}</dd>
{{#if log.metadata.started_at}}<dt>{{t 'logs_started_at'}}</dt> <dd>{{formatTime log.metadata.started_at day="numeric" month="long" year="numeric" hour="numeric" minute="numeric"}}</dd>
{{/if}}{{#if log.metadata.ended_at}}<dt>{{t 'logs_ended_at'}}</dt> <dd>{{formatTime log.metadata.ended_at day="numeric" month="long" year="numeric" hour="numeric" minute="numeric"}}</dd>{{/if}}
{{#if log.metadata.error}}<dt>{{t 'logs_error'}}</dt> <dd>{{t 'logs_end_with_error'}} {{log.metadata.error}}</dd>{{/if}}
{{#if log.metadata.error}}<dt>{{t 'logs_error'}}</dt> <dd>{{log.metadata.error}}</dd>{{/if}}
{{#if log.metadata.suboperations}}
<dt>{{t 'log_suboperations'}}</dt>
{{#log.metadata.suboperations}}
<dd>{{#unless success }}<span class="fa-fw fa-close text-danger"></span>{{/unless}}
<a href="#/tools/logs/{{ name }}">{{ description }}</a></dd>
{{/log.metadata.suboperations}}
{{/if}}
</dl>
</div>
</div>
{{#if log.metadata.env}}
<div class="panel panel-default">
<div class="panel-heading" role="tab" id="heading-context">
<h2 class="panel-title">
<a role="button" data-toggle="collapse" data-parent="#accordion" href="#collapse-context" aria-expanded="true" aria-controls="collapse-context">
<span class="fa-fw fa-bug"></span>{{t 'logs_context'}}
</a>
</h2>
</div>
<div id="collapse-context" class="panel-collapse collapse" role="tabpanel" aria-labelledby="heading-context">
<div class="panel-body">
<dl class="dl-horizontal" id="env">
{{#each log.metadata.env}}<dt>{{@key}}</dt> <dd>{{.}}</dd>
{{/each}}
</dl>
</div>
</div>
{{#unless log.metadata.success}}
<div class="alert alert-danger text-center">
<p>{{t 'operation_failed_explanation'}}</p>
</div>
{{/if}}
{{/unless}}
{{/if}}
<div class="panel panel-default">

View file

@ -7,29 +7,17 @@
<div class="separator"></div>
{{#intl locales=locale}}
{{#if data}}
<div class="panel-group" id="accordion" role="tablist" aria-multiselectable="true">
{{#data}}
{{#if value}}
<div class="panel panel-default">
<div class="panel-heading" role="tab" id="heading-{{key}}">
<h2 class="panel-title">
<a role="button" data-toggle="collapse" data-parent="#accordion" href="#collapse-{{key}}" aria-expanded="true" aria-controls="collapse-{{key}}">
<span class="fa-fw fa-{{icon}}"></span>{{t (concat 'logs_' key)}}
</a>
</h2>
</div>
<div id="collapse-{{key}}" class="panel-collapse{{#if @first}}{{else}} collapse{{/if}}" role="tabpanel" aria-labelledby="heading-{{key}}">
<div class="list-group">
{{#value}}
<a href="#/tools/logs/{{ name }}" class="list-group-item slide" title='{{formatTime started_at day="numeric" month="long" year="numeric" hour="numeric" minute="numeric"}}'><small style="margin-right:20px;" >{{formatRelative started_at}}</small>
<span class="fa-fw fa-{{success_icon}}"></span> {{ description }}</a>
{{/value}}
</div>
</div>
<div class="panel panel-default">
<div class="panel-heading">
<h2 class="panel-title">
<span class="fa-fw fa-wrench"></span>{{t 'logs_operation'}}
</h2>
</div>
<div class="list-group">
{{#operations}}
<a href="#/tools/logs/{{ name }}" class="list-group-item slide" title='{{formatTime started_at day="numeric" month="long" year="numeric" hour="numeric" minute="numeric"}}'><small style="margin-right:20px;" >{{formatRelative started_at}}</small>
<span class="fa-fw fa-{{success_icon}}"></span> {{ description }}</a>
{{/operations}}
</div>
{{/if}}
{{/data}}
</div>
{{/if}}
{{/intl}}

View file

@ -5,6 +5,12 @@
<div class="separator"></div>
{{#if pending_migrations}}
<div class="alert alert-warning">
{{t 'pending_migrations' "#/tools/migrations"}}
</div>
{{/if}}
<div class="panel panel-default">
<div class="panel-heading">
<h2 class="panel-title"><span class="fa-fw fa-server"></span> {{t 'system'}}</h2>

View file

@ -28,21 +28,35 @@
</div>
</div>
<hr>
<div class="alert alert-warning col-sm-offset-3 col-sm-9"><i class="fa fa-lock fa-fw"></i> {{t 'good_practices_about_user_password'}}</div>
<div class="form-group">
<label for="password" class="col-sm-3 control-label">{{t 'password'}}</label>
<div class="col-sm-9">
<input type="password" id="password" name="password" class="form-control" placeholder="••••••••••" required>
</div>
</div>
<div class="form-group">
<label for="confirmation" class="col-sm-3 control-label">{{t 'password_confirmation'}}</label>
<div class="col-sm-9">
<input type="password" id="confirmation" name="confirmation" class="form-control" placeholder="••••••••••" required>
</div>
</div>
<hr>
<div class="alert alert-info col-sm-offset-3 col-sm-9"><i class="fa fa-envelope fa-fw"></i> {{t 'tip_about_user_email'}}</div>
<div class="form-group">
<label for="mail" class="col-sm-3 control-label">{{t 'user_email'}}</label>
<div class="clearfix visible-xs"></div>
<div class="col-sm-4 col-xs-6">
<input type="text" id="email" name="email" class="form-control" placeholder="johndoe" required>
</div>
<p id="email-left" class="form-control-static" style="text-align:right;">johndoe</p>
</div>
<div class="col-sm-5 col-xs-6">
<select class="form-control" name="domain">
{{#domains}}
<option>@{{.}}</option>
<option>@{{.}}</option>
{{/domains}}
</select>
</div>
</div>
<hr>
<div class="form-group">
<label for="mailbox-quota" class="col-sm-3 control-label">{{t 'user_mailbox_quota'}}</label>
<div class="col-sm-4">
@ -50,24 +64,10 @@
<input type="number" min="0" id="mailbox-quota" name="mailbox_quota" class="form-control" placeholder="{{t 'mailbox_quota_placeholder'}}">
<div class="input-group-addon">M</div>
</div>
</div>
<div class="col-sm-5">
<div class="help-block quota-help-block">{{t 'mailbox_quota_description'}}</div>
</div>
</div>
<div class="form-group">
<label for="password" class="col-sm-3 control-label">{{t 'password'}}</label>
<div class="col-sm-9">
<input type="password" id="password" name="password" class="form-control" placeholder="•••••" required>
</div>
</div>
<div class="form-group">
<label for="confirmation" class="col-sm-3 control-label">{{t 'password_confirmation'}}</label>
<div class="col-sm-9">
<input type="password" id="confirmation" name="confirmation" class="form-control" placeholder="•••••" required>
<div class="help-block">{{t 'good_practices_about_user_password'}}</div>
</div>
</div>
</div>
</div>

View file

@ -28,6 +28,21 @@
<input type="text" name="lastname" class="form-control" value="{{lastname}}">
</div>
</div>
<hr>
<div class="form-group">
<label for="password" class="col-sm-3 control-label">{{t 'password'}}</label>
<div class="col-sm-9">
<input type="password" id="password" name="password" class="form-control" placeholder="••••••••••">
</div>
</div>
<div class="form-group">
<label for="confirmation" class="col-sm-3 control-label">{{t 'password_confirmation'}}</label>
<div class="col-sm-9">
<input type="password" id="confirmation" name="confirmation" class="form-control" placeholder="••••••••••">
<div class="help-block">{{t 'good_practices_about_user_password'}}</div>
</div>
</div>
<hr>
<div class="form-group">
<label for="email" class="col-sm-3 control-label">{{t 'user_email'}}</label>
<div class="clearfix visible-xs"></div>
@ -77,22 +92,6 @@
<input id="mailforward" type="email" name="mailforward" class="mailforward-input form-control" placeholder="{{t 'user_new_forward'}}">
</div>
</div>
<hr>
<div class="form-group">
<label for="password" class="col-sm-3 control-label">{{t 'password'}}</label>
<div class="col-sm-9">
<input type="password" id="password" name="password" class="form-control" placeholder="•••••">
</div>
</div>
<div class="form-group">
<label for="confirmation" class="col-sm-3 control-label">{{t 'password_confirmation'}}</label>
<div class="col-sm-9">
<input type="password" id="confirmation" name="confirmation" class="form-control" placeholder="•••••">
<div class="help-block">{{t 'good_practices_about_user_password'}}</div>
</div>
</div>
</div>
</div>