Merge branch 'staging' into foldersColor
commit
2c661310c7
@ -0,0 +1,3 @@
|
|||||||
|
The "cptools" font is using the [palette-solid icon](https://fontawesome.com/icons/palette?style=solid) from the "Font Awesome 5 Free" icon set.
|
||||||
|
|
||||||
|
This icon is licensed under the [Creative Commons Attribution 4.0 International license](https://fontawesome.com/license/free).
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 21 KiB |
Binary file not shown.
Binary file not shown.
@ -0,0 +1,86 @@
|
|||||||
|
@import (reference) "./colortheme-all.less";
|
||||||
|
@import (reference) './modal.less';
|
||||||
|
@import (reference) './alertify.less';
|
||||||
|
@import (reference) './avatar.less';
|
||||||
|
@import (reference) './checkmark.less';
|
||||||
|
@import (reference) './password-input.less';
|
||||||
|
@import (reference) "./tools.less";
|
||||||
|
.share_main () {
|
||||||
|
.alertify_main();
|
||||||
|
.checkmark_main(20px);
|
||||||
|
.password_main();
|
||||||
|
.modal_main();
|
||||||
|
|
||||||
|
.cp-share-columns {
|
||||||
|
display: flex;
|
||||||
|
flex-flow: row;
|
||||||
|
|
||||||
|
.cp-share-column {
|
||||||
|
width: 50%;
|
||||||
|
padding: 0 10px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.cp-share-grid, .cp-share-list {
|
||||||
|
.avatar_main(50px);
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
}
|
||||||
|
.cp-share-list {
|
||||||
|
margin-bottom: 15px;
|
||||||
|
}
|
||||||
|
.cp-share-grid {
|
||||||
|
max-height: 228px;
|
||||||
|
overflow-x: auto;
|
||||||
|
}
|
||||||
|
.cp-recent-only {
|
||||||
|
.cp-share-grid, .cp-share-grid-filter {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.cp-share-grid-filter {
|
||||||
|
display: flex;
|
||||||
|
input {
|
||||||
|
flex: 1;
|
||||||
|
min-width: 0;
|
||||||
|
margin-bottom: 0 !important;
|
||||||
|
&::placeholder { /* Chrome, Firefox, Opera, Safari 10.1+ */
|
||||||
|
color: @colortheme_alertify-primary-text;
|
||||||
|
opacity: 1; /* Firefox */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
margin-bottom: 15px;
|
||||||
|
}
|
||||||
|
.cp-share-friend {
|
||||||
|
width: 70px;
|
||||||
|
height: 70px;
|
||||||
|
display: flex;
|
||||||
|
flex-flow: column;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
padding: 5px;
|
||||||
|
margin-bottom: 6px;
|
||||||
|
cursor: default;
|
||||||
|
transition: order 0.5s, background-color 0.5s;
|
||||||
|
.tools_unselectable();
|
||||||
|
|
||||||
|
&.cp-selected {
|
||||||
|
background-color: @colortheme_alertify-primary;
|
||||||
|
color: @colortheme_alertify-primary-text;
|
||||||
|
order: -1 !important;
|
||||||
|
}
|
||||||
|
.cp-share-friend-name {
|
||||||
|
overflow: hidden;
|
||||||
|
white-space: nowrap;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
width: 100%;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
border: 1px solid @colortheme_alertify-primary;
|
||||||
|
&.cp-fake-friend {
|
||||||
|
visibility: hidden;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -0,0 +1,15 @@
|
|||||||
|
html, body {
|
||||||
|
margin: 0px;
|
||||||
|
padding: 0px;
|
||||||
|
}
|
||||||
|
#sbox-iframe, #sbox-share-iframe, #sbox-filePicker-iframe {
|
||||||
|
position: fixed;
|
||||||
|
top:0; left:0;
|
||||||
|
bottom:0; right:0;
|
||||||
|
width:100%;
|
||||||
|
height: 100%;
|
||||||
|
border: 0;
|
||||||
|
margin:0;
|
||||||
|
padding:0;
|
||||||
|
overflow:hidden;
|
||||||
|
}
|
@ -0,0 +1,14 @@
|
|||||||
|
/*
|
||||||
|
* You can override the translation text using this file.
|
||||||
|
* The recommended method is to make a copy of this file (/customize.dist/translations/messages.{LANG}.js)
|
||||||
|
in a 'customize' directory (/customize/translations/messages.{LANG}.js).
|
||||||
|
* If you want to check all the existing translation keys, you can open the internal language file
|
||||||
|
but you should not change it directly (/common/translations/messages.{LANG}.js)
|
||||||
|
*/
|
||||||
|
define(['/common/translations/messages.ca.js'], function (Messages) {
|
||||||
|
// Replace the existing keys in your copied file here:
|
||||||
|
// Messages.button_newpad = "New Rich Text Document";
|
||||||
|
|
||||||
|
return Messages;
|
||||||
|
});
|
||||||
|
|
@ -0,0 +1,14 @@
|
|||||||
|
/*
|
||||||
|
* You can override the translation text using this file.
|
||||||
|
* The recommended method is to make a copy of this file (/customize.dist/translations/messages.{LANG}.js)
|
||||||
|
in a 'customize' directory (/customize/translations/messages.{LANG}.js).
|
||||||
|
* If you want to check all the existing translation keys, you can open the internal language file
|
||||||
|
but you should not change it directly (/common/translations/messages.{LANG}.js)
|
||||||
|
*/
|
||||||
|
define(['/common/translations/messages.te.js'], function (Messages) {
|
||||||
|
// Replace the existing keys in your copied file here:
|
||||||
|
// Messages.button_newpad = "New Rich Text Document";
|
||||||
|
|
||||||
|
return Messages;
|
||||||
|
});
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,63 @@
|
|||||||
|
var nThen = require("nthen");
|
||||||
|
|
||||||
|
var Store = require("../storage/file");
|
||||||
|
var config = require("../lib/load-config");
|
||||||
|
|
||||||
|
var store;
|
||||||
|
var Log;
|
||||||
|
nThen(function (w) {
|
||||||
|
// load the store which will be used for iterating over channels
|
||||||
|
// and performing operations like archival and deletion
|
||||||
|
Store.create(config, w(function (_) {
|
||||||
|
store = _;
|
||||||
|
}));
|
||||||
|
|
||||||
|
// load the logging module so that you have a record of which
|
||||||
|
// files were archived or deleted at what time
|
||||||
|
var Logger = require("../lib/log");
|
||||||
|
Logger.create(config, w(function (_) {
|
||||||
|
Log = _;
|
||||||
|
}));
|
||||||
|
}).nThen(function (w) {
|
||||||
|
// count the number of files which have been restored in this run
|
||||||
|
var conflicts = 0;
|
||||||
|
|
||||||
|
var handler = function (err, item, cb) {
|
||||||
|
if (err) {
|
||||||
|
Log.error('DIAGNOSE_ARCHIVE_CONFLICTS_ITERATION', err);
|
||||||
|
return void cb();
|
||||||
|
}
|
||||||
|
|
||||||
|
// check if such a file exists on the server
|
||||||
|
store.isChannelAvailable(item.channel, function (err, available) {
|
||||||
|
// weird edge case?
|
||||||
|
if (err) { return void cb(); }
|
||||||
|
|
||||||
|
// the channel doesn't exist in the database
|
||||||
|
if (!available) { return void cb(); }
|
||||||
|
|
||||||
|
// the channel is available
|
||||||
|
// that means it's a duplicate of something in the archive
|
||||||
|
conflicts++;
|
||||||
|
Log.info('DIAGNOSE_ARCHIVE_CONFLICT_DETECTED', item.channel);
|
||||||
|
cb();
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
// if you hit an error, log it
|
||||||
|
// otherwise, when there are no more channels to process
|
||||||
|
// log some stats about how many were removed
|
||||||
|
var done = function (err) {
|
||||||
|
if (err) {
|
||||||
|
return Log.error('DIAGNOSE_ARCHIVE_CONFLICTS_FINAL_ERROR', err);
|
||||||
|
}
|
||||||
|
Log.info('DIAGNOSE_ARCHIVE_CONFLICTS_COUNT', conflicts);
|
||||||
|
};
|
||||||
|
|
||||||
|
store.listArchivedChannels(handler, w(done));
|
||||||
|
}).nThen(function () {
|
||||||
|
// the store will keep this script running if you don't shut it down
|
||||||
|
store.shutdown();
|
||||||
|
Log.shutdown();
|
||||||
|
});
|
||||||
|
|
@ -0,0 +1,169 @@
|
|||||||
|
var nThen = require("nthen");
|
||||||
|
|
||||||
|
var Store = require("../storage/file");
|
||||||
|
var Pinned = require("./pinned");
|
||||||
|
var config = require("../lib/load-config");
|
||||||
|
|
||||||
|
// the administrator should have set an 'inactiveTime' in their config
|
||||||
|
// if they didn't, just exit.
|
||||||
|
if (!config.inactiveTime || typeof(config.inactiveTime) !== "number") { return; }
|
||||||
|
|
||||||
|
// files which have not been changed since before this date can be considered inactive
|
||||||
|
var inactiveTime = +new Date() - (config.inactiveTime * 24 * 3600 * 1000);
|
||||||
|
|
||||||
|
// files which were archived before this date can be considered safe to remove
|
||||||
|
var retentionTime = +new Date() - (config.archiveRetentionTime * 24 * 3600 * 1000);
|
||||||
|
|
||||||
|
var store;
|
||||||
|
var pins;
|
||||||
|
var Log;
|
||||||
|
nThen(function (w) {
|
||||||
|
// load the store which will be used for iterating over channels
|
||||||
|
// and performing operations like archival and deletion
|
||||||
|
Store.create(config, w(function (_) {
|
||||||
|
store = _;
|
||||||
|
})); // load the list of pinned files so you know which files
|
||||||
|
// should not be archived or deleted
|
||||||
|
Pinned.load(w(function (err, _) {
|
||||||
|
if (err) {
|
||||||
|
w.abort();
|
||||||
|
return void console.error(err);
|
||||||
|
}
|
||||||
|
pins = _;
|
||||||
|
}), {
|
||||||
|
pinPath: config.pinPath,
|
||||||
|
});
|
||||||
|
|
||||||
|
// load the logging module so that you have a record of which
|
||||||
|
// files were archived or deleted at what time
|
||||||
|
var Logger = require("../lib/log");
|
||||||
|
Logger.create(config, w(function (_) {
|
||||||
|
Log = _;
|
||||||
|
}));
|
||||||
|
}).nThen(function (w) {
|
||||||
|
// this block will iterate over archived channels and remove them
|
||||||
|
// if they've been in cold storage for longer than your configured archive time
|
||||||
|
|
||||||
|
// if the admin has not set an 'archiveRetentionTime', this block makes no sense
|
||||||
|
// so just skip it
|
||||||
|
if (typeof(config.archiveRetentionTime) !== "number") { return; }
|
||||||
|
|
||||||
|
// count the number of files which have been removed in this run
|
||||||
|
var removed = 0;
|
||||||
|
|
||||||
|
var handler = function (err, item, cb) {
|
||||||
|
if (err) {
|
||||||
|
Log.error('EVICT_ARCHIVED_CHANNEL_ITERATION', err);
|
||||||
|
return void cb();
|
||||||
|
}
|
||||||
|
// don't mess with files that are freshly stored in cold storage
|
||||||
|
// based on ctime because that's changed when the file is moved...
|
||||||
|
if (+new Date(item.ctime) > retentionTime) {
|
||||||
|
return void cb();
|
||||||
|
}
|
||||||
|
|
||||||
|
// but if it's been stored for the configured time...
|
||||||
|
// expire it
|
||||||
|
store.removeArchivedChannel(item.channel, w(function (err) {
|
||||||
|
if (err) {
|
||||||
|
Log.error('EVICT_ARCHIVED_CHANNEL_REMOVAL_ERROR', {
|
||||||
|
error: err,
|
||||||
|
channel: item.channel,
|
||||||
|
});
|
||||||
|
return void cb();
|
||||||
|
}
|
||||||
|
Log.info('EVICT_ARCHIVED_CHANNEL_REMOVAL', item.channel);
|
||||||
|
removed++;
|
||||||
|
cb();
|
||||||
|
}));
|
||||||
|
};
|
||||||
|
|
||||||
|
// if you hit an error, log it
|
||||||
|
// otherwise, when there are no more channels to process
|
||||||
|
// log some stats about how many were removed
|
||||||
|
var done = function (err) {
|
||||||
|
if (err) {
|
||||||
|
return Log.error('EVICT_ARCHIVED_FINAL_ERROR', err);
|
||||||
|
}
|
||||||
|
Log.info('EVICT_ARCHIVED_CHANNELS_REMOVED', removed);
|
||||||
|
};
|
||||||
|
|
||||||
|
store.listArchivedChannels(handler, w(done));
|
||||||
|
}).nThen(function (w) {
|
||||||
|
var removed = 0;
|
||||||
|
var channels = 0;
|
||||||
|
var archived = 0;
|
||||||
|
|
||||||
|
var handler = function (err, item, cb) {
|
||||||
|
channels++;
|
||||||
|
if (err) {
|
||||||
|
Log.error('EVICT_CHANNEL_ITERATION', err);
|
||||||
|
return void cb();
|
||||||
|
}
|
||||||
|
// check if the database has any ephemeral channels
|
||||||
|
// if it does it's because of a bug, and they should be removed
|
||||||
|
if (item.channel.length === 34) {
|
||||||
|
return void store.removeChannel(item.channel, w(function (err) {
|
||||||
|
if (err) {
|
||||||
|
Log.error('EVICT_EPHEMERAL_CHANNEL_REMOVAL_ERROR', {
|
||||||
|
error: err,
|
||||||
|
channel: item.channel,
|
||||||
|
});
|
||||||
|
return void cb();
|
||||||
|
}
|
||||||
|
Log.info('EVICT_EPHEMERAL_CHANNEL_REMOVAL', item.channel);
|
||||||
|
cb();
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
// bail out if the channel was modified recently
|
||||||
|
if (+new Date(item.mtime) > inactiveTime) { return void cb(); }
|
||||||
|
|
||||||
|
// ignore the channel if it's pinned
|
||||||
|
if (pins[item.channel]) { return void cb(); }
|
||||||
|
|
||||||
|
// if the server is configured to retain data, archive the channel
|
||||||
|
if (config.retainData) {
|
||||||
|
return void store.archiveChannel(item.channel, w(function (err) {
|
||||||
|
if (err) {
|
||||||
|
Log.error('EVICT_CHANNEL_ARCHIVAL_ERROR', {
|
||||||
|
error: err,
|
||||||
|
channel: item.channel,
|
||||||
|
});
|
||||||
|
return void cb();
|
||||||
|
}
|
||||||
|
Log.info('EVICT_CHANNEL_ARCHIVAL', item.channel);
|
||||||
|
archived++;
|
||||||
|
cb();
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
// otherwise remove it
|
||||||
|
store.removeChannel(item.channel, w(function (err) {
|
||||||
|
if (err) {
|
||||||
|
Log.error('EVICT_CHANNEL_REMOVAL_ERROR', {
|
||||||
|
error: err,
|
||||||
|
channel: item.channel,
|
||||||
|
});
|
||||||
|
return void cb();
|
||||||
|
}
|
||||||
|
Log.info('EVICT_CHANNEL_REMOVAL', item.channel);
|
||||||
|
removed++;
|
||||||
|
cb();
|
||||||
|
}));
|
||||||
|
};
|
||||||
|
|
||||||
|
var done = function () {
|
||||||
|
if (config.retainData) {
|
||||||
|
return void Log.info('EVICT_CHANNELS_ARCHIVED', archived);
|
||||||
|
}
|
||||||
|
return void Log.info('EVICT_CHANNELS_REMOVED', removed);
|
||||||
|
};
|
||||||
|
|
||||||
|
store.listChannels(handler, w(done));
|
||||||
|
}).nThen(function () {
|
||||||
|
// the store will keep this script running if you don't shut it down
|
||||||
|
store.shutdown();
|
||||||
|
Log.shutdown();
|
||||||
|
});
|
||||||
|
|
@ -0,0 +1,61 @@
|
|||||||
|
var nThen = require("nthen");
|
||||||
|
|
||||||
|
var Store = require("../storage/file");
|
||||||
|
var config = require("../lib/load-config");
|
||||||
|
|
||||||
|
var store;
|
||||||
|
var Log;
|
||||||
|
nThen(function (w) {
|
||||||
|
// load the store which will be used for iterating over channels
|
||||||
|
// and performing operations like archival and deletion
|
||||||
|
Store.create(config, w(function (_) {
|
||||||
|
store = _;
|
||||||
|
}));
|
||||||
|
|
||||||
|
// load the logging module so that you have a record of which
|
||||||
|
// files were archived or deleted at what time
|
||||||
|
var Logger = require("../lib/log");
|
||||||
|
Logger.create(config, w(function (_) {
|
||||||
|
Log = _;
|
||||||
|
}));
|
||||||
|
}).nThen(function (w) {
|
||||||
|
// count the number of files which have been restored in this run
|
||||||
|
var restored = 0;
|
||||||
|
|
||||||
|
var handler = function (err, item, cb) {
|
||||||
|
if (err) {
|
||||||
|
Log.error('RESTORE_ARCHIVED_CHANNEL_ITERATION', err);
|
||||||
|
return void cb();
|
||||||
|
}
|
||||||
|
|
||||||
|
store.restoreArchivedChannel(item.channel, w(function (err) {
|
||||||
|
if (err) {
|
||||||
|
Log.error('RESTORE_ARCHIVED_CHANNEL_RESTORATION_ERROR', {
|
||||||
|
error: err,
|
||||||
|
channel: item.channel,
|
||||||
|
});
|
||||||
|
return void cb();
|
||||||
|
}
|
||||||
|
Log.info('RESTORE_ARCHIVED_CHANNEL_RESTORATION', item.channel);
|
||||||
|
restored++;
|
||||||
|
cb();
|
||||||
|
}));
|
||||||
|
};
|
||||||
|
|
||||||
|
// if you hit an error, log it
|
||||||
|
// otherwise, when there are no more channels to process
|
||||||
|
// log some stats about how many were removed
|
||||||
|
var done = function (err) {
|
||||||
|
if (err) {
|
||||||
|
return Log.error('RESTORE_ARCHIVED_FINAL_ERROR', err);
|
||||||
|
}
|
||||||
|
Log.info('RESTORE_ARCHIVED_CHANNELS_RESTORED', restored);
|
||||||
|
};
|
||||||
|
|
||||||
|
store.listArchivedChannels(handler, w(done));
|
||||||
|
}).nThen(function () {
|
||||||
|
// the store will keep this script running if you don't shut it down
|
||||||
|
store.shutdown();
|
||||||
|
Log.shutdown();
|
||||||
|
});
|
||||||
|
|
@ -0,0 +1,485 @@
|
|||||||
|
{
|
||||||
|
"main_title": "CryptPad: Sense Rastre, edició col·laborativa en temps real",
|
||||||
|
"type": {
|
||||||
|
"pad": "Text enriquit",
|
||||||
|
"code": "Codi",
|
||||||
|
"poll": "Enquesta",
|
||||||
|
"kanban": "Kanban",
|
||||||
|
"slide": "Presentació",
|
||||||
|
"drive": "CryptDrive",
|
||||||
|
"whiteboard": "Pissarra",
|
||||||
|
"file": "Fitxer",
|
||||||
|
"media": "Multimèdia",
|
||||||
|
"todo": "Tasques",
|
||||||
|
"contacts": "Contactes",
|
||||||
|
"sheet": "Full (Beta)"
|
||||||
|
},
|
||||||
|
"button_newpad": "Nou document",
|
||||||
|
"button_newcode": "Nova pàgina de codi",
|
||||||
|
"button_newpoll": "Nova enquesta",
|
||||||
|
"button_newslide": "Nova presentació",
|
||||||
|
"button_newwhiteboard": "Nova pissarra",
|
||||||
|
"button_newkanban": "Nou tauler Kanban",
|
||||||
|
"button_newsheet": "Nou full",
|
||||||
|
"common_connectionLost": "<b>S'ha perdut la connexió amb el servidor</b><br>Fins que la connexió no torni, esteu en mode només de lectura.",
|
||||||
|
"websocketError": "Hi ha hagut un error en connectar-se al servidor WebSocket...",
|
||||||
|
"typeError": "Aquest document és incompatible amb l'aplicació seleccionada",
|
||||||
|
"onLogout": "Esteu fora del vostre compte, {0}cliqueu aquí{1} per iniciar la sessió<br>o premeu <em>Esc</em> per accedir al vostre document en mode només de lectura.",
|
||||||
|
"wrongApp": "No és possible mostrar el contingut d'aquest document en temps real al vostre navegador. Proveu de tornar a carregar aquesta pàgina.",
|
||||||
|
"padNotPinned": "Aquest document caducarà després de 3 mesos d'inactivitat, {0}connecteu-vos{1} o {2}registreu-vos{3} per conservar-lo.",
|
||||||
|
"anonymousStoreDisabled": "L'administració d'aquesta instància de CryptPad ha desactivat l'emmagatzematge pels comptes anònims. Cal que inicieu la sessió per utilitzar el CryptDrive.",
|
||||||
|
"expiredError": "Aquest document ha caducat i ja no està disponible.",
|
||||||
|
"deletedError": "La persona que va crear aquest document l'ha esborrat i ja no està disponible.",
|
||||||
|
"inactiveError": "Donada la seva inactivitat, aquest document s'ha esborrat. Premeu Esc per crear un nou document.",
|
||||||
|
"chainpadError": "Hi ha hagut un error crític mentre s'actualitzava el vostre contingut. Aquesta pàgina es manté en mode només de lectura per assegurar que no perdreu el que ja heu fet.<br>Premeu <em>Esc</em> per continuar veient aquest document o torneu a carregar la pàgina per provar de continuar editant-lo.",
|
||||||
|
"invalidHashError": "El document que heu demanat té una adreça URL no vàlida.",
|
||||||
|
"errorCopy": " Encara podeu copiar el contingut en una altra ubicació prement <em>Esc</em>.<br>Un cop deixeu aquesta pàgina, desapareixerà per sempre!",
|
||||||
|
"errorRedirectToHome": "Premeu <em>Esc</em> per tornar al vostre CryptDrive.",
|
||||||
|
"newVersionError": "Hi ha una nova versió disponible de CryptPad.<br><a href='#'>Torneu a carregar</a> la pàgina per utilitzar la versió nova o premeu Esc per accedir al vostre contingut en mode <b>fora de línia</b>.",
|
||||||
|
"loading": "Carregant...",
|
||||||
|
"error": "Error",
|
||||||
|
"saved": "Desat",
|
||||||
|
"synced": "S'ha desat tot",
|
||||||
|
"deleted": "Document esborrat del vostre CryptDrive",
|
||||||
|
"deletedFromServer": "Document esborrat del servidor",
|
||||||
|
"mustLogin": "Cal que inicieu la sessió per accedir a aquesta pàgina",
|
||||||
|
"disabledApp": "Aquesta aplicació està dehabilitada. Per a més informació, contacteu l'administració d'aquest CryptPad.",
|
||||||
|
"realtime_unrecoverableError": "Hi ha hagut un error irreparable. Cliqueu D'acord per tornar a carregar la pàgina.",
|
||||||
|
"disconnected": "S'ha desconnectat",
|
||||||
|
"synchronizing": "Sincronitzant",
|
||||||
|
"reconnecting": "Reconnectant",
|
||||||
|
"typing": "Edició",
|
||||||
|
"initializing": "Inicialitzant...",
|
||||||
|
"forgotten": "Desplaçat a la brossa",
|
||||||
|
"errorState": "Error crític: {0}",
|
||||||
|
"lag": "Latència",
|
||||||
|
"readonly": "Només de lectura",
|
||||||
|
"anonymous": "Anònim",
|
||||||
|
"yourself": "Vós mateix/a",
|
||||||
|
"anonymousUsers": "persones editores anònimes",
|
||||||
|
"anonymousUser": "persona editora anònima",
|
||||||
|
"users": "Persones usuàries",
|
||||||
|
"and": "I",
|
||||||
|
"viewer": "persona lectora",
|
||||||
|
"viewers": "persones lectores",
|
||||||
|
"editor": "persona editora",
|
||||||
|
"editors": "persones editores",
|
||||||
|
"userlist_offline": "Esteu fora de línia, la llista de persones usuàries no està disponible.",
|
||||||
|
"language": "Llengua",
|
||||||
|
"comingSoon": "Ben aviat...",
|
||||||
|
"newVersion": "<b>S'ha actualitzat CryptPad!</b><br>Comproveu les novetats d'aquesta versió:<br><a href=\"https://github.com/xwiki-labs/cryptpad/releases/tag/{0}\" target=\"_blank\">Notes de la versió de CryptPad {0}</a>",
|
||||||
|
"upgrade": "Actualitzeu-vos",
|
||||||
|
"upgradeTitle": "Actualitzeu el vostre compte per obtenir més espai",
|
||||||
|
"upgradeAccount": "Actualitzeu el compte",
|
||||||
|
"MB": "MB",
|
||||||
|
"GB": "GB",
|
||||||
|
"KB": "KB",
|
||||||
|
"supportCryptpad": "Doneu suport a CryptPad",
|
||||||
|
"formattedMB": "{0} MB",
|
||||||
|
"formattedGB": "{0} GB",
|
||||||
|
"formattedKB": "{0} KB",
|
||||||
|
"greenLight": "Tot funciona correctament",
|
||||||
|
"orangeLight": "La vostra connexió és lenta i pot afectar el funcionament",
|
||||||
|
"redLight": "Us heu desconnectat de la sessió",
|
||||||
|
"pinLimitReached": "Heu arribat al límit del vostre emmagatzematge",
|
||||||
|
"pinLimitReachedAlert": "Heu arribat al límit del vostre espai. Els documents nous no es desaran al vostre CryptDrive.<br>Podeu eliminar documents del vostre CryptDrive o <a href=\"https://accounts.cryptpad.fr/#!on={0}\" target=\"_blank\">adquirir una oferta prèmium</a> per augmentar el vostre espai.",
|
||||||
|
"pinLimitReachedAlertNoAccounts": "Heu arribat al límit del vostre espai",
|
||||||
|
"pinLimitNotPinned": "Heu arribat al límit del vostre espai.<br>Aquest document no està desat al vostre CryptDrive.",
|
||||||
|
"pinLimitDrive": "Heu arribat al límit del vostre espai.<br>No podeu crear documents nous.",
|
||||||
|
"moreActions": "Més accions",
|
||||||
|
"importButton": "Importar",
|
||||||
|
"importButtonTitle": "Importar document des d'un fitxer local",
|
||||||
|
"exportButton": "Exportar",
|
||||||
|
"exportButtonTitle": "Exportar aquest document a un fitxer local",
|
||||||
|
"exportPrompt": "Com voleu anomenar el fitxer?",
|
||||||
|
"changeNamePrompt": "Canvieu el vostre nom (deixeu-ho en blanc per fer-lo anònim):· ",
|
||||||
|
"user_rename": "Canvieu el nom visible",
|
||||||
|
"user_displayName": "Nom visible",
|
||||||
|
"user_accountName": "Identificador",
|
||||||
|
"clickToEdit": "Cliqueu per editar",
|
||||||
|
"saveTitle": "Deseu el títol (Enter)",
|
||||||
|
"forgetButton": "Esborrar",
|
||||||
|
"forgetButtonTitle": "Moveu aquest document a la paperera",
|
||||||
|
"forgetPrompt": "Clicant D'acord, moureu aquest document a la paperera. Hi esteu d'acord?",
|
||||||
|
"movedToTrash": "Aquest document s'ha desplaçat a la paperera.<br><a href=\"/drive/\">Accedir a la meva Unitat</a>",
|
||||||
|
"shareButton": "Compartir",
|
||||||
|
"shareSuccess": "L'enllaç s'ha copiat al porta-retalls",
|
||||||
|
"userListButton": "Llista de persones usuàries",
|
||||||
|
"chatButton": "Xat",
|
||||||
|
"userAccountButton": "El vostre compte",
|
||||||
|
"newButton": "Nou/Nova",
|
||||||
|
"newButtonTitle": "Crea un nou document",
|
||||||
|
"uploadButton": "Carregar fitxers",
|
||||||
|
"uploadButtonTitle": "Carrega un fitxer nou a la carpeta actual",
|
||||||
|
"saveTemplateButton": "Desa com una plantilla",
|
||||||
|
"saveTemplatePrompt": "Trieu un títol per la plantilla",
|
||||||
|
"templateSaved": "Plantilla desada!",
|
||||||
|
"selectTemplate": "Escolliu una plantilla o premeu ESC",
|
||||||
|
"useTemplate": "Voleu començar amb una plantilla?",
|
||||||
|
"useTemplateOK": "Escolliu una plantilla (Enter)",
|
||||||
|
"useTemplateCancel": "Reinicieu (Esc)",
|
||||||
|
"template_import": "Importeu una plantilla",
|
||||||
|
"template_empty": "No hi ha plantilles disponibles",
|
||||||
|
"previewButtonTitle": "Mostra o amaga el mode de previsualització Markdown",
|
||||||
|
"presentButtonTitle": "Entra en el mode presentació",
|
||||||
|
"backgroundButtonTitle": "Canvieu el color de fons de la presentació",
|
||||||
|
"colorButtonTitle": "Canvieu el color del text en el mode presentació",
|
||||||
|
"propertiesButton": "Propietats",
|
||||||
|
"propertiesButtonTitle": "Mostra les propietats del document",
|
||||||
|
"printText": "Imprimeix",
|
||||||
|
"printButton": "Imprimeix (Enter)",
|
||||||
|
"printButtonTitle2": "Imprimeix el document o exporta'l com un fitxer PDF",
|
||||||
|
"printOptions": "Opcions de la compaginació",
|
||||||
|
"printSlideNumber": "Mostra el número de diapositiva",
|
||||||
|
"printDate": "Mostra la data",
|
||||||
|
"printTitle": "Mostra el títol del document",
|
||||||
|
"printCSS": "Normes d'estil personalitzades (CSS):",
|
||||||
|
"printTransition": "Activa les transicions animades",
|
||||||
|
"printBackground": "Utilitza una imatge de fons",
|
||||||
|
"printBackgroundButton": "Escolliu una imatge",
|
||||||
|
"printBackgroundValue": "<b>Fons actual:</b> <em>{0}</em>",
|
||||||
|
"printBackgroundNoValue": "<em>No es mostra cap imatge de fons</em>",
|
||||||
|
"printBackgroundRemove": "Suprimeix aquesta imatge de fons",
|
||||||
|
"filePickerButton": "Incrusta un fitxer desat al CryptDrive",
|
||||||
|
"filePicker_close": "Tanca",
|
||||||
|
"filePicker_description": "Trieu un fitxer del vostre CryptDrive per incrustar-lo o carregueu-ne un de nou",
|
||||||
|
"filePicker_filter": "Filtra els fitxers pel nom",
|
||||||
|
"or": "o",
|
||||||
|
"tags_title": "Etiquetes (només vostres)",
|
||||||
|
"tags_add": "Actualitza les etiquetes d'aquesta pàgina",
|
||||||
|
"tags_searchHint": "Inicieu una cerca amb # al vostre CryptDrive per trobar els vostres documents etiquetats.",
|
||||||
|
"tags_notShared": "Les vostres etiquetes no es comparteixen amb altres persones usuàries",
|
||||||
|
"tags_duplicate": "Etiquetes duplicades: {0}",
|
||||||
|
"tags_noentry": "No podeu etiquetar un document esborrat!",
|
||||||
|
"slideOptionsText": "Opcions",
|
||||||
|
"slideOptionsTitle": "Personalitzeu les vostres diapositives",
|
||||||
|
"slideOptionsButton": "Desa (Enter)",
|
||||||
|
"slide_invalidLess": "L'estil personalitzat no és vàlid",
|
||||||
|
"languageButton": "Llengua",
|
||||||
|
"languageButtonTitle": "Escolliu la llengua que voleu utilitzar per marcar la sintaxi",
|
||||||
|
"themeButton": "Tema",
|
||||||
|
"themeButtonTitle": "Escolliu el color del tema a utilitzar als editors de codi i diapositives",
|
||||||
|
"editShare": "Enllaç d'edició",
|
||||||
|
"editShareTitle": "Copia l'enllaç d'edició al porta-retalls",
|
||||||
|
"editOpen": "Obre l'enllaç d'edició en una perstanya nova",
|
||||||
|
"editOpenTitle": "Obre aquest document en mode \"edició\" en una pestanya nova",
|
||||||
|
"viewShare": "Enllaç només de lectura",
|
||||||
|
"viewShareTitle": "Copia l'enllaç només de lectura al porta-retalls",
|
||||||
|
"viewOpen": "Obre l'enllaç només de lectura en una pestanya nova",
|
||||||
|
"viewOpenTitle": "Obre aquest document en mode només de lectura en una pestanya nova",
|
||||||
|
"fileShare": "Copia l'enllaç",
|
||||||
|
"getEmbedCode": "Obté el codi d'incrustat",
|
||||||
|
"viewEmbedTitle": "Inscrusta el document en una pàgina externa",
|
||||||
|
"viewEmbedTag": "Per incrustar aquest document, poseu aquest iframe allà on vulgueu de la vostra pàgina. Podeu donar-li l'estil desitjat utilitzant els atributs CSS o HTML.",
|
||||||
|
"fileEmbedTitle": "Incrusta el fitxer en una pàgina externa",
|
||||||
|
"fileEmbedScript": "Per incrustar aquest fitxer, poseu aquest script un cop a la vostra pàgina per carregar l'Etiqueta Multimèdia:",
|
||||||
|
"fileEmbedTag": "Llavors, col·loqueu aquesta Etiqueta Multimèdia al lloc vulgueu incrustar-lo de la vostra pàgina:",
|
||||||
|
"notifyJoined": "{0} s'ha unit a la sessió col·laborativa",
|
||||||
|
"notifyRenamed": "{0} es coneix ara com {1}",
|
||||||
|
"notifyLeft": "{0} ha deixat la sessió col·laborativa",
|
||||||
|
"ok": "D'acord",
|
||||||
|
"okButton": "D'acord (Enter)",
|
||||||
|
"cancel": "Cancel·la",
|
||||||
|
"cancelButton": "Cancel·la (Esc)",
|
||||||
|
"doNotAskAgain": "No ho preguntis més (Esc)",
|
||||||
|
"show_help_button": "Mostra l'ajuda",
|
||||||
|
"hide_help_button": "Amaga l'ajuda",
|
||||||
|
"help_button": "Ajuda",
|
||||||
|
"historyText": "Historial",
|
||||||
|
"historyButton": "Mostra l'historial del document",
|
||||||
|
"history_next": "La versió més nova",
|
||||||
|
"history_prev": "La versió més antiga",
|
||||||
|
"history_loadMore": "Carrega més historial",
|
||||||
|
"history_closeTitle": "Tanca l'historial",
|
||||||
|
"history_restoreTitle": "Restaura la versió seleccionada del document",
|
||||||
|
"history_restorePrompt": "Segur que voleu reemplaçar la versió actual del document per la que es mostra?",
|
||||||
|
"history_restoreDone": "S'ha restaurat el document",
|
||||||
|
"history_version": "Versió:",
|
||||||
|
"openLinkInNewTab": "Obre l'enllaç en una pestanya nova",
|
||||||
|
"pad_mediatagTitle": "Configuració de l'Etiqueta Multimèdia",
|
||||||
|
"pad_mediatagWidth": "Amplada (px)",
|
||||||
|
"pad_mediatagHeight": "Alçada (px)",
|
||||||
|
"pad_mediatagRatio": "Mantenir la proporció",
|
||||||
|
"pad_mediatagBorder": "Amplada de la vora (px)",
|
||||||
|
"pad_mediatagPreview": "Previsualització",
|
||||||
|
"pad_mediatagImport": "Deseu-ho al vostre CryptDrive",
|
||||||
|
"pad_mediatagOptions": "Propietats de la imatge",
|
||||||
|
"kanban_newBoard": "Taulell nou",
|
||||||
|
"kanban_item": "Element {0}",
|
||||||
|
"kanban_todo": "A fer",
|
||||||
|
"kanban_done": "Completes",
|
||||||
|
"kanban_working": "En procés",
|
||||||
|
"kanban_deleteBoard": "De debò voleu eliminar aquest taulell?",
|
||||||
|
"kanban_addBoard": "Afegeix un taulell",
|
||||||
|
"kanban_removeItem": "Suprimeix aquest element",
|
||||||
|
"kanban_removeItemConfirm": "De debò voleu esborrar aquest element?",
|
||||||
|
"poll_title": "Sense saber-ne Selector de data",
|
||||||
|
"poll_subtitle": "Sense saber-ne, planificació a <em>temps real</em>",
|
||||||
|
"poll_p_save": "La vostra configuració es carrega instantàniament, per tant, mai us caldrà desar-la.",
|
||||||
|
"poll_p_encryption": "Tot el que introduïu s'encripta pel que només les persones que tenen l'enllaç poden accedir-hi. Fins i tot el servidor no pot veure el que canvieu.",
|
||||||
|
"wizardLog": "Cliqueu el botó de dalt a l'esquerra per tornar a l'enquesta",
|
||||||
|
"wizardTitle": "Utilitzeu l'assistent per crear la vostra enquesta",
|
||||||
|
"wizardConfirm": "Esteu a punt per afegir aquestes opcions a l'enquesta?",
|
||||||
|
"poll_publish_button": "Publica",
|
||||||
|
"poll_admin_button": "Administra",
|
||||||
|
"poll_create_user": "Afegeix una persona",
|
||||||
|
"poll_create_option": "Afegeix una opció",
|
||||||
|
"poll_commit": "Envia",
|
||||||
|
"poll_closeWizardButton": "Tanca l'assistent",
|
||||||
|
"poll_closeWizardButtonTitle": "Tanca l'assistent",
|
||||||
|
"poll_wizardComputeButton": "Computa les opcions",
|
||||||
|
"poll_wizardClearButton": "Buida la taula",
|
||||||
|
"poll_wizardDescription": "Crea automàticament una quantitat d'opcions, introduint qualsevol nombre de segments de dates i hores",
|
||||||
|
"poll_wizardAddDateButton": "+ Dates",
|
||||||
|
"poll_wizardAddTimeButton": "+ Hores",
|
||||||
|
"poll_optionPlaceholder": "Opció",
|
||||||
|
"poll_userPlaceholder": "El vostre nom",
|
||||||
|
"poll_removeOption": "De debò voleu suprimir aquesta opció?",
|
||||||
|
"poll_removeUser": "De debò voleu suprimir aquesta persona?",
|
||||||
|
"poll_titleHint": "Títol",
|
||||||
|
"poll_descriptionHint": "Descriviu la vostra enquesta i utilitzeu el botó ✓ (publica) quan ho hàgiu enllestit.\nLa descripció es pot escriure ustilitzant la sintaxi Markdown i podeu incrustar-hi elements multimèdia des del vostre CryptDrive.\nQualsevol persona que tingui l'enllaç pot canviar la descripció, però això es descoratjador.",
|
||||||
|
"poll_remove": "Suprimeix",
|
||||||
|
"poll_edit": "Edita",
|
||||||
|
"poll_locked": "Blocat",
|
||||||
|
"poll_unlocked": "Desblocat",
|
||||||
|
"poll_bookmark_col": "Destaqueu aquesta columna per a què, des del principi, la tingueu sempre desblocada i a la vista",
|
||||||
|
"poll_bookmarked_col": "Aquesta és la vostra columna destacada. Des del principi sempre la tindreu desblocada i a la vista.",
|
||||||
|
"poll_total": "TOTAL",
|
||||||
|
"poll_comment_list": "Comentaris",
|
||||||
|
"poll_comment_add": "Afegiu un comentari",
|
||||||
|
"poll_comment_submit": "Envia",
|
||||||
|
"poll_comment_remove": "Esborra aquest comentari",
|
||||||
|
"poll_comment_placeholder": "El vostre comentari",
|
||||||
|
"poll_comment_disabled": "Publiqueu aquesta enquesta utilitzant el botó ✓ per habilitar els comentaris.",
|
||||||
|
"oo_reconnect": "La connexió amb el servidor ha caigut. Cliqueu D'acord per tornar a carregar la pàgina i continuar amb l'edició.",
|
||||||
|
"oo_cantUpload": "No està permesa la càrrega mentre hi hagi altres persones presents.",
|
||||||
|
"oo_uploaded": "S'ha completat la vostra càrrega. Cliqueu D'acord per tornar a carregar la pàgina o Cancel·la per continuar en el mode només de lectura.",
|
||||||
|
"canvas_clear": "Neteja",
|
||||||
|
"canvas_delete": "Esborra la selecció",
|
||||||
|
"canvas_disable": "Deshabilita el dibuix",
|
||||||
|
"canvas_enable": "Habilita el dibuix",
|
||||||
|
"canvas_width": "Amplada",
|
||||||
|
"canvas_opacity": "Transparència",
|
||||||
|
"canvas_opacityLabel": "Transparència: {0}",
|
||||||
|
"canvas_widthLabel": "Amplada: {0}",
|
||||||
|
"canvas_saveToDrive": "Deseu aquesta imatge com un fitxer al vostre CryptDrive",
|
||||||
|
"canvas_currentBrush": "Pinzell actual",
|
||||||
|
"canvas_chooseColor": "Trieu un color",
|
||||||
|
"canvas_imageEmbed": "Incrusteu una imatge des del vostre dispositiu",
|
||||||
|
"profileButton": "Perfil",
|
||||||
|
"profile_urlPlaceholder": "Adreça URL",
|
||||||
|
"profile_namePlaceholder": "Nom visible en el vostre perfil",
|
||||||
|
"profile_avatar": "Avatar",
|
||||||
|
"profile_upload": " Carregueu un nou avatar",
|
||||||
|
"profile_uploadSizeError": "Error: l'avatar cal que sigui més petit que {0}",
|
||||||
|
"profile_uploadTypeError": "Error: el tipus d'avatar no està permès. Els tipus permesos són: {0}",
|
||||||
|
"profile_error": "Hi ha hagut un error mentre es creava el vostre perfil: {0}",
|
||||||
|
"profile_register": "Cal que us registreu per crear un perfil!",
|
||||||
|
"profile_create": "Crea un perfil",
|
||||||
|
"profile_description": "Descripció",
|
||||||
|
"profile_fieldSaved": "S'ha desat un nou valor: {0}",
|
||||||
|
"profile_viewMyProfile": "Veure el meu perfil",
|
||||||
|
"userlist_addAsFriendTitle": "Envia una sol·licitud de contacte a {0}",
|
||||||
|
"contacts_title": "Contactes",
|
||||||
|
"contacts_addError": "Hi ha hagut un error mentre s'afegia aquest contacte a la llista",
|
||||||
|
"contacts_added": "Invitació de contacte acceptada.",
|
||||||
|
"contacts_rejected": "Invitació de contacte rebutjada",
|
||||||
|
"contacts_request": "<em>{0}</em> vol afegir-vos com a contacte. <b>Ho accepteu<b>?",
|
||||||
|
"contacts_send": "Envia",
|
||||||
|
"contacts_remove": "Suprimeix aquest contacte",
|
||||||
|
"contacts_confirmRemove": "De debò voleu suprimir <em>{0}</em> dels vostres contactes?",
|
||||||
|
"contacts_typeHere": "Escriviu un missatge aquí...",
|
||||||
|
"contacts_warning": "Qualsevol cosa que escriviu aquí, restarà disponible per qualsevol persona usuària d'aquest document. Aneu en compte amb la informació sensible!",
|
||||||
|
"contacts_padTitle": "Xat",
|
||||||
|
"contacts_info1": "Aquests són els vostres contactes. Des d'aquí podeu:",
|
||||||
|
"contacts_info2": "Cliqueu la icona del contacte que vulgueu per xatejar-hi",
|
||||||
|
"contacts_info3": "Feu doble clic la seva icona per veure el seu perfil",
|
||||||
|
"contacts_info4": "Qualsevol de les persones participants pot fer neteja permanent de l'hitorial de xat",
|
||||||
|
"contacts_removeHistoryTitle": "Neteja l'historial del xat",
|
||||||
|
"contacts_confirmRemoveHistory": "De debò voleu suprimir permanentment el vostre historial de xat? Les dades no es podran restaurar",
|
||||||
|
"contacts_removeHistoryServerError": "Hi ha hagut un error mentre es suprimia el vostre historial del xat. Torneu-ho a provar",
|
||||||
|
"contacts_fetchHistory": "Recupera l'historial antic",
|
||||||
|
"contacts_friends": "Amistats",
|
||||||
|
"contacts_rooms": "Sales",
|
||||||
|
"contacts_leaveRoom": "Deixa aquesta sala",
|
||||||
|
"contacts_online": "En aquesta sala hi ha una altra persona en línia",
|
||||||
|
"debug_getGraph": "Aconseguiu el codi per generar una gràfica d'aquest document",
|
||||||
|
"debug_getGraphWait": "Generant la gràfica... Si us plau, espereu.",
|
||||||
|
"debug_getGraphText": "Aquest és el codi DOT per generar una gràfica de l'historial d'aquest document:",
|
||||||
|
"fm_rootName": "Documents",
|
||||||
|
"fm_trashName": "Paperera",
|
||||||
|
"fm_unsortedName": "Fitxers desordenats",
|
||||||
|
"fm_filesDataName": "Tots els fitxers",
|
||||||
|
"fm_templateName": "Plantilles",
|
||||||
|
"fm_searchName": "Cerca",
|
||||||
|
"fm_recentPadsName": "Documents recents",
|
||||||
|
"fm_ownedPadsName": "Propi",
|
||||||
|
"fm_tagsName": "Etiquetes",
|
||||||
|
"fm_sharedFolderName": "Carpeta compartida",
|
||||||
|
"fm_searchPlaceholder": "Cercant...",
|
||||||
|
"fm_newButton": "Nou",
|
||||||
|
"fm_newButtonTitle": "Crea un nou document o carpeta, importa un fitxer a la carpeta actual",
|
||||||
|
"fm_newFolder": "Carpeta nova",
|
||||||
|
"fm_newFile": "Document de text nou",
|
||||||
|
"fm_folder": "Carpeta",
|
||||||
|
"fm_sharedFolder": "Carpeta compartida",
|
||||||
|
"fm_folderName": "Nom de la carpeta",
|
||||||
|
"fm_numberOfFolders": "# de carpetes",
|
||||||
|
"fm_numberOfFiles": "# de fitxers",
|
||||||
|
"fm_fileName": "Nom de fitxer",
|
||||||
|
"fm_title": "Títol",
|
||||||
|
"fm_type": "Tipus",
|
||||||
|
"fm_lastAccess": "Darrer accés",
|
||||||
|
"fm_creation": "Creat/da",
|
||||||
|
"fm_forbidden": "Acció prohibida",
|
||||||
|
"fm_originalPath": "Camí original",
|
||||||
|
"fm_openParent": "Veure a la carpeta",
|
||||||
|
"fm_noname": "Document sense títol",
|
||||||
|
"fm_emptyTrashDialog": "De debò voleu buidar la paperera?",
|
||||||
|
"fm_removeSeveralPermanentlyDialog": "De debò voleu suprimir permanentment aquests {0} elements del vostre CryptDrive?",
|
||||||
|
"fm_removePermanentlyNote": "Si continueu, els vostres propis documents se suprimiran del servidor.",
|
||||||
|
"fm_removePermanentlyDialog": "De debò voleu suprimir permanentment aquest element del vostre CryptDrive?",
|
||||||
|
"fm_removeSeveralDialog": "De debò voleu desplaçar permanentment aquests {0} elements a la paperera?",
|
||||||
|
"fm_removeDialog": "De debò voleu desplaçar {0} a la paperera?",
|
||||||
|
"fm_deleteOwnedPad": "De debò voleu suprimir permanentment aquest document del servidor?",
|
||||||
|
"fm_deleteOwnedPads": "De debò voleu suprimir permanentment aquests documents del servidor?",
|
||||||
|
"fm_restoreDialog": "De debò voleu restaurar {0} a la seva ubicació prèvia?",
|
||||||
|
"fm_unknownFolderError": "La carpeta visitada o seleccionada ja no existeix. Obrint la carpeta superior...",
|
||||||
|
"fm_contextMenuError": "No es pot obrir el menú contextual d'aquest element. Si el problema continua, proveu de tornar a carregar la pàgina.",
|
||||||
|
"fm_selectError": "No es pot seleccionar l'element objectiu. Si el problema continua, proveu de tornar a carregar la pàgina.",
|
||||||
|
"fm_categoryError": "No es pot obrir la categoria seleccionada, mostrant l'arrel.",
|
||||||
|
"fm_info_root": "Creeu aquí tantes carpetes imbrincades com vulgueu per ordenar els vostres fitxers.",
|
||||||
|
"fm_info_unsorted": "Conté tots els fitxers que heu visitat i que encara no estan ordenats, a \"Documents\" o desplaçats a la \"Paperera\".",
|
||||||
|
"fm_info_template": "Conté tots els documents desats com plantilles i que podeu reutilitzar quan vulgueu crear un nou document.",
|
||||||
|
"fm_info_recent": "Llista els documents modificats o oberts recentment.",
|
||||||
|
"fm_info_trash": "Buideu la paperera per alliberar espai al vostre CryptDrive.",
|
||||||
|
"fm_info_allFiles": "Conté tots els fitxers de \"Documents\", \"Desordenats\" i \"Paperera\". No podeu desplaçar o suprimir fitxers des d'aquí.",
|
||||||
|
"fm_info_anonymous": "No heu iniciat la sessió, per tant, els vostres documents caducaran d'aquí a 3 mesos (<a href=\"https://blog.cryptpad.fr/2017/05/17/You-gotta-log-in/\" target=\"_blank\">saber-ne més</a>). Es desen al vostre navegador, per tant, si netegeu el vostre historial podríeu perdre'ls.<br><a href=\"/register/\">Registreu-vos</a> o <a href=\"/login/\">Inicieu la sessió</a> per mantenir-los accessibles.<br>",
|
||||||
|
"fm_info_sharedFolder": "Aquesta és una carpeta compartida. No heu iniciat cap sessió, pel que només podeu accedir en mode només de lectura.<br><a href=\"/register/\">Registreu-vos</a> o <a href=\"/login/\">Inicieu la sessió</a> per poder importar-ho al vostre CryptDrive i modificar-ho.",
|
||||||
|
"fm_info_owned": "Es documents que es mostren són de la vostra propietat. Això vol dir que podeu eliminar-los permanentment del servidor quan vulgueu. Si ho feu, la resta de persones no podran accedir-hi mai més.",
|
||||||
|
"fm_alert_backupUrl": "Enllaç de còpia de seguretat d'aquesta unitat.<br>És <strong>altament recomanat</strong> que el manteniu en secret.<br>Podeu utilitzar-lo per recuperar tots els vostres fitxers en el cas que la memòria del vostre navegador sigui esborrada.<br>Qualsevol persona que tingui l'enllaç pot editar o suprimir tots els fitxers en el vostre gestor de fitxers.<br>",
|
||||||
|
"fm_alert_anonymous": "Hola, esteu utilitzant CryptPad de forma anònima. Ja està bé, però els vostres documents poden perdre's després d'un temps d'inactivitat. Hem deshabilitat les funcions avançades de la unitat pels comptes anònims perquè volem deixar clar que aquest no és un lloc segur on desar res. Podeu <a href=\"https://blog.cryptpad.fr/2017/05/17/You-gotta-log-in/\" target=\"_blank\">conèixer més</a> sobre per què fem això i per què hauríeu de <a href=\"/register/\">Registrar-vos</a> i <a href=\"/login/\">Iniciar sessió</a>.",
|
||||||
|
"fm_backup_title": "Enllaç de còpia de seguretat",
|
||||||
|
"fm_nameFile": "Com voldreu anomenar aquest fitxer?",
|
||||||
|
"fm_error_cantPin": "Error intern del servidor. Si us plau, torneu a garregar la pàgina i torneu a provar-ho.",
|
||||||
|
"fm_viewListButton": "Vista de llista",
|
||||||
|
"fm_viewGridButton": "Vista de graella",
|
||||||
|
"fm_renamedPad": "Heu establert un nom personalitzat per aquest document. El seu títol compartit és:<br><b>{0}</b>",
|
||||||
|
"fm_canBeShared": "Podeu compartir aquesta carpeta",
|
||||||
|
"fm_prop_tagsList": "Etiquetes",
|
||||||
|
"fm_burnThisDriveButton": "Esborra tota la informació desada per CryptPad al vostre navegador",
|
||||||
|
"fm_burnThisDrive": "De debò voleu suprimir tot el que CryptPad ha desat al vostre navegador?<br>Això suprimirà el vostre CryptDrive i el seu historial ubicat al navegador, però els vostres documents continuaran existint (encriptats) en el nostre servidor.",
|
||||||
|
"fm_padIsOwned": "Aquest document és de la vostra propietat",
|
||||||
|
"fm_padIsOwnedOther": "Aquest document és propietat d'una altra persona",
|
||||||
|
"fm_deletedPads": "Aquests documents deixaran d'existir al servidor, es suprimiran del vostre CryptDrive: {0}",
|
||||||
|
"fm_tags_name": "Nom d'etiqueta",
|
||||||
|
"fm_tags_used": "Nombre d'usos",
|
||||||
|
"fm_restoreDrive": "Reconfigura la vostra unitat a un estat anterior. Per uns bons resultats, eviteu fer canvis a la unitat fins que el procés s'hagi completat.",
|
||||||
|
"fm_moveNestedSF": "No podeu col·locar una carpeta compartida dins d'una altra. La carpeta {0} no s'ha desplaçat.",
|
||||||
|
"fm_passwordProtected": "Aquest document està protegit amb contrasenya",
|
||||||
|
"fc_newfolder": "Carpeta nova",
|
||||||
|
"fc_newsharedfolder": "Carpeta compartida nova",
|
||||||
|
"fc_rename": "Reanomena",
|
||||||
|
"fc_open": "Obre",
|
||||||
|
"fc_open_ro": "Obre (només de lectura)",
|
||||||
|
"fc_delete": "Desplaça a la paperera",
|
||||||
|
"fc_delete_owned": "Elimina del servidor",
|
||||||
|
"fc_restore": "Restaura",
|
||||||
|
"fc_remove": "Suprimeix del vostre CryptDrive",
|
||||||
|
"fc_remove_sharedfolder": "Suprimeix",
|
||||||
|
"fc_empty": "Buida la paperera",
|
||||||
|
"fc_prop": "Propietats",
|
||||||
|
"fc_hashtag": "Etiquetes",
|
||||||
|
"fc_sizeInKilobytes": "Mida en kilobytes",
|
||||||
|
"fo_moveUnsortedError": "No podeu desplaçar una carpeta a la llista de plantilles",
|
||||||
|
"fo_existingNameError": "El nom ja existeix en aquesta carpeta. Si us plau, trieu un altre.",
|
||||||
|
"fo_moveFolderToChildError": "No podeu desplaçar una carpeta dins d'una de les seves descendents",
|
||||||
|
"fo_unableToRestore": "No podeu restaurar aquest fitxer a la seva ubicació original. Podeu provar de desplaçar-lo a una unova ubicació.",
|
||||||
|
"fo_unavailableName": "Ja existeix un fitxer o carpeta amb el mateix nom a la ubicació nova. Reanomeneu l'element i proveu-ho un altre cop.",
|
||||||
|
"fs_migration": "El vostre CryptDrive s'ha actualitzat a una nova versió. Com a resultat, la pàgina actual s'ha de tornar a carregar.<br><strong>Si us plau, torneu a carregar la pàgina per seguir utilitzant-la.</strong>",
|
||||||
|
"login_login": "Inicia la sessió",
|
||||||
|
"login_makeAPad": "Crea un document anònimament",
|
||||||
|
"login_nologin": "Veure els documents locals",
|
||||||
|
"login_register": "Registra",
|
||||||
|
"logoutButton": "Tanca la sessió",
|
||||||
|
"settingsButton": "Configuració",
|
||||||
|
"login_username": "Identificador personal",
|
||||||
|
"login_password": "Contrasenya",
|
||||||
|
"login_confirm": "Confirmeu la contrasenya",
|
||||||
|
"login_remember": "Recordeu-me",
|
||||||
|
"login_hashing": "Realitzant la funció resum a la contrasenya, pot portar una bona estona.",
|
||||||
|
"login_hello": "Hola {0},",
|
||||||
|
"login_helloNoName": "Hola,",
|
||||||
|
"login_accessDrive": "Accediu a la vostra unitat",
|
||||||
|
"login_orNoLogin": "o",
|
||||||
|
"login_noSuchUser": "L'identificador o la contrasenya no són vàlids. Torneu-ho a provar o registreu-vos",
|
||||||
|
"login_invalUser": "Cal introduir l'identificador",
|
||||||
|
"login_invalPass": "Cal introduir la contrasenya",
|
||||||
|
"login_unhandledError": "Hi ha hagut un error inesperat :(",
|
||||||
|
"register_importRecent": "Importeu els documents de la vostra sessió anònima",
|
||||||
|
"register_acceptTerms": "Accepto les <a href='/terms.html' tabindex='-1'>condicions del servei</a>",
|
||||||
|
"register_passwordsDontMatch": "Les contrasenyes no coincideixen!",
|
||||||
|
"register_passwordTooShort": "Les contrasenyes han de tenir, com a mínim, {0} caràcters.",
|
||||||
|
"register_mustAcceptTerms": "Cal que accepteu les condicions del servei.",
|
||||||
|
"register_mustRememberPass": "No podem restablir la contrasenya si l'oblideu. És molt important que la recordeu! Marqueu la casella per confirmar que ho enteneu.",
|
||||||
|
"register_whyRegister": "Per què cal registrar-se?",
|
||||||
|
"register_header": "Us donem la benvinguda a CryptPad",
|
||||||
|
"register_explanation": "<h3>Abans de començar, veurem algunes coses:</h3><ul class='list-unstyled'><li><i class='fa fa-info-circle'></i>La contrasenya és la clau secreta que encripta tots els vostres documents. Si la perdeu, no hi ha manera de recuperar les vostres dades.</li><li><i class='fa fa-info-circle'></i>Podeu importar documents que hàgiu vist al vostre navegador per tenir-los al vostre compte.</li><li><i class='fa fa-info-circle'></i>Si utilitzeu un ordinador compartit, cal que tanqueu la sessió quan acabeu de treballar, tancar la pestanya no és suficient.</li></ul>",
|
||||||
|
"register_writtenPassword": "He introduït el meu identificador i la contrasenya, continua",
|
||||||
|
"register_cancel": "Torna",
|
||||||
|
"register_warning": "Sense Rastre significa que no podem recuperar les vostres dades si perdeu o oblideu la vostra contrasenya.",
|
||||||
|
"register_alreadyRegistered": "Aquest identificador ja existeix, voleu iniciar la sessió?",
|
||||||
|
"settings_cat_account": "Compte",
|
||||||
|
"settings_cat_drive": "CryptDrive",
|
||||||
|
"settings_cat_cursor": "Cursor",
|
||||||
|
"settings_cat_code": "Codi",
|
||||||
|
"settings_cat_pad": "Text enriqu¡t",
|
||||||
|
"settings_cat_creation": "Nou document",
|
||||||
|
"settings_cat_subscription": "Subscripció",
|
||||||
|
"settings_title": "Configuració",
|
||||||
|
"settings_save": "Desa",
|
||||||
|
"settings_backupCategory": "Còpia de seguretat",
|
||||||
|
"settings_backupHint": "Deseu o recupereu tot el contingut del vostre CryptDrive. No es desarà el contingut dels vostres documents, només les claus per accedir-hi.",
|
||||||
|
"settings_backup": "Còpia de seguretat",
|
||||||
|
"settings_restore": "Recupera",
|
||||||
|
"settings_backupHint2": "Descarregueu el contingut actual de tots els vostres documents. Els documents es descarregaran en un format llegible, sempre que el format estigui disponible.",
|
||||||
|
"settings_backup2": "Descarrega el meu CryptDrive",
|
||||||
|
"settings_backup2Confirm": "Això descarregarà tots els documents i fitxers des del vostre CryptDrive. Si voleu continuar, seleccioneu un nom i premeu D'acord",
|
||||||
|
"settings_exportTitle": "Exporta el vostre CryptDrive",
|
||||||
|
"settings_exportDescription": "Si us plau, espereu mentre descarreguem i desencriptem els vostres documents. Pots durar uns minuts. Tanqueu aquesta pestanya si voleu interrompre el procés.",
|
||||||
|
"settings_exportFailed": "Si un document necessita més d'1 minut per descarregar-se, no s'inclourà a l'exportació. Es mostrarà un enllaç amb qualsevol document que no s'hagi exportat.",
|
||||||
|
"settings_exportWarning": "Nota: aquesta eina està en versió beta i pot donar problemes d'escalabilitat. Per un millor rendiment, es recomana no canviar de pestanya.",
|
||||||
|
"settings_exportCancel": "De debò voleu cancel·lar l'exportació? El pròxim cop haureu de tornar a començar des del principi.",
|
||||||
|
"settings_export_reading": "Estem llegint el vostre CryptDrive...",
|
||||||
|
"settings_export_download": "Estem descarregant i desencriptant els vostres documents...",
|
||||||
|
"settings_export_compressing": "Comprimint les dades...",
|
||||||
|
"settings_export_done": "La vostra descàrrega està llesta!",
|
||||||
|
"settings_exportError": "Veure els errors",
|
||||||
|
"settings_exportErrorDescription": "No podem afegir els següents documents a l'exportació:",
|
||||||
|
"settings_exportErrorEmpty": "Aquest document no es pot exportar (és buit o el contingut no és vàlid).",
|
||||||
|
"settings_exportErrorMissing": "Aquest document ha desaparegut dels nostres servidors (ha caducat o ha estat esborrat per la persona propietària)",
|
||||||
|
"settings_exportErrorOther": "Hi ha hagut un error mentre s'intentava exportar aquest document: {0}",
|
||||||
|
"settings_resetNewTitle": "Neteja CryptDrive",
|
||||||
|
"settings_resetButton": "Suprimeix",
|
||||||
|
"settings_reset": "Suprimeix tots els fitxers i carpetes del vostre CryptDrive",
|
||||||
|
"settings_resetPrompt": "Aquesta acció suprimirà tots els documents de la vostra unitat.<br>De debò voleu continuar?<br>Introduïu \"<em>M'agrada CryptPad</em>\" per confirmar-ho.",
|
||||||
|
"settings_resetDone": "S'ha buidat la vostra unitat!",
|
||||||
|
"settings_resetError": "Text de verificació incorrecte. El vostre CryptDrive no s'ha modificat.",
|
||||||
|
"settings_resetTipsAction": "Restableix",
|
||||||
|
"settings_resetTips": "Consells",
|
||||||
|
"settings_resetTipsButton": "Restabliu els consells disponibles al CryptDrive",
|
||||||
|
"settings_resetTipsDone": "Ara els consells tornen a ser visibles.",
|
||||||
|
"settings_thumbnails": "Miniatures",
|
||||||
|
"settings_disableThumbnailsAction": "Deshabilita la creació de miniatures al CryptDrive",
|
||||||
|
"settings_disableThumbnailsDescription": "Les miniatures es creen i es desen automàticament al vostre navegador quan visiteu un nou document. Podeu deshabilitar aquesta funció des d'aquí.",
|
||||||
|
"settings_resetThumbnailsAction": "Neteja",
|
||||||
|
"settings_resetThumbnailsDescription": "Neteja totes les miniatures desades al navegador.",
|
||||||
|
"settings_resetThumbnailsDone": "S'han esborrat totes les miniatures.",
|
||||||
|
"settings_importTitle": "Importa aquests documents del navegador al CryptDrive",
|
||||||
|
"settings_import": "Importa",
|
||||||
|
"settings_importConfirm": "De debò voleu importar els documents recents des del navegador al vostre compte de CryptDrive?",
|
||||||
|
"settings_importDone": "S'ha acabat la importació",
|
||||||
|
"settings_autostoreTitle": "Emmagatzematge de documents a CryptDrive",
|
||||||
|
"edit": "Edita",
|
||||||
|
"autostore_sf": "Carpeta"
|
||||||
|
}
|
@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,8 @@
|
|||||||
|
@import (reference) '../../customize/src/less2/include/colortheme-all.less';
|
||||||
|
@import (reference) '../../customize/src/less2/include/tippy.less';
|
||||||
|
@import (reference) '../../customize/src/less2/include/share.less';
|
||||||
|
|
||||||
|
&.cp-app-share {
|
||||||
|
.tippy_main();
|
||||||
|
.share_main();
|
||||||
|
}
|
@ -0,0 +1,29 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html style="height: 100%; background: transparent;">
|
||||||
|
<head>
|
||||||
|
<meta content="text/html; charset=utf-8" http-equiv="content-type"/>
|
||||||
|
<script async data-bootload="/share/inner.js" data-main="/common/sframe-boot.js?ver=1.6" src="/bower_components/requirejs/require.js?ver=2.3.5"></script>
|
||||||
|
<style>
|
||||||
|
.loading-hidden { display: none; }
|
||||||
|
body #cp-loading {
|
||||||
|
display: none;
|
||||||
|
position: absolute;
|
||||||
|
top: 15vh;
|
||||||
|
bottom: 15vh;
|
||||||
|
left: 10vw;
|
||||||
|
right: 10vw;
|
||||||
|
z-index: 200000;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
body #cp-loading .cp-loading-container {
|
||||||
|
margin-top: 35vh;
|
||||||
|
}
|
||||||
|
body #cp-loading .cp-loading-cryptofist {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body class="cp-app-share" style="background: transparent;">
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
@ -0,0 +1,83 @@
|
|||||||
|
define([
|
||||||
|
'jquery',
|
||||||
|
'/bower_components/nthen/index.js',
|
||||||
|
'/common/sframe-common.js',
|
||||||
|
'/common/common-ui-elements.js',
|
||||||
|
'/common/common-interface.js',
|
||||||
|
|
||||||
|
'css!/bower_components/bootstrap/dist/css/bootstrap.min.css',
|
||||||
|
'css!/bower_components/components-font-awesome/css/font-awesome.min.css',
|
||||||
|
'less!/share/app-share.less',
|
||||||
|
], function (
|
||||||
|
$,
|
||||||
|
nThen,
|
||||||
|
SFCommon,
|
||||||
|
UIElements,
|
||||||
|
UI)
|
||||||
|
{
|
||||||
|
var APP = window.APP = {};
|
||||||
|
|
||||||
|
var andThen = function (common) {
|
||||||
|
var metadataMgr = common.getMetadataMgr();
|
||||||
|
var sframeChan = common.getSframeChannel();
|
||||||
|
|
||||||
|
var hideShareDialog = function () {
|
||||||
|
sframeChan.event('EV_SHARE_CLOSE');
|
||||||
|
};
|
||||||
|
|
||||||
|
var createShareDialog = function (data) {
|
||||||
|
var priv = metadataMgr.getPrivateData();
|
||||||
|
var hashes = priv.hashes;
|
||||||
|
var origin = priv.origin;
|
||||||
|
var pathname = priv.pathname;
|
||||||
|
var f = (data && data.file) ? UIElements.createFileShareModal
|
||||||
|
: UIElements.createShareModal;
|
||||||
|
|
||||||
|
var friends = common.getFriends();
|
||||||
|
|
||||||
|
var modal = f({
|
||||||
|
origin: origin,
|
||||||
|
pathname: pathname,
|
||||||
|
hashes: hashes,
|
||||||
|
common: common,
|
||||||
|
title: data.title,
|
||||||
|
friends: friends,
|
||||||
|
onClose: function () {
|
||||||
|
hideShareDialog();
|
||||||
|
},
|
||||||
|
fileData: {
|
||||||
|
hash: hashes.fileHash,
|
||||||
|
password: priv.password
|
||||||
|
}
|
||||||
|
});
|
||||||
|
UI.findCancelButton().click();
|
||||||
|
UI.openCustomModal(UI.dialog.tabs(modal), {
|
||||||
|
wide: Object.keys(friends).length !== 0
|
||||||
|
});
|
||||||
|
};
|
||||||
|
sframeChan.on('EV_SHARE_REFRESH', function (data) {
|
||||||
|
createShareDialog(data);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
var main = function () {
|
||||||
|
var common;
|
||||||
|
|
||||||
|
nThen(function (waitFor) {
|
||||||
|
$(waitFor(function () {
|
||||||
|
UI.removeLoadingScreen();
|
||||||
|
}));
|
||||||
|
SFCommon.create(waitFor(function (c) { APP.common = common = c; }));
|
||||||
|
}).nThen(function (/*waitFor*/) {
|
||||||
|
var metadataMgr = common.getMetadataMgr();
|
||||||
|
if (metadataMgr.getMetadataLazy() !== 'uninitialized') {
|
||||||
|
andThen(common);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
metadataMgr.onChange(function () {
|
||||||
|
andThen(common);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
main();
|
||||||
|
});
|
Loading…
Reference in New Issue