merge 4.0 branch release into offline prototype

This commit is contained in:
ansuz 2021-01-22 17:22:01 +05:30
commit f714275cd3
90 changed files with 2077 additions and 2359 deletions

1
.gitignore vendored
View file

@ -8,6 +8,7 @@ customization
.*.swp
*.db
/customize/
customize
messages.log
.DS_Store
www/scratch

View file

@ -1,3 +1,82 @@
# 4.0.0 (A)
We're very happy to introduce CryptPad v4.0!
This release is the culmination of a great deal of work over the last year, in which we searched for the right metaphors and imagery to clearly represent what CryptPad is all about. We've reworked our logo, color theme, text on our static pages, and the icons throughout the platform to convey the calm and safety we want our users to feel.
Our release schedule typically follows an alphabetical naming scheme, ranging from A for the first (or zero-th) release of the cycle to Z for the last, with a thematic name for each letter. In the rush of preparing translations and double-checking all of our changes we never found time to settle on a theme for this release, but we do find there's some value in maintaining the otherwise arbitrary rhythm we've followed all this time. The progression through the alphabet gives a sense of pace to what can otherwise seem like a endless stream of problems that need solving, and the end of the alphabet prompts us to build towards major milestones like this one.
With that in mind, you can expect 25 more major releases in this cycle before version 5.0, roughly every three weeks or so depending on circumstances.
## Goals
The main intent of this release was to deploy our `rebrand` branch which had been in development for some time. Along the way we also made notable improvements to the sheet editor which will be mentioned below.
## Update notes
In the process of redesigning the platform we started using some new features of the LESS CSS pre-processor language that were not supported by the version of lesshint that we were using to scan for errors. We've updated that dev dependency to a newer version (4.5.0 => 6.3.7) which introduced a rather large number of minor dependencies. These are only used during development, not by the server itself, so this is unlikely to have any impact on the software itself.
To update from 3.25.1 to 4.0.0:
1. Stop your server
2. Get the latest code from the 4.0.0 tag
3. Install the latest dependencies with `bower update` and `npm i`
4. Restart your server
## Features
* We've built a new version of the web-assembly code used to convert between OnlyOffice's internal representation of spreadsheet data and standard formats like XLSX, ODS, and CSV. We've also improved the ability to print whole sheets and selections in the UI. This still depends on the host browser's support of the required web APIs, but it should work in common browsers except maybe Safari and Internet Explorer.
* We found that certain issues reported via the built-in support ticket system were not easy to debug without knowing the id of the user's drive. Support tickets now include a `driveChannel` attribute to simplify this process.
* We've added a variety of settings for the control of how your browser uses a local database to speed up loading times and display cached versions of documents even when disconnected from our server. These are available in the "confidentiality" section of the settings page (https://cryptpad.fr/settings/#security).
Finally, the "rebrand" part of this release:
* Our home page features our new logo, a cleaner layout, new text (notably dropping the use of "zero-knowledge" from our explanation), new app icons, softer colors, neater fonts, and a custom illustration of a document shredder that hints at how CryptPad works.
* We no longer include a FAQ page with each instance, and instead link to relevant parts of our dedicated documentation platform (https://docs.cryptpad.fr) from any place that previously referenced the FAQ. This will make it easier for translators to focus on text for the platform's interface if they wish.
* Each of our editors now features a dedicated favicon to make it easier to distinguish different CryptPad tabs in your browser.
* The contact page now points to _Element_ instead of Riot, since the Matrix team rebranded in the last while as well.
* The "pricing" or "features" page (features.html) reads the server's configured storage limits from a server endpoint and displays them, rather than hardcoding the default values in the text.
* There is now a custom illustration of a person swallowing a key on the registration page to convey that CryptPad admins cannot restore access to documents if users lose or forget their credentials. This is underscored by highlights to the explanatory text displayed to the left of the form.
* Our loading screen now features a much simpler color scheme instead of the vibrant blue blocks. This is part of an effort to pave the way for a _dark theme_ that we hope to introduce very soon.
* Lastly, we've added a number of semantic cues in various places to improve the experience of users that rely on screen-readers. There's still a lot to do in this regard, but this big rewrite was a good opportunity to review some easy pain-points to alleviate.
## Bug fixes
* We found andd fixed a regression in the slide app which caused newly created documents to be initialized without a title.
* Thanks to a helpful user-report we were able to identify an issue in our rich text editor's _comments_ system that prevented iOS users from typing.
# ZyzomysPedunculatus' revenge (3.25.1)
This minor release is primarily intended to fix some minor issues that were introduced or detected following our 3.25.0 release, but it also includes some major improvements that we want to test and stabilize before our upcoming 4.0.0 release.
Features
* Our recent introduction of a clientside cache for document content now allows us to load and display a readable copy of a document before the most recent history has been fully loaded from the server. You might notice that your drive and some document typees are now displayed in a "DISCONNECTED" of "OFFLINE" state until they gets the latest history. For now this just means the loading screen is removed soon so you can start reading, but it's also an essential improvement that will become even more useful when we introduce the use of service-workers for offline usage.
* We've added an `offline` mode to the server so that anyone developing features in CryptPad can test its offline and caching features by disabling the websocket components of the server. Use `npm run offline` to launch in this mode.
* We spent some time improving the support ticket components of the administration panel. Tickets are now shown in four categories: tickets from premium users, tickets from non-paying users, answered tickets, and closed tickets.
* We also improved the readability of some of the server's activity logs by rounding off some numbers to display fewer decimal points. On a related note, log events indicating the completion of a file upload now display the size of the uploaded file.
* Errors that occur when loading teams now trigger some basic telemetry to the server to indicate the error code. This should help us determine the origin of some annoying teams issues that several users have reported.
* Users of the rich text editor should now find that their scroll position is maintained when they are at the bottom of the document and a remote users adds more text.
Bug fixes
* Shortly after deploying 3.25.0 we identified several cases in which its cache invalidation logic was not correctly detecting corrupted cache entries. This caused some documents to fail to load. We quickly disabled most caching until we got the chance to review. Since then, we've tested it much more thoroughly under situations which made it more likely to become corrupt. Our new cache invalidation logic seems to catch all the known cases, so we're re-enabling the use of the cache for encrypted files and most of our supported document types.
* We found that a race condition in the logout process prevented the document cache from being cleared correctly. We now wait until the asynchronous cache eviction process completes before redirecting users to the login page.
* We discovered that the `postMessage` API by which CryptPad's different iframes and workers communicate could not serialize certain error messages after recent changes. We've added some special logic to send such messages in a valid format as well as some extra error handling to better recover from and report failed transmissions.
* In cases where user avatars fail to load (due to network issues or 404s) the first letter of the user's display name will be displayed instead
* We found that shared folders were reconnecting to the server correctly after a network failure, however, some changes in the UI caused clients to incorrectly remain locked.
* Some recent refactoring of some styles caused some buttons on the login page to inherit bootstrap's styles instead of our custom ones.
* A third-party admin brought it to our attention that a library that was used for some development tests was being fetched via http instead of https, and was thus blocked by some of their local configuration parameters. We've updated its source to load via secure protocols only.
* The recent replacement of a link to our faq with a link to our documentation platform violated some security headers and prevented the link from loading. We've fixed the inline link with some code to open this link in a compatible way.
* Finally, we found a bug that caused custom colors in the slide app to revert to the default settings on page reloads. Custom slide colors should now be preserved.
To update from 3.25.0 to 3.25.1:
1. Stop your server
2. Get the latest code with `git checkout 3.25.1`
3. Install the latest dependencies with `bower update` and `npm i`
4. Restart your server
# ZyzomysPedunculatus (3.25.0)
## Goals

View file

@ -1,129 +1,22 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
inkscape:export-ydpi="144.92999"
inkscape:export-xdpi="144.92999"
inkscape:export-filename="/home/david/Dropbox/__active/CryptPad/2020 new identity/cp-static-pages/theme/static/favicon.png"
width="280"
height="349"
viewBox="0 0 74.083368 92.339644"
version="1.1"
id="svg3107"
inkscape:version="1.0.1 (1.0.1+r73)"
sodipodi:docname="logo_grey.svg">
<defs
id="defs3101">
<linearGradient
id="linearGradient835"
osb:paint="solid">
<stop
style="stop-color:#4591c4;stop-opacity:1;"
offset="0"
id="stop833" />
</linearGradient>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1.5847433"
inkscape:cx="139.75433"
inkscape:cy="174.32986"
inkscape:document-units="mm"
inkscape:current-layer="g1682"
inkscape:document-rotation="0"
showgrid="false"
units="px"
inkscape:window-width="1058"
inkscape:window-height="1233"
inkscape:window-x="1930"
inkscape:window-y="50"
inkscape:window-maximized="0" />
<metadata
id="metadata3104">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<g
id="g1627"
transform="translate(-640.42404,-172.98951)"
style="fill:#ffffff;fill-opacity:1;stroke:none">
<g
style="fill:#ffffff;fill-opacity:1;stroke:none"
id="g1619">
<path
sodipodi:nodetypes="cccccsc"
id="path1617"
d="m 644.01713,176.89554 h 44.38617 l 22.41393,20.82643 v 24.89856 c 0,26.16643 -21.41404,32.2278 -33.11715,38.40882 -12.81518,-5.89452 -32.79444,-12.3291 -33.11715,-38.40882 z"
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:5.2922;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
<g
id="g1623"
style="fill:#ffffff;fill-opacity:1;stroke:none">
<path
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:5.2922;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 644.01713,176.89554 h 44.38617 l 22.41393,20.82643 v 24.89856 c 0,26.16643 -21.41404,32.2278 -33.11715,38.40882 -12.81518,-5.89452 -32.79444,-12.3291 -33.11715,-38.40882 z"
id="path1621"
sodipodi:nodetypes="cccccsc" />
</g>
</g>
<g
transform="translate(-125.38236,-26.44934)"
id="g1682">
<path
id="path1169"
style="fill:#949494;fill-opacity:0.39607844;stroke:none;stroke-width:5.2922;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 128.97542,30.355489 0.55499,39.644084 h 33.14062 l 0.004,-39.644084 z" />
<path
sodipodi:nodetypes="ccccc"
id="path1171"
style="fill:#949494;fill-opacity:0.39607844;stroke:none;stroke-width:5.2922;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 162.69429,69.999573 0.003,43.945647 C 175.52196,108.0656 195.459,96.867853 195.82394,70.788683 l 0.0108,-0.78911 z" />
<path
sodipodi:nodetypes="cccccsc"
id="path1173"
d="m 128.97545,30.355368 h 44.38617 l 22.41393,20.82643 v 24.898565 c 0,26.166427 -21.41404,32.227797 -33.11715,38.408817 -12.81518,-5.89452 -32.79444,-12.3291 -33.11715,-38.408817 z"
style="fill:none;stroke:#949494;stroke-width:5.2922;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
sodipodi:nodetypes="ccc"
id="path1175"
d="m 171.321,29.810508 v 23.04035 h 24.57459"
style="fill:none;stroke:#949494;stroke-width:5.292;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<g
transform="matrix(1.1107111,0,0,1.1107111,18.926083,21.931586)"
id="g1181"
style="fill:#949494;fill-opacity:1">
<path
id="path1177"
style="fill:#949494;fill-opacity:1;stroke:none;stroke-width:5.29167;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.324432"
d="m 137.23305,42.718548 a 8.1185341,8.1185341 0 0 1 -8.11853,8.118534 8.1185341,8.1185341 0 0 1 -8.11854,-8.118534 8.1185341,8.1185341 0 0 1 8.11854,-8.118534 8.1185341,8.1185341 0 0 1 8.11853,8.118534 z" />
<path
id="path1179"
style="fill:#949494;fill-opacity:1;stroke:none;stroke-width:5.29167;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.324432"
d="m 127.00125,42.651196 h 4.22652 l 4.23333,22.354181 h -12.69318 z"
sodipodi:nodetypes="ccccc" />
</g>
</g>
<svg width="280" height="349" version="1.1" viewBox="0 0 74.083 92.34" xmlns="http://www.w3.org/2000/svg" xmlns:osb="http://www.openswatchbook.org/uri/2009/osb">
<g>
<g transform="translate(-640.42 -172.99)" style="fill:#ffffff">
<g style="fill:#ffffff">
<path d="m644.02 176.9h44.386l22.414 20.826v24.899c0 26.166-21.414 32.228-33.117 38.409-12.815-5.8945-32.794-12.329-33.117-38.409z" style="fill:#ffffff"/>
</g>
<g style="fill:#ffffff">
<path d="m644.02 176.9h44.386l22.414 20.826v24.899c0 26.166-21.414 32.228-33.117 38.409-12.815-5.8945-32.794-12.329-33.117-38.409z" style="fill:#ffffff"/>
</g>
</g>
<g transform="translate(-125.38 -26.449)">
<path d="m128.98 30.355 0.55499 39.644h33.141l4e-3 -39.644z" style="fill-opacity:.39608;fill:#949494"/>
<path d="m162.69 70 3e-3 43.946c12.825-5.8796 32.762-17.077 33.127-43.157l0.0108-0.78911z" style="fill-opacity:.39608;fill:#949494"/>
<path d="m128.98 30.355h44.386l22.414 20.826v24.899c0 26.166-21.414 32.228-33.117 38.409-12.815-5.8945-32.794-12.329-33.117-38.409z" style="fill:none;stroke-width:5.2922;stroke:#949494"/>
<path d="m171.32 29.811v23.04h24.575" style="fill:none;stroke-width:5.292;stroke:#949494"/>
<g transform="matrix(1.1107 0 0 1.1107 18.926 21.932)" style="fill:#949494">
<path d="m137.23 42.719a8.1185 8.1185 0 0 1-8.1185 8.1185 8.1185 8.1185 0 0 1-8.1185-8.1185 8.1185 8.1185 0 0 1 8.1185-8.1185 8.1185 8.1185 0 0 1 8.1185 8.1185z" style="fill:#949494"/>
<path d="m127 42.651h4.2265l4.2333 22.354h-12.693z" style="fill:#949494"/>
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 5.6 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 791 KiB

After

Width:  |  Height:  |  Size: 301 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 825 KiB

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 KiB

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 644 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 367 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 217 KiB

After

Width:  |  Height:  |  Size: 176 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

View file

@ -325,9 +325,29 @@ button:not(.btn).primary:hover{
};
var hasErrored = false;
var isOffline = false;
var updateLoadingProgress = function (data) {
if (!built || !data) { return; }
// If we receive a "offline" event, show the warning text
if (data.type === "offline") {
try {
isOffline = true;
document.querySelector('#cp-loading-message').setAttribute('style', 'display:block;');
document.querySelector('#cp-loading-message').innerText = Messages.offlineError;
} catch (e) { console.error(e); }
return;
}
// If we receive a new event and we were offline, remove
// the offline warning text
if (isOffline) {
try {
isOffline = false;
document.querySelector('#cp-loading-message').setAttribute('style', 'display:none;');
} catch (e) { console.error(e); }
}
// Make sure progress doesn't go backward
var c = types.indexOf(data.type);
if (c < current) { return console.debug(data); }

View file

@ -62,12 +62,7 @@ define([
var imprintUrl = AppConfig.imprint && (typeof(AppConfig.imprint) === "boolean" ?
'/imprint.html' : AppConfig.imprint);
// XXX translations
Msg.docs_link = "Documentation";
Msg.footer_team = "Contributors";
Msg.footer_tos = "Terms of Service";
Pages.versionString = "v3.25.0 (ZyzomysPedunculatus)";
Pages.versionString = "v4.0.0";
// used for the about menu
Pages.imprintLink = AppConfig.imprint ? footLink(imprintUrl, 'imprint') : undefined;
@ -165,5 +160,41 @@ define([
);
};
Pages.crowdfundingButton = function (onClick) {
var _link = h('a', {
href: "https://opencollective.com/cryptpad/",
target: '_blank',
rel: 'noopener',
});
var crowdFunding = h('button', [
Msg.crowdfunding_button
]);
$(crowdFunding).click(function () {
_link.click();
if (typeof(onClick) === 'function') { onClick(); }
});
return crowdFunding;
};
Pages.subscribeButton = function (onClick) {
var _link = h('a', {
href: "/accounts/",
});
var subscribe = h('button', [
Msg.subscribe_button
]);
$(subscribe).click(function () {
_link.click();
if (typeof(onClick) === 'function') { onClick(); }
});
return subscribe;
};
return Pages;
});

View file

@ -6,13 +6,9 @@ define([
'/common/outer/local-store.js'
], function (Config, h, Msg, Pages, LocalStore) {
// XXX translations
Msg.contact_adminHint = "For any issues related to your account, storage limit, or availability of the service."; // existing key
return function () {
var adminEmail = Config.adminEmail && Config.adminEmail !== 'i.did.not.read.my.config@cryptpad.fr';
var adminMailbox = Config.supportMailbox;
var adminMailbox = Config.supportMailbox && LocalStore.isLoggedIn();
return h('div#cp-main', [
Pages.infopageTopbar(),
h('div.container.cp-container', [
@ -38,7 +34,7 @@ define([
)
)
) : undefined,
(adminMailbox && LocalStore.isLoggedIn()) ? h('div.col-12.col-sm-6.col-md-3.col-lg-3',
adminMailbox ? h('div.col-12.col-sm-6.col-md-3.col-lg-3',
h('a.card', {href : "/support/"},
h('div.card-body',
h('p', [

View file

@ -1,64 +1,19 @@
define([
'jquery',
'/common/hyperscript.js',
'/common/common-util.js',
'/customize/messages.js',
'/customize/application_config.js',
'/common/outer/local-store.js',
'/customize/pages.js',
'/api/config',
], function ($, h, Msg, AppConfig, LocalStore, Pages, Config) {
var origin = encodeURIComponent(window.location.hostname);
], function ($, h, Util, Msg, AppConfig, LocalStore, Pages, Config) {
var accounts = {
donateURL: AppConfig.donateURL || "https://opencollective.com/cryptpad/",
upgradeURL: AppConfig.upgradeURL || 'https://accounts.cryptpad.fr/#/?on=' + origin,
upgradeURL: AppConfig.upgradeURL
};
// XXX translations
Msg.features_title = "Features";
return function () {
// Non-registered column
Msg.features_anon = "Non-registered";
Msg.features_f_apps = "Access to all the applications";
// Msg.features_f_apps_note = "";
Msg.features_f_core = "Common features";
// Msg.features_f_core_note = "";
Msg.features_f_file0 = "Open documents";
Msg.features_f_file0_note = "View and download documents shared by other users";
// Msg.features_f_cryptdrive0 = "";
// Msg.features_f_cryptdrive0_note = "";
// Msg.features_f_storage0 = "";
Msg.features_f_storage0_note = "Documents are deleted after 3 months of inactivity";
// Registered column
Msg.features_registered = "Registered"; //
// Msg.features_f_anon = "";
Msg.features_f_anon_note = "With additional functionality";
Msg.features_f_social = "Social Features";
Msg.features_f_social_note = "Add contacts for secure collaboration, create a profile, fine-grained access controls";
// Msg.features_f_file1 = "";
// XXX add instance limit
Msg.features_f_file1_note = "Store files in your CryptDrive: images, PDFs, videos, and more. Share them with your contacts or embed them in your documents. (up to 25MB)";
// Msg.features_f_cryptdrive1 = "";
// Msg.features_f_cryptdrive1_note = "";
// Msg.features_f_devices = "";
// Msg.features_f_devices_note = "";
// XXX add instance limit
Msg.features_f_storage1 = "Permanent Storage (1GB)";
Msg.features_f_storage1_note = "Documents stored in your CryptDrive are never deleted for inactivity";
// Premium column
Msg.features_premium = "Premium";
Msg.features_pricing = "{0} to {2}€ per month";
// Msg.features_f_reg = ""
Msg.features_f_reg_note = "With additional benefits";
// Msg.features_f_storage2 = ""
Msg.features_f_storage2_note = "From 5GB to 50GB depending on the plan. Increased limit of 150MB for file uploads.";
// Msg.features_f_support = ""
Msg.features_f_support_note = "Priority response from the administration team via email and built in ticket system.";
Msg.features_f_supporter = "Support privacy";
Msg.features_f_supporter_note = "Help CryptPad financially sustainable and show that privacy-enhancing software willingly funded by users should be the norm";
Msg.features_f_subscribe = "Subscribe";
Msg.features_f_subscribe_note = "Registered account needed to subscribe";
Msg.features_f_apps_note = AppConfig.availablePadTypes.map(function (app) {
if (AppConfig.registeredOnlyTypes.indexOf(app) !== -1) { return; }
return Msg.type[app];
@ -69,6 +24,53 @@ define([
rel: 'noopener noreferrer'
}, h('button.cp-features-register-button', Msg.features_f_subscribe));
var groupItemTemplate = function (title, content) {
return h('li.list-group-item', [
h('div.cp-check'),
h('div.cp-content', [
h('div.cp-feature', title),
h('div.cp-note', content),
])
]);
};
var defaultGroupItem = function (key) {
return groupItemTemplate(
Msg['features_f_' + key],
Msg['features_f_' + key + '_note']
);
};
var SPECIAL_GROUP_ITEMS = {};
SPECIAL_GROUP_ITEMS.storage0 = function (f) {
return groupItemTemplate(
Msg['features_f_' + f],
Msg._getKey('features_f_' + f + '_note', [Config.inactiveTime])
);
};
SPECIAL_GROUP_ITEMS.file1 = function (f) {
return groupItemTemplate(
Msg['features_f_' + f],
Msg._getKey('features_f_' + f + '_note', [Config.maxUploadSize / 1024 / 1024])
);
};
SPECIAL_GROUP_ITEMS.storage1 = function (f) {
return groupItemTemplate(
Msg._getKey('features_f_' + f, [Util.getPrettySize(Config.defaultStorageLimit, Msg)]),
Msg['features_f_' + f + '_note']
);
};
SPECIAL_GROUP_ITEMS.storage2 = function (f) {
return groupItemTemplate(
Msg['features_f_' + f],
Msg._getKey('features_f_' + f + '_note', [Config.premiumUploadSize / 1024 / 1024])
);
};
var groupItem = function (key) {
return (SPECIAL_GROUP_ITEMS[key] || defaultGroupItem)(key);
};
var anonymousFeatures =
h('div.col-12.col-sm-4.cp-anon-user',[
h('div.card',[
@ -79,17 +81,7 @@ define([
h('div.text-center', '0€'),
h('div.text-center', Msg.features_noData),
]),
h('ul.list-group.list-group-flush',
['apps', 'file0', 'core', 'cryptdrive0', 'storage0'].map(function (f) {
return h('li.list-group-item', [
h('div.cp-check'),
h('div.cp-content', [
h('div.cp-feature', Msg['features_f_' + f]),
h('div.cp-note', Msg['features_f_' + f + '_note'])
])
]);
})
),
h('ul.list-group.list-group-flush', ['apps', 'file0', 'core', 'cryptdrive0', 'storage0'].map(groupItem)),
]),
]);
@ -103,17 +95,7 @@ define([
h('div.text-center', '0€'),
h('div.text-center', Msg.features_noData),
]),
h('ul.list-group.list-group-flush', [
['anon', 'social', 'file1', 'cryptdrive1', 'devices', 'storage1'].map(function (f) {
return h('li.list-group-item', [
h('div.cp-check'),
h('div.cp-content', [
h('div.cp-feature', Msg['features_f_' + f]),
h('div.cp-note', Msg['features_f_' + f + '_note'])
])
]);
}),
]),
h('ul.list-group.list-group-flush', ['anon', 'social', 'file1', 'cryptdrive1', 'devices', 'storage1'].map(groupItem)),
h('div.card-body',[
h('div.cp-features-register#cp-features-register', [
h('a', {
@ -136,19 +118,7 @@ define([
}, Msg._getKey('features_pricing', ['5', '10', '15']))),
h('div.text-center', Msg.features_emailRequired),
]),
h('ul.list-group.list-group-flush', [
['reg', 'storage2', 'support', 'supporter'].map(function (f) {
console.log('features_f_' + f);
console.log('features_f_' + f + '_note');
return h('li.list-group-item', [
h('div.cp-check'),
h('div.cp-content', [
h('div.cp-feature', Msg['features_f_' + f]),
h('div.cp-note', Msg['features_f_' + f + '_note'])
])
]);
}),
]),
h('ul.list-group.list-group-flush', ['reg', 'storage2', 'support', 'supporter'].map(groupItem)),
h('div.card-body',[
h('div.cp-features-register#cp-features-subscribe', [
premiumButton
@ -158,7 +128,7 @@ define([
]),
]);
var availableFeatures =
Config.allowSubscriptions ?
(Config.allowSubscriptions && accounts.upgradeURL) ?
[anonymousFeatures, registeredFeatures, premiumFeatures] :
[anonymousFeatures, registeredFeatures];

View file

@ -72,33 +72,6 @@ define([
});
UI.addTooltips();
// XXX move this button to pages.js to make it available to other pages
var _link = h('a', {
href: "https://opencollective.com/cryptpad/",
target: '_blank',
rel: 'noopener',
});
var crowdFunding = h('button', [
Msg.crowdfunding_button
]);
$(crowdFunding).click(function () {
_link.click();
Feedback.send('HOME_SUPPORT_CRYPTPAD');
});
// XXX translations
Msg.home_privacy_title = "Private by design";
Msg.home_privacy_text = "CryptPad is built to enable collaboration while keeping data private. All information including documents, chats, and files is encrypted and decrypted by your browser. This means nothing is readable outside of the session where you are logged in. Even the service administrators do not have access to your information.";
Msg.home_host_title = "About this instance";
Msg.home_host = "This is an independent community instance of CryptPad."; // existing key
Msg.home_opensource_title = "Open Source";
Msg.home_opensource = 'Anyone can host CryptPad and offer the service in a personal or professional capacity. The source code is available on <a href="https://github.com/xwiki-labs/cryptpad">Github</a>.';
Msg.home_support_title = "Support CryptPad";
Msg.home_support = "<p>CryptPad does not profit from user's data. This is part of a vision for online services that respect privacy. Instead of pretending to be \"free\" like the big platforms, CryptPad aims to build a sustainable model: funded willingly by users instead of making profits from personal information.</p><p>You can support the project by making a one-time or recurring donation through our Open Collective. Our budget is transparent and updates are published regularly. There are also a number of <a href=\"https://docs.cryptpad.fr/en/how_to_contribute.html\" rel=\"noopener noreferrer\" target=\"_blank\">non-financial ways to contribute</a>.</p>";
var blocks = [
h('div.row.cp-index-section', [
h('div.col-sm-6',
@ -131,13 +104,13 @@ define([
h('div.col-sm-6', [
h('h2', Msg.home_support_title),
Pages.setHTML(h('span'), Msg.home_support),
crowdFunding
Pages.crowdfundingButton(function () {
Feedback.send('HOME_SUPPORT_CRYPTPAD');
}),
])
])
];
// XXX translation
Msg.main_catch_phrase = "Collaboration suite,<br>encrypted and open-source";
return [
h('div#cp-main', [
Pages.infopageTopbar(),
@ -156,10 +129,10 @@ define([
icons,
])
]),
blocks,
blocks
]),
Pages.infopageFooter(),
]),
Pages.infopageFooter(),
];
};
});

View file

@ -9,53 +9,49 @@ define([
return function () {
var urlArgs = Config.requireConf.urlArgs;
// XXX translations
Msg.register_header = "Register"; // existing key
Msg.register_notes_title = "Important notes";
Msg.register_notes = '<ul class="cp-notes-list"><li>Your password is your secret key which encrypts all of your pads. <span class="red">If you lose it there is no way we can recover your data.</span></li><li>If you are using a shared computer, <span class="red">remember to log out</span> when you are done. Only closing the browser window leaves your documents exposed. </li><li>To keep the documents you created and/or stored without being logged in, tick "Import documents from your anonymous session". </li></ul>';
Msg.register_importRecent = "Import documents from your anonymous session"; // existing key
return [h('div#cp-main', [
Pages.infopageTopbar(),
h('div.container.cp-container', [
h('div.row.cp-page-title', h('h1', Msg.register_header)),
h('div.row.cp-register-det', [
h('div#data.hidden.col-md-6', [
h('img.img-fluid', {
src: '/customize/images/illustration-swallow-the-key.png?' + urlArgs
}),
h('h2', Msg.register_notes_title),
Pages.setHTML(h('div.cp-register-notes'), Msg.register_notes)
]),
h('div#userForm.form-group.hidden.col-md-6', [
h('a', {
href: '/features.html'
}, Msg.register_whyRegister),
h('input.form-control#username', {
type: 'text',
autocomplete: 'off',
autocorrect: 'off',
autocapitalize: 'off',
spellcheck: false,
placeholder: Msg.login_username,
autofocus: true,
h('div.cp-reg-form.col-md-6', [
h('img.img-fluid', {
src: '/customize/images/swallow-the-key.png?' + urlArgs
}),
h('input.form-control#password', {
type: 'password',
placeholder: Msg.login_password,
}),
h('input.form-control#password-confirm', {
type: 'password',
placeholder: Msg.login_confirm,
}),
h('div.checkbox-container', [
UI.createCheckbox('import-recent', Msg.register_importRecent, true)
]),
h('div.checkbox-container', [
$(UI.createCheckbox('accept-terms')).find('.cp-checkmark-label').append(Msg.register_acceptTerms).parent()[0]
]),
h('button#register', Msg.login_register)
])
h('div#userForm.form-group.hidden', [
h('a', {
href: '/features.html'
}, Msg.register_whyRegister),
h('input.form-control#username', {
type: 'text',
autocomplete: 'off',
autocorrect: 'off',
autocapitalize: 'off',
spellcheck: false,
placeholder: Msg.login_username,
autofocus: true,
}),
h('input.form-control#password', {
type: 'password',
placeholder: Msg.login_password,
}),
h('input.form-control#password-confirm', {
type: 'password',
placeholder: Msg.login_confirm,
}),
h('div.checkbox-container', [
UI.createCheckbox('import-recent', Msg.register_importRecent, true)
]),
h('div.checkbox-container', [
$(UI.createCheckbox('accept-terms')).find('.cp-checkmark-label').append(Msg.register_acceptTerms).parent()[0]
]),
h('button#register', Msg.login_register)
])
]),
]),
]),

View file

@ -2,20 +2,11 @@ define([
'/api/config',
'/common/hyperscript.js',
'/customize/messages.js',
'/customize/pages.js'
], function (Config, h, Msg, Pages) {
'/customize/pages.js',
'/common/common-feedback.js',
], function (Config, h, Msg, Pages, Feedback) {
var urlArgs = Config.requireConf.urlArgs;
// XXX translations
Msg.whatis_collaboration = "Private Collaboration"; // existing key
Msg.whatis_collaboration_info = '<p>CryptPad is built to enable collaboration, synchronizing in real time between users editing the same document, but has no access to the content of the document or data about users. Because all data is encrypted, the service and its administrators have no way of seeing the content being edited and stored.</p><p>Collaborating in real time on online documents is now a common thing. A range of well known internet platforms offer this service. In order to enable collaboration, these services synchronize changes between all users. In the process they gain access to the content of the document and to data about the behaviour of users. While these services are often advertised as "free", platforms monetise user data by using it to profile users and selling advertising.</p>';
Msg.whatis_apps = "A full suite of applications";
Msg.whatis_apps_info = "<p>CryptPad provides a full-fledged office suite, with all the tools necessary for productive collaboration. Applications include: Rich Text, Spreadsheets, Code/Markdown, Kanban, Slides, Whiteboard and Polls.</p><p> A secure chat is available in each document for secure communication, [continue ...]</p>";
Msg.whatis_drive_info = "<p>Manage documents with CryptDrive. Create folders, shared folders, tags, [continue ...]</p>";
Msg.whatis_model = "Business model";
Msg.whatis_model_info = "<p>CryptPad is open source [continue ...]</p><p>CryptPad does not profit from its users data. This is because being fully encrypted it does not gather any useful data that could be sold to profile users. This lack of data is a feature, not a bug, it is part of a vision for online services that respect users privacy. Instead of pretending to be \"free\" like the big platforms CryptPad aims to build a financially sustainable model: funded willingly by users instead of profiting form personal information.</p><p>Since 2016, CryptPad is supported by French and European research grants such as BPI France, NLNet Foundation, NGI Trust, Mozilla Open Source Support, as well as donations and subscriptions to the service. Now that the feasibility of the project has been established, the next goal is to make financially sustainable through user funding. If you would like to support CryptPad and help make it a sustainable alternative to the big platforms, please consider making a donation.</p>";
Msg.whatis_xwiki = "Made at XWiki";
Msg.whatis_xwiki_info = "<p>CryptPad is made at XWiki, a company based in Paris that has been making open-source software for over 15 years. [continue ...]</p>";
return function () {
return h('div#cp-main', [
Pages.infopageTopbar(),
@ -66,27 +57,34 @@ define([
h('div.col-md-6.order-md-2', [
Pages.setHTML(h('h2'), Msg.whatis_model),
Pages.setHTML(h('span'), Msg.whatis_model_info),
h('button', [
Msg.crowdfunding_button // XXX not functional
])
// XXX add link to subscription here on cryptpad.fr
Config.allowSubscriptions ?
Pages.subscribeButton(function () {
Feedback.send('WHATIS_SUBSCRIBE_CRYPTPAD');
}) : undefined,
Pages.crowdfundingButton(function () {
Feedback.send('WHATIS_SUPPORT_CRYPTPAD');
}),
]),
h('div.col-md-6.order-md-1.small-logos', [
h('img', {
src: '/customize/images/logo_ngi.png?' + urlArgs,
alt: 'Logo NGI Trust'
alt: 'NGI Award 2019'
}),
h('img', {
src: '/customize/images/logo_nlnet.svg?' + urlArgs,
alt: 'Logo NLNet Foundation'
alt: 'NLNet Foundation logo'
}),
h('img', {
src: '/customize/images/logo_bpifrance.svg?' + urlArgs,
alt: 'Logo BPI France'
alt: 'BPI France logo'
}),
h('img', {
src: '/customize/images/logo_moss.jpg?' + urlArgs,
alt: 'Logo Mozilla Open Source Support'
alt: 'Mozilla Open Source Support logo'
}),
h('img', {
src: '/customize/images/logo_ngi_trust.png?' + urlArgs,
alt: 'NGI Trust logo'
}),
]),
]),

View file

@ -60,7 +60,7 @@
@colortheme_alertify-cancel: @colortheme_modal-bg;
@colortheme_alertify-cancel-border: #949494;
@colortheme_notification-log: fade(@colortheme_logo-1, 90%);
@colortheme_notification-log: fade(@colortheme_logo-2, 90%);
@colortheme_notification-color: #fff;;
@colortheme_notification-warn: rgba(205, 37, 50, 0.8);

View file

@ -54,6 +54,8 @@
height: unset !important;
max-height: 140px; // 6 lines
padding: 3px 5px;
user-select: text;
-webkit-user-select: text; // fix for iOS (can't type in contenteditable if user-select none)
}
margin-bottom: 5px;
}

View file

@ -173,6 +173,9 @@
.fa-minus-square-o, .fa-plus-square-o {
color: @colortheme_sidebar-left-fg;
}
.cptools {
color: #eee;
}
}
.cp-app-drive-element-selected-tmp {

View file

@ -37,6 +37,16 @@ body {
margin: 0;
font-size: 16px;
font-family: @colortheme_font;
#cp-main {
display: flex;
flex-flow: column;
min-height: 100vh;
& > .cp-container {
flex: 1;
}
}
.cp-container {
font-size: 16px;
padding-top: @infopages_padding;
@ -84,6 +94,7 @@ body {
color: @colortheme_base;
border: none;
padding: 10px 20px;
margin-right: 10px;
border-radius: 0px;
cursor: pointer;
&:hover, &:focus {
@ -117,10 +128,12 @@ body {
}
}
footer {
@footer-color: #d9d9d9; // XXX use/make variable
@footer-color: #d9d9d9; // FIXME use/make variable
background-color: @footer-color;
padding-top: 20px;
align-self: normal; // override align-items:center from parent in index.html
.container {
margin-bottom: 20px;
a {

View file

@ -2,11 +2,6 @@
@import (reference) "./variables.less";
@import (reference) "./colortheme-all.less";
.leftside-menu_main() {
div.cp-empty-rule {
display: block; // XXX workaround lesshint complaining about empty rules
}
}
.leftside-menu-category_main() {
.unselectable_make();
padding: 5px 15px;

View file

@ -94,6 +94,7 @@
flex-flow: column;
flex: 1;
min-width: 0;
color: @colortheme_base;
.cp-app-contacts-name {
white-space: nowrap;
}
@ -113,7 +114,7 @@
width: 20px;
text-align: center;
&:hover {
color: darken(@msg-color, 20%);
color: @cryptpad_text_col;
}
}

View file

@ -38,6 +38,19 @@
p:empty {
display: none;
}
nav {
display: flex;
align-items: center;
justify-content: flex-end;
}
@media screen and (max-width: 600px) {
nav .btn-danger {
line-height: inherit;
}
}
}
.cp-register-det {
@ -56,10 +69,19 @@
margin-bottom: 1em;
}
}
.cp-reg-form {
img {
margin-top: 0px;
position: relative;
z-index: 0;
}
}
#userForm {
padding: 15px;
background-color: white;
height: min-content; // XXX why does the form expand without this?
position: relative;
z-index: 2;
margin-bottom: 100px;
.cp-shadow();
.form-control {
border-radius: 0;

View file

@ -51,7 +51,6 @@ Default.httpHeaders = function () {
"Access-Control-Allow-Origin": "*",
};
};
// XXX check here for any deleted pages
Default.mainPages = function () {
return [
'index',

View file

@ -14,6 +14,7 @@ const Util = require("./common-util");
module.exports.create = function (config) {
const Env = {
OFFLINE_MODE: false,
FRESH_KEY: '',
FRESH_MODE: true,
DEV_MODE: false,
@ -117,6 +118,9 @@ module.exports.create = function (config) {
//console.log("FRESH MODE ENABLED");
Env.FRESH_KEY = +new Date();
}
// Offline mode is mostly for development. It lets us test clientside cache and offline support
if (process.env.OFFLINE) { Env.OFFLINE_MODE = true; }
}());
Env.checkCache = function (channel) {

2
package-lock.json generated
View file

@ -1,6 +1,6 @@
{
"name": "cryptpad",
"version": "3.25.0",
"version": "4.0.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {

View file

@ -1,7 +1,7 @@
{
"name": "cryptpad",
"description": "realtime collaborative visual editor with zero knowlege server",
"version": "3.25.0",
"version": "4.0.0",
"license": "AGPL-3.0+",
"repository": {
"type": "git",
@ -38,6 +38,7 @@
"start": "node server.js",
"dev": "DEV=1 node server.js",
"fresh": "FRESH=1 node server.js",
"offline": "FRESH=1 OFFLINE=1 node server.js",
"package": "PACKAGE=1 node server.js",
"lint": "jshint --config .jshintrc --exclude-path .jshintignore . && ./node_modules/lesshint/bin/lesshint -c ./.lesshintrc ./customize.dist/src/less2/",
"lint:js": "jshint --config .jshintrc --exclude-path .jshintignore .",

View file

@ -313,6 +313,7 @@ nThen(function (w) {
Env.Log = _log;
config.log = _log;
if (Env.OFFLINE_MODE) { return; }
if (config.externalWebsocketURL) { return; }
require("./lib/api").create(Env);

View file

@ -196,7 +196,7 @@ define([
waitFor.abort();
return void UI.warn(Messages.admin_archiveInval);
}
}));
}), true);
}).nThen(function () {
sFrameChan.query('Q_ADMIN_RPC', {
cmd: archive ? 'ARCHIVE_DOCUMENT' : 'RESTORE_ARCHIVED_DOCUMENT',

View file

@ -1007,6 +1007,16 @@ define([
} else {
$error.html(error || Messages.error);
}
$error.find('a[href]').click(function (e) {
e.preventDefault();
var href = $(this).prop('href');
if (!href) { return; }
if (e && e.ctrlKey) {
window.open('/bounce/#'+encodeURIComponent(href));
return;
}
window.parent.location = href;
});
if (exitable) {
$(window).focus();
$(window).keydown(function (e) {

View file

@ -1531,9 +1531,6 @@ define([
var legalLine = template(Messages.info_imprintFlavour, Pages.imprintLink);
var privacyLine = template(Messages.info_privacyFlavour, Pages.privacyLink);
// XXX translation
Messages.help.generic.more = "Learn more about how CryptPad can work for you by reading our <a href=\"https://docs.cryptpad.fr\" target=\"_blank\">Documentation</a>.";
var faqLine = template(Messages.help.generic.more, Pages.docsLink);
var content = h('div.cp-info-menu-container', [
@ -2112,14 +2109,9 @@ define([
};
// Title
var colorClass = 'cp-icon-color-'+type;
colorClass = colorClass; // XXX
//$creation.append(h('h2.cp-creation-title', Messages.newButtonTitle));
var newPadH3Title = Messages['button_new' + type];
// XXX translation
Messages.creation_helperText = "Learn more...";
var title = h('div.cp-creation-title', [
UI.getFileIcon({type: type})[0],
h('div.cp-creation-title-text', [
@ -2128,6 +2120,7 @@ define([
])
]);
$creation.append(title);
//var colorClass = 'cp-icon-color-'+type;
//$creation.append(h('h2.cp-creation-title.'+colorClass, Messages.newButtonTitle));
// Deleted pad warning
@ -2194,10 +2187,6 @@ define([
]);
// Life time
// XXX translations
Messages.creation_expiration = "Expiration date";
Messages.creation_expiresIn = "Expires in";
var expire = h('div.cp-creation-expire', [
UI.createCheckbox('cp-creation-expire', Messages.creation_expiration, false, {
labelAlt: Messages.creation_expiresIn
@ -2221,8 +2210,6 @@ define([
]);
// Password
// XXX translation
Messages.creation_password = "Password";
var password = h('div.cp-creation-password', [
UI.createCheckbox('cp-creation-password', Messages.creation_password, false),
h('span.cp-creation-password-picker.cp-creation-slider', [

View file

@ -291,6 +291,14 @@
else if (bytes >= oneMegabyte) { return 'MB'; }
};
Util.getPrettySize = function (bytes, Messages) {
var unit = Util.magnitudeOfBytes(bytes);
if (unit === 'GB') {
return Messages._getKey('formattedGB', [Util.bytesToGigabytes(bytes)]);
}
return Messages._getKey('formattedMB', [Util.bytesToMegabytes(bytes)]);
};
// given a path, asynchronously return an arraybuffer
var getCacheKey = function (src) {

View file

@ -492,23 +492,37 @@ define([
});
};
// This function is used when we want to open a pad. We first need
// to check if it exists. With the cached drive, we need to wait for
// the network to be available before we can continue.
common.isNewChannel = function (href, password, _cb) {
var cb = Util.once(Util.mkAsync(_cb));
var channel = Hash.hrefToHexChannelId(href, password);
var error;
Nthen(function (waitFor) {
// If it's not in the cache or it's not a blob, try to get the value from the server
postMessage('IS_NEW_CHANNEL', {channel: channel}, waitFor(function (obj) {
if (obj && obj.error) { error = obj.error; return; }
if (!obj) { error = "INVALID_RESPONSE"; return; }
Cache.getChannelCache(channel, waitFor(function(err, data) {
if (err || !data) { return; }
waitFor.abort();
cb(undefined, obj.isNew);
cb(undefined, false);
}));
}).nThen(function () {
Cache.getChannelCache(channel, function(err, data) {
if (err || !data) { return void cb(error); }
cb(null, false);
});
// If it's not in the cache try to get the value from the server
var isNew = function () {
error = undefined;
postMessage('IS_NEW_CHANNEL', {channel: channel}, function (obj) {
if (obj && obj.error) { error = obj.error; }
if (!obj) { error = "INVALID_RESPONSE"; }
if (error === "ANON_RPC_NOT_READY") {
// Try again in 1s
return void setTimeout(isNew, 100);
} else if (error) {
return void cb(error);
}
cb(undefined, obj.isNew);
}, {timeout: -1});
};
isNew();
});
};
@ -964,11 +978,30 @@ define([
// Get data about a given channel: use with hidden hashes
common.getPadDataFromChannel = function (obj, cb) {
if (!obj || !obj.channel) { return void cb('EINVAL'); }
// Note: no timeout for this command, we may only have loaded the cached drive
// and need to wait for the fully synced drive
postMessage("GET_PAD_DATA_FROM_CHANNEL", obj, function (data) {
cb(void 0, data);
});
}, {timeout: -1});
};
common.disableCache = function (disabled, cb) {
postMessage("CACHE_DISABLE", disabled, cb);
};
window.addEventListener('storage', function (e) {
if (e.key !== 'CRYPTPAD_STORE|disableCache') { return; }
var n = e.newValue;
if (n) {
Cache.disable();
common.disableCache(true, function () {});
} else {
Cache.enable();
common.disableCache(false, function () {});
}
});
if (localStorage['CRYPTPAD_STORE|disableCache']) {
Cache.disable();
}
// Admin
common.adminRpc = function (data, cb) {
@ -1948,6 +1981,64 @@ define([
});
};
var provideFeedback = function () {
if (typeof(window.Proxy) === 'undefined') {
Feedback.send("NO_PROXIES");
}
if (!common.isWebRTCSupported()) {
Feedback.send("NO_WEBRTC");
}
var shimPattern = /CRYPTPAD_SHIM/;
if (shimPattern.test(Array.isArray.toString())) {
Feedback.send("NO_ISARRAY");
}
if (shimPattern.test(Array.prototype.fill.toString())) {
Feedback.send("NO_ARRAYFILL");
}
if (typeof(Symbol) === 'undefined') {
Feedback.send('NO_SYMBOL');
}
if (typeof(SharedWorker) === "undefined") {
Feedback.send('NO_SHAREDWORKER');
} else {
Feedback.send('SHAREDWORKER');
}
if (typeof(Worker) === "undefined") {
Feedback.send('NO_WEBWORKER');
}
if (!('serviceWorker' in navigator)) {
Feedback.send('NO_SERVICEWORKER');
}
if (!common.hasCSSVariables()) {
Feedback.send('NO_CSS_VARIABLES');
}
Feedback.reportScreenDimensions();
Feedback.reportLanguage();
};
var initFeedback = function (feedback) {
// Initialize feedback
Feedback.init(feedback);
provideFeedback();
};
var onStoreReady = function (data) {
if (common.userHash) {
var localToken = tryParsing(localStorage.getItem(Constants.tokenKey));
if (localToken === null) {
// if that number hasn't been set to localStorage, do so.
localStorage.setItem(Constants.tokenKey, data[Constants.tokenKey]);
}
}
initFeedback(data.feedback);
};
common.startAccountDeletion = function (data, cb) {
// Logout other tabs
LocalStore.logout(null, true);
@ -1994,6 +2085,8 @@ define([
var localToken = tryParsing(localStorage.getItem(Constants.tokenKey));
if (localToken !== data.token) { requestLogin(); }
},
// Store
STORE_READY: onStoreReady,
// Network
NETWORK_DISCONNECT: common.onNetworkDisconnect.fire,
NETWORK_RECONNECT: function (data) {
@ -2075,52 +2168,6 @@ define([
return void setTimeout(function () { f(void 0, env); });
}
var provideFeedback = function () {
if (typeof(window.Proxy) === 'undefined') {
Feedback.send("NO_PROXIES");
}
if (!common.isWebRTCSupported()) {
Feedback.send("NO_WEBRTC");
}
var shimPattern = /CRYPTPAD_SHIM/;
if (shimPattern.test(Array.isArray.toString())) {
Feedback.send("NO_ISARRAY");
}
if (shimPattern.test(Array.prototype.fill.toString())) {
Feedback.send("NO_ARRAYFILL");
}
if (typeof(Symbol) === 'undefined') {
Feedback.send('NO_SYMBOL');
}
if (typeof(SharedWorker) === "undefined") {
Feedback.send('NO_SHAREDWORKER');
} else {
Feedback.send('SHAREDWORKER');
}
if (typeof(Worker) === "undefined") {
Feedback.send('NO_WEBWORKER');
}
if (!('serviceWorker' in navigator)) {
Feedback.send('NO_SERVICEWORKER');
}
if (!common.hasCSSVariables()) {
Feedback.send('NO_CSS_VARIABLES');
}
Feedback.reportScreenDimensions();
Feedback.reportLanguage();
};
var initFeedback = function (feedback) {
// Initialize feedback
Feedback.init(feedback);
provideFeedback();
};
var userHash;
(function iOSFirefoxFix () {
@ -2196,8 +2243,10 @@ define([
localToken: tryParsing(localStorage.getItem(Constants.tokenKey)), // TODO move this to LocalStore ?
language: common.getLanguage(),
cache: rdyCfg.cache,
disableCache: localStorage['CRYPTPAD_STORE|disableCache'],
driveEvents: true //rdyCfg.driveEvents // Boolean
};
common.userHash = userHash;
// FIXME Backward compatibility
if (sessionStorage.newPadFileData) {
@ -2392,15 +2441,6 @@ define([
if (data.anonHash && !cfg.userHash) { LocalStore.setFSHash(data.anonHash); }
if (cfg.userHash) {
var localToken = tryParsing(localStorage.getItem(Constants.tokenKey));
if (localToken === null) {
// if that number hasn't been set to localStorage, do so.
localStorage.setItem(Constants.tokenKey, data[Constants.tokenKey]);
}
}
initFeedback(data.feedback);
initialized = true;
channelIsReady();
});

View file

@ -50,6 +50,7 @@ define([
isMac: navigator.platform === "MacIntel",
allowFolderUpload: File.prototype.hasOwnProperty("webkitRelativePath"),
};
var onConnectEvt = Util.mkEvent(true);
var stringify = function (obj) {
return JSONSortify(obj);
@ -280,6 +281,7 @@ define([
}
state = APP.online && !APP.history && state;
APP.editable = !APP.readOnly && state;
if (APP.editable) { onConnectEvt.fire(); }
if (!state) {
APP.$content.addClass('cp-app-drive-readonly');
@ -3936,7 +3938,8 @@ define([
var newRoot = Util.find(manager, ['folders', sfId, 'proxy', manager.user.userObject.ROOT]) || {};
subfolder = manager.hasSubfolder(newRoot);
// Fix name
key = manager.getSharedFolderData(sfId).title || Messages.fm_deletedFolder;
var sfData = manager.getSharedFolderData(sfId);
key = sfData.title || sfData.lastTitle || Messages.fm_deletedFolder;
// Fix icon
$icon = isCurrentFolder ? $sharedFolderOpenedIcon : $sharedFolderIcon;
isSharedFolder = sfId;
@ -4365,7 +4368,7 @@ define([
if (manager.isFolder(el) && !manager.isSharedFolder(el) && !anonDrive) { // Folder
// disconnected
if (!APP.editable) {
return void UI.warn(Messages.error); // XXX
return void UI.warn(Messages.error);
}
// if folder is inside SF
else if (manager.isInSharedFolder(paths[0].path)) {
@ -4856,22 +4859,24 @@ define([
onClose: cb
});
};
var deprecated = files.sharedFoldersTemp;
if (typeof (deprecated) === "object" && APP.editable && Object.keys(deprecated).length) {
Object.keys(deprecated).forEach(function (fId) {
var data = deprecated[fId];
var sfId = manager.user.userObject.getSFIdFromHref(data.href);
if (folders[fId] || sfId) { // This shared folder is already stored in the drive...
return void manager.delete([['sharedFoldersTemp', fId]], function () { });
}
nt = nt(function (waitFor) {
UI.openCustomModal(passwordModal(fId, data, waitFor()));
}).nThen;
});
nt(function () {
refresh();
});
}
onConnectEvt.reg(function () {
var deprecated = files.sharedFoldersTemp;
if (typeof (deprecated) === "object" && Object.keys(deprecated).length) {
Object.keys(deprecated).forEach(function (fId) {
var data = deprecated[fId];
var sfId = manager.user.userObject.getSFIdFromHref(data.href);
if (folders[fId] || sfId) { // This shared folder is already stored in the drive...
return void manager.delete([['sharedFoldersTemp', fId]], function () { });
}
nt = nt(function (waitFor) {
UI.openCustomModal(passwordModal(fId, data, waitFor()));
}).nThen;
});
nt(function () {
refresh();
});
}
});
return {
refresh: refresh,

View file

@ -769,7 +769,6 @@ define([
}, function () {});
};
Messages.access_offline = "You're currently offline. Access management is not available"; // XXX
var getAccessTab = function (Env, data, opts, _cb) {
var cb = Util.once(Util.mkAsync(_cb));
var common = Env.common;
@ -814,130 +813,139 @@ define([
]));
}
$('<label>', {'for': 'cp-app-prop-password'}).text(Messages.creation_passwordValue).appendTo($d);
var $pwLabel = $('<label>', {'for': 'cp-app-prop-password'})
.text(Messages.creation_passwordValue).appendTo($d);
var hasPassword = data.password;
var password = UI.passwordInput({
id: 'cp-app-prop-password',
readonly: 'readonly'
});
$d.append(password);
if (!data.noPassword) {
var hasPassword = data.password;
var $password = $(password);
var $pwInput = $password.find('.cp-password-input');
$pwInput.val(data.password || '').click(function () {
$pwInput[0].select();
var $password = $(password).appendTo($d);
var $pwInput = $password.find('.cp-password-input');
$pwInput.val(data.password || '').click(function () {
$pwInput[0].select();
});
if (!hasPassword) {
$password.hide();
$pwLabel.hide();
}
// In the properties, we should have the edit href if we know it.
// We should know it because the pad is stored, but it's better to check...
if (!data.noEditPassword && owned && data.href) { // FIXME SHEET fix password change for sheets
var isOO = parsed.type === 'sheet';
var isFile = parsed.hashData.type === 'file';
var isSharedFolder = parsed.type === 'drive';
var changePwTitle = Messages.properties_changePassword;
var changePwConfirm = isFile ? Messages.properties_confirmChangeFile : Messages.properties_confirmChange;
if (!hasPassword) {
changePwTitle = Messages.properties_addPassword;
changePwConfirm = isFile ? Messages.properties_confirmNewFile : Messages.properties_confirmNew;
}
$('<label>', {'for': 'cp-app-prop-change-password'})
.text(changePwTitle).appendTo($d);
var newPassword = UI.passwordInput({
id: 'cp-app-prop-change-password',
style: 'flex: 1;'
});
// In the properties, we should have the edit href if we know it.
// We should know it because the pad is stored, but it's better to check...
if (!data.noEditPassword && owned && data.href) { // FIXME SHEET fix password change for sheets
var isOO = parsed.type === 'sheet';
var isFile = parsed.hashData.type === 'file';
var isSharedFolder = parsed.type === 'drive';
var changePwTitle = Messages.properties_changePassword;
var changePwConfirm = isFile ? Messages.properties_confirmChangeFile : Messages.properties_confirmChange;
if (!hasPassword) {
changePwTitle = Messages.properties_addPassword;
changePwConfirm = isFile ? Messages.properties_confirmNewFile : Messages.properties_confirmNew;
var passwordOk = h('button.btn', Messages.properties_changePasswordButton);
var changePass = h('span.cp-password-change-container', [
newPassword,
passwordOk
]);
var pLocked = false;
$(passwordOk).click(function () {
var newPass = $(newPassword).find('input').val();
if (data.password === newPass ||
(!data.password && !newPass)) {
return void UI.alert(Messages.properties_passwordSame);
}
$('<label>', {'for': 'cp-app-prop-change-password'})
.text(changePwTitle).appendTo($d);
var newPassword = UI.passwordInput({
id: 'cp-app-prop-change-password',
style: 'flex: 1;'
});
var passwordOk = h('button.btn', Messages.properties_changePasswordButton);
var changePass = h('span.cp-password-change-container', [
newPassword,
passwordOk
]);
var pLocked = false;
$(passwordOk).click(function () {
var newPass = $(newPassword).find('input').val();
if (data.password === newPass ||
(!data.password && !newPass)) {
return void UI.alert(Messages.properties_passwordSame);
}
if (pLocked) { return; }
pLocked = true;
UI.confirm(changePwConfirm, function (yes) {
if (!yes) { pLocked = false; return; }
$(passwordOk).html('').append(h('span.fa.fa-spinner.fa-spin', {style: 'margin-left: 0'}));
var q = isFile ? 'Q_BLOB_PASSWORD_CHANGE' :
(isOO ? 'Q_OO_PASSWORD_CHANGE' : 'Q_PAD_PASSWORD_CHANGE');
if (pLocked) { return; }
pLocked = true;
UI.confirm(changePwConfirm, function (yes) {
if (!yes) { pLocked = false; return; }
$(passwordOk).html('').append(h('span.fa.fa-spinner.fa-spin', {style: 'margin-left: 0'}));
var q = isFile ? 'Q_BLOB_PASSWORD_CHANGE' :
(isOO ? 'Q_OO_PASSWORD_CHANGE' : 'Q_PAD_PASSWORD_CHANGE');
// If this is a file password change, register to the upload events:
// * if there is a pending upload, ask if we shoudl interrupt
// * display upload progress
var onPending;
var onProgress;
if (isFile) {
onPending = sframeChan.on('Q_BLOB_PASSWORD_CHANGE_PENDING', function (data, cb) {
onPending.stop();
UI.confirm(Messages.upload_uploadPending, function (yes) {
cb({cancel: yes});
});
});
onProgress = sframeChan.on('EV_BLOB_PASSWORD_CHANGE_PROGRESS', function (data) {
if (typeof (data) !== "number") { return; }
var p = Math.round(data);
$(passwordOk).text(p + '%');
// If this is a file password change, register to the upload events:
// * if there is a pending upload, ask if we shoudl interrupt
// * display upload progress
var onPending;
var onProgress;
if (isFile) {
onPending = sframeChan.on('Q_BLOB_PASSWORD_CHANGE_PENDING', function (data, cb) {
onPending.stop();
UI.confirm(Messages.upload_uploadPending, function (yes) {
cb({cancel: yes});
});
});
onProgress = sframeChan.on('EV_BLOB_PASSWORD_CHANGE_PROGRESS', function (data) {
if (typeof (data) !== "number") { return; }
var p = Math.round(data);
$(passwordOk).text(p + '%');
});
}
sframeChan.query(q, {
teamId: typeof(owned) !== "boolean" ? owned : undefined,
href: data.href,
password: newPass
}, function (err, data) {
$(passwordOk).text(Messages.properties_changePasswordButton);
pLocked = false;
if (err || data.error) {
console.error(err || data.error);
return void UI.alert(Messages.properties_passwordError);
}
UI.findOKButton().click();
$pwInput.val(newPass);
if (newPass) {
$password.show();
$pwLabel.show();
} else {
$password.hide();
$pwLabel.hide();
}
sframeChan.query(q, {
teamId: typeof(owned) !== "boolean" ? owned : undefined,
href: data.href,
password: newPass
}, function (err, data) {
// If the current document is a file or if we're changing the password from a drive,
// we don't have to reload the page at the end.
// Tell the user the password change was successful and abort
if (isFile || priv.app !== parsed.type) {
if (onProgress && onProgress.stop) { onProgress.stop(); }
$(passwordOk).text(Messages.properties_changePasswordButton);
pLocked = false;
if (err || data.error) {
console.error(err || data.error);
return void UI.alert(Messages.properties_passwordError);
}
UI.findOKButton().click();
var alertMsg = data.warning ? Messages.properties_passwordWarningFile
: Messages.properties_passwordSuccessFile;
return void UI.alert(alertMsg, undefined, {force: true});
}
$pwInput.val(newPass);
// Pad password changed: update the href
// Use hidden hash if needed (we're an owner of this pad so we know it is stored)
var useUnsafe = Util.find(priv, ['settings', 'security', 'unsafeLinks']);
var href = (priv.readOnly && data.roHref) ? data.roHref : data.href;
if (useUnsafe !== true) {
var newParsed = Hash.parsePadUrl(href);
var newSecret = Hash.getSecrets(newParsed.type, newParsed.hash, newPass);
var newHash = Hash.getHiddenHashFromKeys(parsed.type, newSecret, {});
href = Hash.hashToHref(newHash, parsed.type);
}
// If the current document is a file or if we're changing the password from a drive,
// we don't have to reload the page at the end.
// Tell the user the password change was successful and abort
if (isFile || priv.app !== parsed.type) {
if (onProgress && onProgress.stop) { onProgress.stop(); }
$(passwordOk).text(Messages.properties_changePasswordButton);
var alertMsg = data.warning ? Messages.properties_passwordWarningFile
: Messages.properties_passwordSuccessFile;
return void UI.alert(alertMsg, undefined, {force: true});
if (data.warning) {
return void UI.alert(Messages.properties_passwordWarning, function () {
common.gotoURL(href);
}, {force: true});
}
return void UI.alert(Messages.properties_passwordSuccess, function () {
if (!isSharedFolder) {
common.gotoURL(href);
}
// Pad password changed: update the href
// Use hidden hash if needed (we're an owner of this pad so we know it is stored)
var useUnsafe = Util.find(priv, ['settings', 'security', 'unsafeLinks']);
var href = (priv.readOnly && data.roHref) ? data.roHref : data.href;
if (useUnsafe !== true) {
var newParsed = Hash.parsePadUrl(href);
var newSecret = Hash.getSecrets(newParsed.type, newParsed.hash, newPass);
var newHash = Hash.getHiddenHashFromKeys(parsed.type, newSecret, {});
href = Hash.hashToHref(newHash, parsed.type);
}
if (data.warning) {
return void UI.alert(Messages.properties_passwordWarning, function () {
common.gotoURL(href);
}, {force: true});
}
return void UI.alert(Messages.properties_passwordSuccess, function () {
if (!isSharedFolder) {
common.gotoURL(href);
}
}, {force: true});
});
}, {force: true});
});
});
$d.append(changePass);
}
});
$d.append(changePass);
}
if (owned) {
var deleteOwned = h('button.btn.btn-danger-alt', [h('i.cptools.cptools-destroy'), Messages.fc_delete_owned]);

View file

@ -91,7 +91,7 @@ define([
console.error(e);
}
bytes += _bytes;
}));
}), true);
});
if (!owned) { return; }

View file

@ -273,7 +273,6 @@ define([
var hasFriends = opts.hasFriends;
var onFriendShare = Util.mkEvent();
Messages.share_noContactsOffline = "OFFLINE"; // XXX
var metadataMgr = common.getMetadataMgr();
var priv = metadataMgr.getPrivateData();
if (priv.offline) {

View file

@ -425,7 +425,7 @@ var factory = function () {
}
catch (e) { return null; }
};
var fetchDecryptedMetadata = function (src, strKey, cb) {
var fetchDecryptedMetadata = function (src, key, cb) {
if (typeof(src) !== 'string') {
return window.setTimeout(function () {
cb('NO_SOURCE');
@ -433,7 +433,7 @@ var factory = function () {
}
fetchMetadata(src, function (e, buffer) {
if (e) { return cb(e); }
var key = Decrypt.getKeyFromStr(strKey);
if (typeof(key) === "string") { key = Decrypt.getKeyFromStr(key); }
cb(void 0, decryptMetadata(buffer, key));
});
};

View file

@ -61,6 +61,7 @@ define([
var DISPLAY_RESTORE_BUTTON = false;
var NEW_VERSION = 3;
var PENDING_TIMEOUT = 30000;
var CURRENT_VERSION = 'v2b';
//var READONLY_REFRESH_TO = 15000;
var debug = function (x) {
@ -1183,7 +1184,7 @@ define([
"url": url,
"permissions": {
"download": false,
"print": false,
"print": true,
}
},
"documentType": file.doc,
@ -1453,15 +1454,74 @@ define([
makeChannel();
};
var x2tReady = Util.mkEvent(true);
var fetchFonts = function (x2t) {
var path = '/common/onlyoffice/'+CURRENT_VERSION+'/fonts/';
var e = getEditor();
var fonts = e.FontLoader.fontInfos;
var files = e.FontLoader.fontFiles;
var suffixes = {
indexR: '',
indexB: '_Bold',
indexBI: '_Bold_Italic',
indexI: '_Italic',
};
nThen(function (waitFor) {
fonts.forEach(function (font) {
// Check if the font is already loaded
if (!font.NeedStyles) { return; }
// Pick the variants we need (regular, bold, italic)
['indexR', 'indexB', 'indexI', 'indexBI'].forEach(function (k) {
if (typeof(font[k]) !== "number" || font[k] === -1) { return; } // No matching file
var file = files[font[k]];
var name = font.Name + suffixes[k] + '.ttf';
Util.fetch(path + file.Id, waitFor(function (err, buffer) {
if (buffer) {
x2t.FS.writeFile('/working/fonts/' + name, buffer);
}
}));
});
});
}).nThen(function () {
x2tReady.fire();
});
};
var x2tInitialized = false;
var x2tInit = function(x2t) {
debug("x2t mount");
// x2t.FS.mount(x2t.MEMFS, {} , '/');
x2t.FS.mkdir('/working');
x2t.FS.mkdir('/working/media');
x2t.FS.mkdir('/working/fonts');
x2tInitialized = true;
fetchFonts(x2t);
debug("x2t mount done");
};
var getX2T = function (cb) {
// Perform the x2t conversion
require(['/common/onlyoffice/x2t/x2t.js'], function() { // FIXME why does this fail without an access-control-allow-origin header?
var x2t = window.Module;
x2t.run();
if (x2tInitialized) {
debug("x2t runtime already initialized");
return void x2tReady.reg(function () {
cb(x2t);
});
}
x2t.onRuntimeInitialized = function() {
debug("x2t in runtime initialized");
// Init x2t js module
x2tInit(x2t);
x2tReady.reg(function () {
cb(x2t);
});
};
});
};
/*
Converting Data
@ -1470,10 +1530,41 @@ define([
The filename extension needs to represent the input format
Example: fileName=cryptpad.bin outputFormat=xlsx
*/
var getFormatId = function (ext) {
// Sheets
if (ext === 'xlsx') { return 257; }
if (ext === 'xls') { return 258; }
if (ext === 'ods') { return 259; }
if (ext === 'csv') { return 260; }
if (ext === 'pdf') { return 513; }
return;
};
var getFromId = function (ext) {
var id = getFormatId(ext);
if (!id) { return ''; }
return '<m_nFormatFrom>'+id+'</m_nFormatFrom>';
};
var getToId = function (ext) {
var id = getFormatId(ext);
if (!id) { return ''; }
return '<m_nFormatTo>'+id+'</m_nFormatTo>';
};
var x2tConvertDataInternal = function(x2t, data, fileName, outputFormat) {
debug("Converting Data for " + fileName + " to " + outputFormat);
// writing file to mounted working disk (in memory)
x2t.FS.writeFile('/working/' + fileName, data);
// PDF
var pdfData = '';
if (outputFormat === "pdf" && typeof(data) === "object" && data.bin && data.buffer) {
// Add conversion rules
pdfData = "<m_bIsNoBase64>false</m_bIsNoBase64>" +
"<m_sFontDir>/working/fonts/</m_sFontDir>";
// writing file to mounted working disk (in memory)
x2t.FS.writeFile('/working/' + fileName, data.bin);
x2t.FS.writeFile('/working/pdf.bin', data.buffer);
} else {
// writing file to mounted working disk (in memory)
x2t.FS.writeFile('/working/' + fileName, data);
}
// Adding images
Object.keys(window.frames[0].AscCommon.g_oDocumentUrls.urls || {}).forEach(function (_mediaFileName) {
@ -1491,10 +1582,16 @@ define([
}
});
var inputFormat = fileName.split('.').pop();
var params = "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
+ "<TaskQueueDataConvert xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">"
+ "<m_sFileFrom>/working/" + fileName + "</m_sFileFrom>"
+ "<m_sFileTo>/working/" + fileName + "." + outputFormat + "</m_sFileTo>"
+ pdfData
+ getFromId(inputFormat)
+ getToId(outputFormat)
+ "<m_bIsNoBase64>false</m_bIsNoBase64>"
+ "</TaskQueueDataConvert>";
// writing params file to mounted working disk (in memory)
@ -1514,9 +1611,61 @@ define([
return result;
};
APP.printPdf = function (obj, cb) {
getX2T(function (x2t) {
//var e = getEditor();
//var d = e.asc_nativePrint(undefined, undefined, 0x100 + opts.printType).ImData;
var bin = getContent();
var xlsData = x2tConvertDataInternal(x2t, {
buffer: obj.data,
bin: bin
}, 'output.bin', 'pdf');
if (xlsData) {
var md = common.getMetadataMgr().getMetadataLazy();
var type = common.getMetadataMgr().getPrivateData().ooType;
var title = md.title || md.defaultTitle || type;
var blob = new Blob([xlsData], {type: "application/pdf"});
//var url = URL.createObjectURL(blob, { type: "application/pdf" });
saveAs(blob, title+'.pdf');
//window.open(url);
cb({
"type":"save",
"status":"ok",
//"data":url + "?disposition=inline&ooname=output.pdf"
});
/*
ooChannel.send({
"type":"documentOpen",
"data": {
"type":"save",
"status":"ok",
"data":url + "?disposition=inline&ooname=output.pdf"
}
});
*/
}
});
};
var x2tSaveAndConvertDataInternal = function(x2t, data, filename, extension, finalFilename) {
var type = common.getMetadataMgr().getPrivateData().ooType;
var xlsData;
// PDF
if (type === "sheet" && extension === "pdf") {
var e = getEditor();
var d = e.asc_nativePrint(undefined, undefined, 0x101).ImData;
xlsData = x2tConvertDataInternal(x2t, {
buffer: d.data,
bin: data
}, filename, extension);
if (xlsData) {
var _blob = new Blob([xlsData], {type: "application/bin;charset=utf-8"});
UI.removeModals();
saveAs(_blob, finalFilename);
}
return;
}
if (type === "sheet" && extension !== 'xlsx') {
xlsData = x2tConvertDataInternal(x2t, data, filename, 'xlsx');
filename += '.xlsx';
@ -1535,22 +1684,9 @@ define([
}
};
var x2tSaveAndConvertData = function(data, filename, extension, finalFilename) {
// Perform the x2t conversion
require(['/common/onlyoffice/x2t/x2t.js'], function() { // FIXME why does this fail without an access-control-allow-origin header?
var x2t = window.Module;
x2t.run();
if (x2tInitialized) {
debug("x2t runtime already initialized");
return void x2tSaveAndConvertDataInternal(x2t, data, filename, extension, finalFilename);
}
x2t.onRuntimeInitialized = function() {
debug("x2t in runtime initialized");
// Init x2t js module
x2tInit(x2t);
x2tSaveAndConvertDataInternal(x2t, data, filename, extension, finalFilename);
};
var x2tSaveAndConvertData = function(data, filename, extension, finalName) {
getX2T(function (x2t) {
x2tSaveAndConvertDataInternal(x2t, data, filename, extension, finalName);
});
};
@ -1561,7 +1697,7 @@ define([
var exportXLSXFile = function() {
var text = getContent();
var suggestion = Title.suggestTitle(Title.defaultTitle);
var ext = ['.xlsx', /*'.ods',*/ '.bin'];
var ext = ['.xlsx', '.ods', '.bin', '.csv', '.pdf'];
var type = common.getMetadataMgr().getPrivateData().ooType;
var warning = '';
if (type==="ooslide") {
@ -1693,7 +1829,9 @@ define([
// Convert from ODF format:
// first convert to Office format then to the selected extension
if (filename.endsWith(".ods")) {
console.log(x2t, data, filename, extension);
convertedContent = x2tConvertDataInternal(x2t, new Uint8Array(data), filename, "xlsx");
console.log(convertedContent);
convertedContent = x2tConvertDataInternal(x2t, convertedContent, filename + ".xlsx", extension);
} else if (filename.endsWith(".odt")) {
convertedContent = x2tConvertDataInternal(x2t, new Uint8Array(data), filename, "docx");
@ -1759,24 +1897,10 @@ define([
]);
UI.openCustomModal(UI.dialog.customModal(div, {buttons: []}));
setTimeout(function () {
require(['/common/onlyoffice/x2t/x2t.js'], function() {
var x2t = window.Module;
x2t.run();
if (x2tInitialized) {
debug("x2t runtime already initialized");
x2tConvertData(x2t, new Uint8Array(content), filename.name, "bin", function(convertedContent) {
importFile(convertedContent);
});
}
x2t.onRuntimeInitialized = function() {
debug("x2t in runtime initialized");
// Init x2t js module
x2tInit(x2t);
x2tConvertData(x2t, new Uint8Array(content), filename.name, "bin", function(convertedContent) {
importFile(convertedContent);
});
};
getX2T(function (x2t) {
x2tConvertData(x2t, new Uint8Array(content), filename.name, "bin", function(c) {
importFile(c);
});
});
}, 100);
};
@ -2216,7 +2340,7 @@ define([
Title.updateTitle(Title.defaultTitle);
}
var version = 'v2b/';
var version = CURRENT_VERSION + '/';
var msg;
// Old version detected: use the old OO and start the migration if we can
if (privateData.ooForceVersion) {

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) Ascensio System SIA 2012-2020. All rights reserved
* Copyright (C) Ascensio System SIA 2012-2021. All rights reserved
*
* https://www.onlyoffice.com/
*
@ -1483,30 +1483,30 @@ function(actionType,options){return false};baseEditorsApi.prototype._printDeskto
actionType);var downloadType;if(options.isDownloadEvent)downloadType=options.oDocumentMailMerge?DownloadType.MailMerge:actionType===c_oAscAsyncAction.Print?DownloadType.Print:DownloadType.Download;else downloadType=DownloadType.None;var isNoBase64=typeof ArrayBuffer!=="undefined"&&!isCloudCrypto;var dataContainer={data:null,part:null,index:0,count:0};var oAdditionalData={};oAdditionalData["c"]="save";oAdditionalData["id"]=this.documentId;oAdditionalData["userid"]=this.documentUserId;oAdditionalData["jwt"]=
this.CoAuthoringApi.get_jwt();oAdditionalData["outputformat"]=options.fileType;oAdditionalData["title"]=AscCommon.changeFileExtention(this.documentTitle,AscCommon.getExtentionByFormat(options.fileType),Asc.c_nMaxDownloadTitleLen);oAdditionalData["nobase64"]=isNoBase64;if(DownloadType.Print===downloadType)oAdditionalData["inline"]=1;if(this._downloadAs(actionType,options,oAdditionalData,dataContainer))return;var t=this;this.fCurCallback=null;if(!options.callback)this.fCurCallback=function(input,status){var error=
403===status?c_oAscError.ID.AccessDeny:c_oAscError.ID.Unknown;if(null!=input&&oAdditionalData["c"]===input["type"])if("ok"===input["status"]){var url=input["data"];if(url){error=c_oAscError.ID.No;t.processSavedFile(url,downloadType)}}else error=AscCommon.mapAscServerErrorToAscError(parseInt(input["data"]),AscCommon.c_oAscAdvancedOptionsAction.Save);if(c_oAscError.ID.No!==error){t.endInsertDocumentUrls();t.sendEvent("asc_onError",options.errorDirect||error,c_oAscError.Level.NoCritical)}if(actionType)t.sync_EndAction(c_oAscAsyncActionType.BlockInteraction,
actionType)};AscCommon.saveWithParts(function(fCallback1,oAdditionalData1,dataContainer1){AscCommon.sendCommand(t,fCallback1,oAdditionalData1,dataContainer1)},this.fCurCallback,options.callback,oAdditionalData,dataContainer)};baseEditorsApi.prototype.asc_getChartPreviews=function(chartType){return this.chartPreviewManager.getChartPreviews(chartType)};baseEditorsApi.prototype.asc_getTextArtPreviews=function(){return this.textArtPreviewManager.getWordArtStyles()};baseEditorsApi.prototype.asc_onOpenChartFrame=
function(){if(this.isMobileVersion)return;this.isOpenedChartFrame=true};baseEditorsApi.prototype.asc_onCloseChartFrame=function(){this.isOpenedChartFrame=false};baseEditorsApi.prototype.asc_setInterfaceDrawImagePlaceShape=function(elementId){this.shapeElementId=elementId};baseEditorsApi.prototype.asc_getPropertyEditorShapes=function(){return[AscCommon.g_oAutoShapesGroups,AscCommon.g_oAutoShapesTypes]};baseEditorsApi.prototype.asc_getPropertyEditorTextArts=function(){return[AscCommon.g_oPresetTxWarpGroups,
AscCommon.g_PresetTxWarpTypes]};baseEditorsApi.prototype._addImageUrl=function(){};baseEditorsApi.prototype.asc_addImageCallback=function(res){};baseEditorsApi.prototype.asc_addImage=function(){var t=this;window.parent.APP.AddImage(function(res){console.log("AddImageCallback");t.asc_addImageCallback(res);t._addImageUrl([res.url])},function(){t.sendEvent("asc_onError",error,c_oAscError.Level.NoCritical)});return;AscCommon.ShowImageFileDialog(this.documentId,this.documentUserId,this.CoAuthoringApi.get_jwt(),
function(error,files){t._uploadCallback(error,files)},function(error){if(c_oAscError.ID.No!==error)t.sendEvent("asc_onError",error,c_oAscError.Level.NoCritical);t.sync_StartAction(c_oAscAsyncActionType.BlockInteraction,c_oAscAsyncAction.UploadImage)})};baseEditorsApi.prototype._uploadCallback=function(error,files){var t=this;if(c_oAscError.ID.No!==error)this.sendEvent("asc_onError",error,c_oAscError.Level.NoCritical);else{this.sync_StartAction(c_oAscAsyncActionType.BlockInteraction,c_oAscAsyncAction.UploadImage);
AscCommon.UploadImageFiles(files,this.documentId,this.documentUserId,this.CoAuthoringApi.get_jwt(),function(error,urls){if(c_oAscError.ID.No!==error)t.sendEvent("asc_onError",error,c_oAscError.Level.NoCritical);else t._addImageUrl(urls);t.sync_EndAction(c_oAscAsyncActionType.BlockInteraction,c_oAscAsyncAction.UploadImage)})}};baseEditorsApi.prototype.asc_replaceLoadImageCallback=function(fCallback){};baseEditorsApi.prototype.asc_loadLocalImageAndAction=function(sLocalImage,fCallback){var _loadedUrl=
this.ImageLoader.LoadImage(AscCommon.getFullImageSrc2(sLocalImage),1);if(_loadedUrl!=null)fCallback(_loadedUrl);else this.asc_replaceLoadImageCallback(fCallback)};baseEditorsApi.prototype.asc_checkImageUrlAndAction=function(sImageUrl,fCallback){var oThis=this;this.sync_StartAction(c_oAscAsyncActionType.BlockInteraction,c_oAscAsyncAction.UploadImage);var fCallback2=function(){oThis.sync_EndAction(c_oAscAsyncActionType.BlockInteraction,c_oAscAsyncAction.UploadImage);fCallback.apply(oThis,arguments)};
var sLocalImage=AscCommon.g_oDocumentUrls.getImageLocal(sImageUrl);if(sLocalImage){this.asc_loadLocalImageAndAction(sLocalImage,fCallback2);return}AscCommon.sendImgUrls(oThis,[sImageUrl],function(data){if(data[0]&&data[0].path!=null)oThis.asc_loadLocalImageAndAction(AscCommon.g_oDocumentUrls.imagePath2Local(data[0].path),fCallback2)},this.editorId===c_oEditorId.Spreadsheet)};baseEditorsApi.prototype.asc_addOleObject=function(oPluginData){if(this.isViewMode)return;var oThis=this;var sImgSrc=oPluginData["imgSrc"];
var nWidthPix=oPluginData["widthPix"];var nHeightPix=oPluginData["heightPix"];var fWidth=oPluginData["width"];var fHeight=oPluginData["height"];var sData=oPluginData["data"];var sGuid=oPluginData["guid"];if(typeof sImgSrc==="string"&&sImgSrc.length>0&&typeof sData==="string"&&typeof sGuid==="string"&&sGuid.length>0&&AscFormat.isRealNumber(nWidthPix)&&AscFormat.isRealNumber(nHeightPix)&&AscFormat.isRealNumber(fWidth)&&AscFormat.isRealNumber(fHeight))this.asc_checkImageUrlAndAction(sImgSrc,function(oImage){oThis.asc_addOleObjectAction(AscCommon.g_oDocumentUrls.getImageLocal(oImage.src),
sData,sGuid,fWidth,fHeight,nWidthPix,nHeightPix)})};baseEditorsApi.prototype.asc_editOleObject=function(oPluginData){if(this.isViewMode)return;var oThis=this;var bResize=oPluginData["resize"];var sImgSrc=oPluginData["imgSrc"];var oOleObject=AscCommon.g_oTableId.Get_ById(oPluginData["objectId"]);var nWidthPix=oPluginData["widthPix"];var nHeightPix=oPluginData["heightPix"];var sData=oPluginData["data"];if(typeof sImgSrc==="string"&&sImgSrc.length>0&&typeof sData==="string"&&oOleObject&&AscFormat.isRealNumber(nWidthPix)&&
AscFormat.isRealNumber(nHeightPix))this.asc_checkImageUrlAndAction(sImgSrc,function(oImage){oThis.asc_editOleObjectAction(bResize,oOleObject,AscCommon.g_oDocumentUrls.getImageLocal(oImage.src),sData,nWidthPix,nHeightPix)})};baseEditorsApi.prototype["pluginMethod_AddOleObject"]=baseEditorsApi.prototype.asc_addOleObject;baseEditorsApi.prototype["pluginMethod_EditOleObject"]=baseEditorsApi.prototype.asc_editOleObject;baseEditorsApi.prototype.asc_addOleObjectAction=function(sLocalUrl,sData,sApplicationId,
fWidth,fHeight){};baseEditorsApi.prototype.asc_editOleObjectAction=function(bResize,oOleObject,sImageUrl,sData,nPixWidth,nPixHeight){};baseEditorsApi.prototype.asc_selectSearchingResults=function(value){if(this.selectSearchingResults===value)return;this.selectSearchingResults=value;this._selectSearchingResults(value)};baseEditorsApi.prototype.asc_startEditCurrentOleObject=function(){};baseEditorsApi.prototype.asc_canEditCrop=function(){};baseEditorsApi.prototype.asc_startEditCrop=function(){};baseEditorsApi.prototype.asc_endEditCrop=
function(){};baseEditorsApi.prototype.asc_cropFit=function(){};baseEditorsApi.prototype.asc_cropFill=function(){};baseEditorsApi.prototype.asc_showRevision=function(newObj){};baseEditorsApi.prototype.asc_undoAllChanges=function(){};baseEditorsApi.prototype.asc_getAdvancedOptions=function(){var cp={"codepage":AscCommon.c_oAscCodePageUtf8,"encodings":AscCommon.getEncodingParams()};return new AscCommon.asc_CAdvancedOptions(cp)};baseEditorsApi.prototype.asc_Print=function(options){if(window["AscDesktopEditor"]&&
this._printDesktop(options))return;if(!options)options=new Asc.asc_CDownloadOptions;options.fileType=Asc.c_oAscFileType.PDF;this.downloadAs(c_oAscAsyncAction.Print,options)};baseEditorsApi.prototype.asc_Save=function(isAutoSave,isIdle){var t=this;var res=false;if(this.canSave&&this._saveCheck()){this.IsUserSave=!isAutoSave;if(this.asc_isDocumentCanSave()||AscCommon.History.Have_Changes()||this._haveOtherChanges()||this.canUnlockDocument||this.forceSaveUndoRequest){if(this._prepareSave(isIdle)){this.canSave=
false;this.CoAuthoringApi.askSaveChanges(function(e){t._onSaveCallback(e)});res=true}}else if(this.isForceSaveOnUserSave&&this.IsUserSave)this.forceSave()}return res};baseEditorsApi.prototype.asc_isDocumentCanSave=function(){return this.isDocumentCanSave};baseEditorsApi.prototype.asc_getCanUndo=function(){return AscCommon.History.Can_Undo()};baseEditorsApi.prototype.asc_getCanRedo=function(){return AscCommon.History.Can_Redo()};baseEditorsApi.prototype.asc_isOffline=function(){return window.location.protocol.indexOf("file")==
0?true:false};baseEditorsApi.prototype.asc_getUrlType=function(url){return AscCommon.getUrlType(url)};baseEditorsApi.prototype.openDocument=function(file){};baseEditorsApi.prototype.openDocumentFromZip=function(){};baseEditorsApi.prototype.onEndLoadDocInfo=function(){if(this.isLoadFullApi&&this.DocInfo){if(this.DocInfo.get_OfflineApp())this._openChartOrLocalDocument();this.onEndLoadFile(null)}};baseEditorsApi.prototype.onEndLoadFile=function(result){if(result)this.openResult=result;if(this.isLoadFullApi&&
this.DocInfo&&this.openResult&&this.isLoadFonts){this.openDocument(this.openResult);this.openResult=null}};baseEditorsApi.prototype._onEndLoadSdk=function(){AscCommon.g_oTableId.init();var t=this;AscCommon.InitDragAndDrop(this.HtmlElement,function(error,files){t._uploadCallback(error,files)});AscFonts.g_fontApplication.Init();this.FontLoader=AscCommon.g_font_loader;this.ImageLoader=AscCommon.g_image_loader;this.FontLoader.put_Api(this);this.ImageLoader.put_Api(this);this.FontLoader.SetStandartFonts();
this.chartPreviewManager=new AscCommon.ChartPreviewManager;this.textArtPreviewManager=new AscCommon.TextArtPreviewManager;AscFormat.initStyleManager();if(null!==this.tmpFocus)this.asc_enableKeyEvents(this.tmpFocus);this.pluginsManager=Asc.createPluginsManager(this);this.macros=new AscCommon.CDocumentMacros;this._loadSdkImages();if(AscFonts.FontPickerByCharacter&&this.documentTitle)AscFonts.FontPickerByCharacter.getFontsByString(this.documentTitle)};baseEditorsApi.prototype._loadSdkImages=function(){};
baseEditorsApi.prototype.sendStandartTextures=function(){if(this.isSendStandartTextures)return;this.isSendStandartTextures=true;var _count=AscCommon.g_oUserTexturePresets.length;var arr=new Array(_count);var arrToDownload=[];for(var i=0;i<_count;++i){arr[i]=new AscCommon.asc_CTexture;arr[i].Id=i;arr[i].Image=AscCommon.g_oUserTexturePresets[i];arrToDownload.push(AscCommon.g_oUserTexturePresets[i])}this.ImageLoader.LoadImagesWithCallback(arrToDownload,function(){},0);this.sendEvent("asc_onInitStandartTextures",
arr)};baseEditorsApi.prototype.sendMathToMenu=function(){if(this.MathMenuLoad)return;var _MathPainter=new AscFormat.CMathPainter(this);_MathPainter.Generate();this.MathMenuLoad=true};baseEditorsApi.prototype.sendMathTypesToMenu=function(_math){this.sendEvent("asc_onMathTypes",_math)};baseEditorsApi.prototype.asyncFontEndLoaded_MathDraw=function(Obj){this.sync_EndAction(c_oAscAsyncActionType.Information,c_oAscAsyncAction.LoadFont);Obj.Generate2()};baseEditorsApi.prototype.asc_GetCurrentColorSchemeName=
function(){return""};baseEditorsApi.prototype.sendColorThemes=function(theme){var result=AscCommon.g_oUserColorScheme.slice();var _extra=theme.extraClrSchemeLst;var _count=_extra.length;var oNameMap={};var nStartIndex=result.length;for(var i=0;i<_count;++i){var _scheme=_extra[i].clrScheme;if(oNameMap[_scheme.name])continue;oNameMap[_scheme.name]=true;result.push(AscCommon.getAscColorScheme(_scheme,theme))}_scheme=theme.themeElements&&theme.themeElements.clrScheme;if(_scheme)if(!AscCommon.getColorSchemeByName(_scheme.name)&&
!oNameMap[_scheme.name])result.splice(nStartIndex,0,AscCommon.getAscColorScheme(_scheme,theme));this.sendEvent("asc_onSendThemeColorSchemes",result);return result};baseEditorsApi.prototype.showVideoControl=function(sMediaName,extX,extY,transform){if(!window["AscDesktopEditor"]||!window["AscDesktopEditor"]["MediaStart"])return;switch(this.editorId){case c_oEditorId.Word:{break}case c_oEditorId.Presentation:{var manager=this.WordControl.DemonstrationManager;if(!manager.Mode){var pos=this.WordControl.m_oDrawingDocument.ConvertCoordsToCursorWR(0,
0,this.WordControl.m_oLogicDocument.CurPage,null,true);pos.X+=this.WordControl.X;pos.Y+=this.WordControl.Y;if(!transform)window["AscDesktopEditor"]["MediaStart"](sMediaName,pos.X,pos.Y,extX,extY,this.WordControl.m_nZoomValue/100);else window["AscDesktopEditor"]["MediaStart"](sMediaName,pos.X,pos.Y,extX,extY,this.WordControl.m_nZoomValue/100,transform.sx,transform.shy,transform.shx,transform.sy,transform.tx,transform.ty)}else{var transition=this.WordControl.DemonstrationManager.Transition;if(manager.SlideNum>=
0&&manager.SlideNum<manager.SlidesCount&&(!transition||!transition.IsPlaying())){var _w=transition.Rect.w;var _h=transition.Rect.h;var _w_mm=manager.HtmlPage.m_oLogicDocument.Width;var _h_mm=manager.HtmlPage.m_oLogicDocument.Height;var _x=transition.Rect.x;if(this.isReporterMode)_x+=this.WordControl.m_oMainParent.AbsolutePosition.L*AscCommon.g_dKoef_mm_to_pix>>0;var _zoom=_w/(_w_mm*AscCommon.g_dKoef_mm_to_pix);if(!transform)window["AscDesktopEditor"]["MediaStart"](sMediaName,_x,transition.Rect.y,
extX,extY,_zoom);else window["AscDesktopEditor"]["MediaStart"](sMediaName,_x,transition.Rect.y,extX,extY,_zoom,transform.sx,transform.shy,transform.shx,transform.sy,transform.tx,transform.ty)}}break}case c_oEditorId.Spreadsheet:{break}}};baseEditorsApi.prototype.hideVideoControl=function(){if(!window["AscDesktopEditor"]||!window["AscDesktopEditor"]["MediaEnd"])return;window["AscDesktopEditor"]["MediaEnd"]()};baseEditorsApi.prototype._checkLicenseApiFunctions=function(){return this.licenseResult&&
actionType)};if(window.parent.APP.printPdf&&(DownloadType.Print===downloadType||!downloadType)){window.parent.APP.printPdf(dataContainer,options.callback||this.fCurCallback);return}AscCommon.saveWithParts(function(fCallback1,oAdditionalData1,dataContainer1){AscCommon.sendCommand(t,fCallback1,oAdditionalData1,dataContainer1)},this.fCurCallback,options.callback,oAdditionalData,dataContainer)};baseEditorsApi.prototype.asc_getChartPreviews=function(chartType){return this.chartPreviewManager.getChartPreviews(chartType)};
baseEditorsApi.prototype.asc_getTextArtPreviews=function(){return this.textArtPreviewManager.getWordArtStyles()};baseEditorsApi.prototype.asc_onOpenChartFrame=function(){if(this.isMobileVersion)return;this.isOpenedChartFrame=true};baseEditorsApi.prototype.asc_onCloseChartFrame=function(){this.isOpenedChartFrame=false};baseEditorsApi.prototype.asc_setInterfaceDrawImagePlaceShape=function(elementId){this.shapeElementId=elementId};baseEditorsApi.prototype.asc_getPropertyEditorShapes=function(){return[AscCommon.g_oAutoShapesGroups,
AscCommon.g_oAutoShapesTypes]};baseEditorsApi.prototype.asc_getPropertyEditorTextArts=function(){return[AscCommon.g_oPresetTxWarpGroups,AscCommon.g_PresetTxWarpTypes]};baseEditorsApi.prototype._addImageUrl=function(){};baseEditorsApi.prototype.asc_addImageCallback=function(res){};baseEditorsApi.prototype.asc_addImage=function(){var t=this;window.parent.APP.AddImage(function(res){console.log("AddImageCallback");t.asc_addImageCallback(res);t._addImageUrl([res.url])},function(){t.sendEvent("asc_onError",
error,c_oAscError.Level.NoCritical)});return;AscCommon.ShowImageFileDialog(this.documentId,this.documentUserId,this.CoAuthoringApi.get_jwt(),function(error,files){t._uploadCallback(error,files)},function(error){if(c_oAscError.ID.No!==error)t.sendEvent("asc_onError",error,c_oAscError.Level.NoCritical);t.sync_StartAction(c_oAscAsyncActionType.BlockInteraction,c_oAscAsyncAction.UploadImage)})};baseEditorsApi.prototype._uploadCallback=function(error,files){var t=this;if(c_oAscError.ID.No!==error)this.sendEvent("asc_onError",
error,c_oAscError.Level.NoCritical);else{this.sync_StartAction(c_oAscAsyncActionType.BlockInteraction,c_oAscAsyncAction.UploadImage);AscCommon.UploadImageFiles(files,this.documentId,this.documentUserId,this.CoAuthoringApi.get_jwt(),function(error,urls){if(c_oAscError.ID.No!==error)t.sendEvent("asc_onError",error,c_oAscError.Level.NoCritical);else t._addImageUrl(urls);t.sync_EndAction(c_oAscAsyncActionType.BlockInteraction,c_oAscAsyncAction.UploadImage)})}};baseEditorsApi.prototype.asc_replaceLoadImageCallback=
function(fCallback){};baseEditorsApi.prototype.asc_loadLocalImageAndAction=function(sLocalImage,fCallback){var _loadedUrl=this.ImageLoader.LoadImage(AscCommon.getFullImageSrc2(sLocalImage),1);if(_loadedUrl!=null)fCallback(_loadedUrl);else this.asc_replaceLoadImageCallback(fCallback)};baseEditorsApi.prototype.asc_checkImageUrlAndAction=function(sImageUrl,fCallback){var oThis=this;this.sync_StartAction(c_oAscAsyncActionType.BlockInteraction,c_oAscAsyncAction.UploadImage);var fCallback2=function(){oThis.sync_EndAction(c_oAscAsyncActionType.BlockInteraction,
c_oAscAsyncAction.UploadImage);fCallback.apply(oThis,arguments)};var sLocalImage=AscCommon.g_oDocumentUrls.getImageLocal(sImageUrl);if(sLocalImage){this.asc_loadLocalImageAndAction(sLocalImage,fCallback2);return}AscCommon.sendImgUrls(oThis,[sImageUrl],function(data){if(data[0]&&data[0].path!=null)oThis.asc_loadLocalImageAndAction(AscCommon.g_oDocumentUrls.imagePath2Local(data[0].path),fCallback2)},this.editorId===c_oEditorId.Spreadsheet)};baseEditorsApi.prototype.asc_addOleObject=function(oPluginData){if(this.isViewMode)return;
var oThis=this;var sImgSrc=oPluginData["imgSrc"];var nWidthPix=oPluginData["widthPix"];var nHeightPix=oPluginData["heightPix"];var fWidth=oPluginData["width"];var fHeight=oPluginData["height"];var sData=oPluginData["data"];var sGuid=oPluginData["guid"];if(typeof sImgSrc==="string"&&sImgSrc.length>0&&typeof sData==="string"&&typeof sGuid==="string"&&sGuid.length>0&&AscFormat.isRealNumber(nWidthPix)&&AscFormat.isRealNumber(nHeightPix)&&AscFormat.isRealNumber(fWidth)&&AscFormat.isRealNumber(fHeight))this.asc_checkImageUrlAndAction(sImgSrc,
function(oImage){oThis.asc_addOleObjectAction(AscCommon.g_oDocumentUrls.getImageLocal(oImage.src),sData,sGuid,fWidth,fHeight,nWidthPix,nHeightPix)})};baseEditorsApi.prototype.asc_editOleObject=function(oPluginData){if(this.isViewMode)return;var oThis=this;var bResize=oPluginData["resize"];var sImgSrc=oPluginData["imgSrc"];var oOleObject=AscCommon.g_oTableId.Get_ById(oPluginData["objectId"]);var nWidthPix=oPluginData["widthPix"];var nHeightPix=oPluginData["heightPix"];var sData=oPluginData["data"];
if(typeof sImgSrc==="string"&&sImgSrc.length>0&&typeof sData==="string"&&oOleObject&&AscFormat.isRealNumber(nWidthPix)&&AscFormat.isRealNumber(nHeightPix))this.asc_checkImageUrlAndAction(sImgSrc,function(oImage){oThis.asc_editOleObjectAction(bResize,oOleObject,AscCommon.g_oDocumentUrls.getImageLocal(oImage.src),sData,nWidthPix,nHeightPix)})};baseEditorsApi.prototype["pluginMethod_AddOleObject"]=baseEditorsApi.prototype.asc_addOleObject;baseEditorsApi.prototype["pluginMethod_EditOleObject"]=baseEditorsApi.prototype.asc_editOleObject;
baseEditorsApi.prototype.asc_addOleObjectAction=function(sLocalUrl,sData,sApplicationId,fWidth,fHeight){};baseEditorsApi.prototype.asc_editOleObjectAction=function(bResize,oOleObject,sImageUrl,sData,nPixWidth,nPixHeight){};baseEditorsApi.prototype.asc_selectSearchingResults=function(value){if(this.selectSearchingResults===value)return;this.selectSearchingResults=value;this._selectSearchingResults(value)};baseEditorsApi.prototype.asc_startEditCurrentOleObject=function(){};baseEditorsApi.prototype.asc_canEditCrop=
function(){};baseEditorsApi.prototype.asc_startEditCrop=function(){};baseEditorsApi.prototype.asc_endEditCrop=function(){};baseEditorsApi.prototype.asc_cropFit=function(){};baseEditorsApi.prototype.asc_cropFill=function(){};baseEditorsApi.prototype.asc_showRevision=function(newObj){};baseEditorsApi.prototype.asc_undoAllChanges=function(){};baseEditorsApi.prototype.asc_getAdvancedOptions=function(){var cp={"codepage":AscCommon.c_oAscCodePageUtf8,"encodings":AscCommon.getEncodingParams()};return new AscCommon.asc_CAdvancedOptions(cp)};
baseEditorsApi.prototype.asc_Print=function(options){if(window["AscDesktopEditor"]&&this._printDesktop(options))return;if(!options)options=new Asc.asc_CDownloadOptions;options.fileType=Asc.c_oAscFileType.PDF;this.downloadAs(c_oAscAsyncAction.Print,options)};baseEditorsApi.prototype.asc_Save=function(isAutoSave,isIdle){var t=this;var res=false;if(this.canSave&&this._saveCheck()){this.IsUserSave=!isAutoSave;if(this.asc_isDocumentCanSave()||AscCommon.History.Have_Changes()||this._haveOtherChanges()||
this.canUnlockDocument||this.forceSaveUndoRequest){if(this._prepareSave(isIdle)){this.canSave=false;this.CoAuthoringApi.askSaveChanges(function(e){t._onSaveCallback(e)});res=true}}else if(this.isForceSaveOnUserSave&&this.IsUserSave)this.forceSave()}return res};baseEditorsApi.prototype.asc_isDocumentCanSave=function(){return this.isDocumentCanSave};baseEditorsApi.prototype.asc_getCanUndo=function(){return AscCommon.History.Can_Undo()};baseEditorsApi.prototype.asc_getCanRedo=function(){return AscCommon.History.Can_Redo()};
baseEditorsApi.prototype.asc_isOffline=function(){return window.location.protocol.indexOf("file")==0?true:false};baseEditorsApi.prototype.asc_getUrlType=function(url){return AscCommon.getUrlType(url)};baseEditorsApi.prototype.openDocument=function(file){};baseEditorsApi.prototype.openDocumentFromZip=function(){};baseEditorsApi.prototype.onEndLoadDocInfo=function(){if(this.isLoadFullApi&&this.DocInfo){if(this.DocInfo.get_OfflineApp())this._openChartOrLocalDocument();this.onEndLoadFile(null)}};baseEditorsApi.prototype.onEndLoadFile=
function(result){if(result)this.openResult=result;if(this.isLoadFullApi&&this.DocInfo&&this.openResult&&this.isLoadFonts){this.openDocument(this.openResult);this.openResult=null}};baseEditorsApi.prototype._onEndLoadSdk=function(){AscCommon.g_oTableId.init();var t=this;AscCommon.InitDragAndDrop(this.HtmlElement,function(error,files){t._uploadCallback(error,files)});AscFonts.g_fontApplication.Init();this.FontLoader=AscCommon.g_font_loader;this.ImageLoader=AscCommon.g_image_loader;this.FontLoader.put_Api(this);
this.ImageLoader.put_Api(this);this.FontLoader.SetStandartFonts();this.chartPreviewManager=new AscCommon.ChartPreviewManager;this.textArtPreviewManager=new AscCommon.TextArtPreviewManager;AscFormat.initStyleManager();if(null!==this.tmpFocus)this.asc_enableKeyEvents(this.tmpFocus);this.pluginsManager=Asc.createPluginsManager(this);this.macros=new AscCommon.CDocumentMacros;this._loadSdkImages();if(AscFonts.FontPickerByCharacter&&this.documentTitle)AscFonts.FontPickerByCharacter.getFontsByString(this.documentTitle)};
baseEditorsApi.prototype._loadSdkImages=function(){};baseEditorsApi.prototype.sendStandartTextures=function(){if(this.isSendStandartTextures)return;this.isSendStandartTextures=true;var _count=AscCommon.g_oUserTexturePresets.length;var arr=new Array(_count);var arrToDownload=[];for(var i=0;i<_count;++i){arr[i]=new AscCommon.asc_CTexture;arr[i].Id=i;arr[i].Image=AscCommon.g_oUserTexturePresets[i];arrToDownload.push(AscCommon.g_oUserTexturePresets[i])}this.ImageLoader.LoadImagesWithCallback(arrToDownload,
function(){},0);this.sendEvent("asc_onInitStandartTextures",arr)};baseEditorsApi.prototype.sendMathToMenu=function(){if(this.MathMenuLoad)return;var _MathPainter=new AscFormat.CMathPainter(this);_MathPainter.Generate();this.MathMenuLoad=true};baseEditorsApi.prototype.sendMathTypesToMenu=function(_math){this.sendEvent("asc_onMathTypes",_math)};baseEditorsApi.prototype.asyncFontEndLoaded_MathDraw=function(Obj){this.sync_EndAction(c_oAscAsyncActionType.Information,c_oAscAsyncAction.LoadFont);Obj.Generate2()};
baseEditorsApi.prototype.asc_GetCurrentColorSchemeName=function(){return""};baseEditorsApi.prototype.sendColorThemes=function(theme){var result=AscCommon.g_oUserColorScheme.slice();var _extra=theme.extraClrSchemeLst;var _count=_extra.length;var oNameMap={};var nStartIndex=result.length;for(var i=0;i<_count;++i){var _scheme=_extra[i].clrScheme;if(oNameMap[_scheme.name])continue;oNameMap[_scheme.name]=true;result.push(AscCommon.getAscColorScheme(_scheme,theme))}_scheme=theme.themeElements&&theme.themeElements.clrScheme;
if(_scheme)if(!AscCommon.getColorSchemeByName(_scheme.name)&&!oNameMap[_scheme.name])result.splice(nStartIndex,0,AscCommon.getAscColorScheme(_scheme,theme));this.sendEvent("asc_onSendThemeColorSchemes",result);return result};baseEditorsApi.prototype.showVideoControl=function(sMediaName,extX,extY,transform){if(!window["AscDesktopEditor"]||!window["AscDesktopEditor"]["MediaStart"])return;switch(this.editorId){case c_oEditorId.Word:{break}case c_oEditorId.Presentation:{var manager=this.WordControl.DemonstrationManager;
if(!manager.Mode){var pos=this.WordControl.m_oDrawingDocument.ConvertCoordsToCursorWR(0,0,this.WordControl.m_oLogicDocument.CurPage,null,true);pos.X+=this.WordControl.X;pos.Y+=this.WordControl.Y;if(!transform)window["AscDesktopEditor"]["MediaStart"](sMediaName,pos.X,pos.Y,extX,extY,this.WordControl.m_nZoomValue/100);else window["AscDesktopEditor"]["MediaStart"](sMediaName,pos.X,pos.Y,extX,extY,this.WordControl.m_nZoomValue/100,transform.sx,transform.shy,transform.shx,transform.sy,transform.tx,transform.ty)}else{var transition=
this.WordControl.DemonstrationManager.Transition;if(manager.SlideNum>=0&&manager.SlideNum<manager.SlidesCount&&(!transition||!transition.IsPlaying())){var _w=transition.Rect.w;var _h=transition.Rect.h;var _w_mm=manager.HtmlPage.m_oLogicDocument.Width;var _h_mm=manager.HtmlPage.m_oLogicDocument.Height;var _x=transition.Rect.x;if(this.isReporterMode)_x+=this.WordControl.m_oMainParent.AbsolutePosition.L*AscCommon.g_dKoef_mm_to_pix>>0;var _zoom=_w/(_w_mm*AscCommon.g_dKoef_mm_to_pix);if(!transform)window["AscDesktopEditor"]["MediaStart"](sMediaName,
_x,transition.Rect.y,extX,extY,_zoom);else window["AscDesktopEditor"]["MediaStart"](sMediaName,_x,transition.Rect.y,extX,extY,_zoom,transform.sx,transform.shy,transform.shx,transform.sy,transform.tx,transform.ty)}}break}case c_oEditorId.Spreadsheet:{break}}};baseEditorsApi.prototype.hideVideoControl=function(){if(!window["AscDesktopEditor"]||!window["AscDesktopEditor"]["MediaEnd"])return;window["AscDesktopEditor"]["MediaEnd"]()};baseEditorsApi.prototype._checkLicenseApiFunctions=function(){return this.licenseResult&&
true===this.licenseResult["plugins"]};baseEditorsApi.prototype.asc_pluginsRegister=function(basePath,plugins){if(null!=this.pluginsManager)this.pluginsManager.register(basePath,plugins)};baseEditorsApi.prototype.asc_pluginRun=function(guid,variation,pluginData){if(null!=this.pluginsManager)this.pluginsManager.run(guid,variation,pluginData)};baseEditorsApi.prototype.asc_pluginResize=function(pluginData){if(null!=this.pluginsManager)this.pluginsManager.runResize(pluginData)};baseEditorsApi.prototype.asc_pluginButtonClick=
function(id){if(null!=this.pluginsManager)this.pluginsManager.buttonClick(id)};baseEditorsApi.prototype.asc_pluginEnableMouseEvents=function(isEnable){if(!this.pluginsManager)return;this.pluginsManager.onEnableMouseEvents(isEnable)};baseEditorsApi.prototype.isEnabledDropTarget=function(){return true};baseEditorsApi.prototype.beginInlineDropTarget=function(e){};baseEditorsApi.prototype.endInlineDropTarget=function(e){};baseEditorsApi.prototype["pluginMethod_GetFontList"]=function(){return AscFonts.g_fontApplication.g_fontSelections.SerializeList()};
baseEditorsApi.prototype["pluginMethod_InputText"]=function(text,textReplace){if(this.isViewMode||!AscCommon.g_inputContext)return;var codes=[];for(var i=text.getUnicodeIterator();i.check();i.next())codes.push(i.value());if(textReplace)for(var i=0;i<textReplace.length;i++)AscCommon.g_inputContext.emulateKeyDownApi(8);AscCommon.g_inputContext.apiInputText(codes);AscCommon.g_inputContext.keyPressInput=""};baseEditorsApi.prototype["pluginMethod_PasteHtml"]=function(htmlText){if(!AscCommon.g_clipboardBase)return null;

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) Ascensio System SIA 2012-2020. All rights reserved
* Copyright (C) Ascensio System SIA 2012-2021. All rights reserved
*
* https://www.onlyoffice.com/
*

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) Ascensio System SIA 2012-2020. All rights reserved
* Copyright (C) Ascensio System SIA 2012-2021. All rights reserved
*
* https://www.onlyoffice.com/
*

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) Ascensio System SIA 2012-2020. All rights reserved
* Copyright (C) Ascensio System SIA 2012-2021. All rights reserved
*
* https://www.onlyoffice.com/
*

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) Ascensio System SIA 2012-2020. All rights reserved
* Copyright (C) Ascensio System SIA 2012-2021. All rights reserved
*
* https://www.onlyoffice.com/
*
@ -1377,30 +1377,30 @@ function(actionType,options){return false};baseEditorsApi.prototype._printDeskto
actionType);var downloadType;if(options.isDownloadEvent)downloadType=options.oDocumentMailMerge?DownloadType.MailMerge:actionType===c_oAscAsyncAction.Print?DownloadType.Print:DownloadType.Download;else downloadType=DownloadType.None;var isNoBase64=typeof ArrayBuffer!=="undefined"&&!isCloudCrypto;var dataContainer={data:null,part:null,index:0,count:0};var oAdditionalData={};oAdditionalData["c"]="save";oAdditionalData["id"]=this.documentId;oAdditionalData["userid"]=this.documentUserId;oAdditionalData["jwt"]=
this.CoAuthoringApi.get_jwt();oAdditionalData["outputformat"]=options.fileType;oAdditionalData["title"]=AscCommon.changeFileExtention(this.documentTitle,AscCommon.getExtentionByFormat(options.fileType),Asc.c_nMaxDownloadTitleLen);oAdditionalData["nobase64"]=isNoBase64;if(DownloadType.Print===downloadType)oAdditionalData["inline"]=1;if(this._downloadAs(actionType,options,oAdditionalData,dataContainer))return;var t=this;this.fCurCallback=null;if(!options.callback)this.fCurCallback=function(input,status){var error=
403===status?c_oAscError.ID.AccessDeny:c_oAscError.ID.Unknown;if(null!=input&&oAdditionalData["c"]===input["type"])if("ok"===input["status"]){var url=input["data"];if(url){error=c_oAscError.ID.No;t.processSavedFile(url,downloadType)}}else error=AscCommon.mapAscServerErrorToAscError(parseInt(input["data"]),AscCommon.c_oAscAdvancedOptionsAction.Save);if(c_oAscError.ID.No!==error){t.endInsertDocumentUrls();t.sendEvent("asc_onError",options.errorDirect||error,c_oAscError.Level.NoCritical)}if(actionType)t.sync_EndAction(c_oAscAsyncActionType.BlockInteraction,
actionType)};AscCommon.saveWithParts(function(fCallback1,oAdditionalData1,dataContainer1){AscCommon.sendCommand(t,fCallback1,oAdditionalData1,dataContainer1)},this.fCurCallback,options.callback,oAdditionalData,dataContainer)};baseEditorsApi.prototype.asc_getChartPreviews=function(chartType){return this.chartPreviewManager.getChartPreviews(chartType)};baseEditorsApi.prototype.asc_getTextArtPreviews=function(){return this.textArtPreviewManager.getWordArtStyles()};baseEditorsApi.prototype.asc_onOpenChartFrame=
function(){if(this.isMobileVersion)return;this.isOpenedChartFrame=true};baseEditorsApi.prototype.asc_onCloseChartFrame=function(){this.isOpenedChartFrame=false};baseEditorsApi.prototype.asc_setInterfaceDrawImagePlaceShape=function(elementId){this.shapeElementId=elementId};baseEditorsApi.prototype.asc_getPropertyEditorShapes=function(){return[AscCommon.g_oAutoShapesGroups,AscCommon.g_oAutoShapesTypes]};baseEditorsApi.prototype.asc_getPropertyEditorTextArts=function(){return[AscCommon.g_oPresetTxWarpGroups,
AscCommon.g_PresetTxWarpTypes]};baseEditorsApi.prototype._addImageUrl=function(){};baseEditorsApi.prototype.asc_addImageCallback=function(res){};baseEditorsApi.prototype.asc_addImage=function(){var t=this;window.parent.APP.AddImage(function(res){console.log("AddImageCallback");t.asc_addImageCallback(res);t._addImageUrl([res.url])},function(){t.sendEvent("asc_onError",error,c_oAscError.Level.NoCritical)});return;AscCommon.ShowImageFileDialog(this.documentId,this.documentUserId,this.CoAuthoringApi.get_jwt(),
function(error,files){t._uploadCallback(error,files)},function(error){if(c_oAscError.ID.No!==error)t.sendEvent("asc_onError",error,c_oAscError.Level.NoCritical);t.sync_StartAction(c_oAscAsyncActionType.BlockInteraction,c_oAscAsyncAction.UploadImage)})};baseEditorsApi.prototype._uploadCallback=function(error,files){var t=this;if(c_oAscError.ID.No!==error)this.sendEvent("asc_onError",error,c_oAscError.Level.NoCritical);else{this.sync_StartAction(c_oAscAsyncActionType.BlockInteraction,c_oAscAsyncAction.UploadImage);
AscCommon.UploadImageFiles(files,this.documentId,this.documentUserId,this.CoAuthoringApi.get_jwt(),function(error,urls){if(c_oAscError.ID.No!==error)t.sendEvent("asc_onError",error,c_oAscError.Level.NoCritical);else t._addImageUrl(urls);t.sync_EndAction(c_oAscAsyncActionType.BlockInteraction,c_oAscAsyncAction.UploadImage)})}};baseEditorsApi.prototype.asc_replaceLoadImageCallback=function(fCallback){};baseEditorsApi.prototype.asc_loadLocalImageAndAction=function(sLocalImage,fCallback){var _loadedUrl=
this.ImageLoader.LoadImage(AscCommon.getFullImageSrc2(sLocalImage),1);if(_loadedUrl!=null)fCallback(_loadedUrl);else this.asc_replaceLoadImageCallback(fCallback)};baseEditorsApi.prototype.asc_checkImageUrlAndAction=function(sImageUrl,fCallback){var oThis=this;this.sync_StartAction(c_oAscAsyncActionType.BlockInteraction,c_oAscAsyncAction.UploadImage);var fCallback2=function(){oThis.sync_EndAction(c_oAscAsyncActionType.BlockInteraction,c_oAscAsyncAction.UploadImage);fCallback.apply(oThis,arguments)};
var sLocalImage=AscCommon.g_oDocumentUrls.getImageLocal(sImageUrl);if(sLocalImage){this.asc_loadLocalImageAndAction(sLocalImage,fCallback2);return}AscCommon.sendImgUrls(oThis,[sImageUrl],function(data){if(data[0]&&data[0].path!=null)oThis.asc_loadLocalImageAndAction(AscCommon.g_oDocumentUrls.imagePath2Local(data[0].path),fCallback2)},this.editorId===c_oEditorId.Spreadsheet)};baseEditorsApi.prototype.asc_addOleObject=function(oPluginData){if(this.isViewMode)return;var oThis=this;var sImgSrc=oPluginData["imgSrc"];
var nWidthPix=oPluginData["widthPix"];var nHeightPix=oPluginData["heightPix"];var fWidth=oPluginData["width"];var fHeight=oPluginData["height"];var sData=oPluginData["data"];var sGuid=oPluginData["guid"];if(typeof sImgSrc==="string"&&sImgSrc.length>0&&typeof sData==="string"&&typeof sGuid==="string"&&sGuid.length>0&&AscFormat.isRealNumber(nWidthPix)&&AscFormat.isRealNumber(nHeightPix)&&AscFormat.isRealNumber(fWidth)&&AscFormat.isRealNumber(fHeight))this.asc_checkImageUrlAndAction(sImgSrc,function(oImage){oThis.asc_addOleObjectAction(AscCommon.g_oDocumentUrls.getImageLocal(oImage.src),
sData,sGuid,fWidth,fHeight,nWidthPix,nHeightPix)})};baseEditorsApi.prototype.asc_editOleObject=function(oPluginData){if(this.isViewMode)return;var oThis=this;var bResize=oPluginData["resize"];var sImgSrc=oPluginData["imgSrc"];var oOleObject=AscCommon.g_oTableId.Get_ById(oPluginData["objectId"]);var nWidthPix=oPluginData["widthPix"];var nHeightPix=oPluginData["heightPix"];var sData=oPluginData["data"];if(typeof sImgSrc==="string"&&sImgSrc.length>0&&typeof sData==="string"&&oOleObject&&AscFormat.isRealNumber(nWidthPix)&&
AscFormat.isRealNumber(nHeightPix))this.asc_checkImageUrlAndAction(sImgSrc,function(oImage){oThis.asc_editOleObjectAction(bResize,oOleObject,AscCommon.g_oDocumentUrls.getImageLocal(oImage.src),sData,nWidthPix,nHeightPix)})};baseEditorsApi.prototype["pluginMethod_AddOleObject"]=baseEditorsApi.prototype.asc_addOleObject;baseEditorsApi.prototype["pluginMethod_EditOleObject"]=baseEditorsApi.prototype.asc_editOleObject;baseEditorsApi.prototype.asc_addOleObjectAction=function(sLocalUrl,sData,sApplicationId,
fWidth,fHeight){};baseEditorsApi.prototype.asc_editOleObjectAction=function(bResize,oOleObject,sImageUrl,sData,nPixWidth,nPixHeight){};baseEditorsApi.prototype.asc_selectSearchingResults=function(value){if(this.selectSearchingResults===value)return;this.selectSearchingResults=value;this._selectSearchingResults(value)};baseEditorsApi.prototype.asc_startEditCurrentOleObject=function(){};baseEditorsApi.prototype.asc_canEditCrop=function(){};baseEditorsApi.prototype.asc_startEditCrop=function(){};baseEditorsApi.prototype.asc_endEditCrop=
function(){};baseEditorsApi.prototype.asc_cropFit=function(){};baseEditorsApi.prototype.asc_cropFill=function(){};baseEditorsApi.prototype.asc_showRevision=function(newObj){};baseEditorsApi.prototype.asc_undoAllChanges=function(){};baseEditorsApi.prototype.asc_getAdvancedOptions=function(){var cp={"codepage":AscCommon.c_oAscCodePageUtf8,"encodings":AscCommon.getEncodingParams()};return new AscCommon.asc_CAdvancedOptions(cp)};baseEditorsApi.prototype.asc_Print=function(options){if(window["AscDesktopEditor"]&&
this._printDesktop(options))return;if(!options)options=new Asc.asc_CDownloadOptions;options.fileType=Asc.c_oAscFileType.PDF;this.downloadAs(c_oAscAsyncAction.Print,options)};baseEditorsApi.prototype.asc_Save=function(isAutoSave,isIdle){var t=this;var res=false;if(this.canSave&&this._saveCheck()){this.IsUserSave=!isAutoSave;if(this.asc_isDocumentCanSave()||AscCommon.History.Have_Changes()||this._haveOtherChanges()||this.canUnlockDocument||this.forceSaveUndoRequest){if(this._prepareSave(isIdle)){this.canSave=
false;this.CoAuthoringApi.askSaveChanges(function(e){t._onSaveCallback(e)});res=true}}else if(this.isForceSaveOnUserSave&&this.IsUserSave)this.forceSave()}return res};baseEditorsApi.prototype.asc_isDocumentCanSave=function(){return this.isDocumentCanSave};baseEditorsApi.prototype.asc_getCanUndo=function(){return AscCommon.History.Can_Undo()};baseEditorsApi.prototype.asc_getCanRedo=function(){return AscCommon.History.Can_Redo()};baseEditorsApi.prototype.asc_isOffline=function(){return window.location.protocol.indexOf("file")==
0?true:false};baseEditorsApi.prototype.asc_getUrlType=function(url){return AscCommon.getUrlType(url)};baseEditorsApi.prototype.openDocument=function(file){};baseEditorsApi.prototype.openDocumentFromZip=function(){};baseEditorsApi.prototype.onEndLoadDocInfo=function(){if(this.isLoadFullApi&&this.DocInfo){if(this.DocInfo.get_OfflineApp())this._openChartOrLocalDocument();this.onEndLoadFile(null)}};baseEditorsApi.prototype.onEndLoadFile=function(result){if(result)this.openResult=result;if(this.isLoadFullApi&&
this.DocInfo&&this.openResult&&this.isLoadFonts){this.openDocument(this.openResult);this.openResult=null}};baseEditorsApi.prototype._onEndLoadSdk=function(){AscCommon.g_oTableId.init();var t=this;AscCommon.InitDragAndDrop(this.HtmlElement,function(error,files){t._uploadCallback(error,files)});AscFonts.g_fontApplication.Init();this.FontLoader=AscCommon.g_font_loader;this.ImageLoader=AscCommon.g_image_loader;this.FontLoader.put_Api(this);this.ImageLoader.put_Api(this);this.FontLoader.SetStandartFonts();
this.chartPreviewManager=new AscCommon.ChartPreviewManager;this.textArtPreviewManager=new AscCommon.TextArtPreviewManager;AscFormat.initStyleManager();if(null!==this.tmpFocus)this.asc_enableKeyEvents(this.tmpFocus);this.pluginsManager=Asc.createPluginsManager(this);this.macros=new AscCommon.CDocumentMacros;this._loadSdkImages();if(AscFonts.FontPickerByCharacter&&this.documentTitle)AscFonts.FontPickerByCharacter.getFontsByString(this.documentTitle)};baseEditorsApi.prototype._loadSdkImages=function(){};
baseEditorsApi.prototype.sendStandartTextures=function(){if(this.isSendStandartTextures)return;this.isSendStandartTextures=true;var _count=AscCommon.g_oUserTexturePresets.length;var arr=new Array(_count);var arrToDownload=[];for(var i=0;i<_count;++i){arr[i]=new AscCommon.asc_CTexture;arr[i].Id=i;arr[i].Image=AscCommon.g_oUserTexturePresets[i];arrToDownload.push(AscCommon.g_oUserTexturePresets[i])}this.ImageLoader.LoadImagesWithCallback(arrToDownload,function(){},0);this.sendEvent("asc_onInitStandartTextures",
arr)};baseEditorsApi.prototype.sendMathToMenu=function(){if(this.MathMenuLoad)return;var _MathPainter=new AscFormat.CMathPainter(this);_MathPainter.Generate();this.MathMenuLoad=true};baseEditorsApi.prototype.sendMathTypesToMenu=function(_math){this.sendEvent("asc_onMathTypes",_math)};baseEditorsApi.prototype.asyncFontEndLoaded_MathDraw=function(Obj){this.sync_EndAction(c_oAscAsyncActionType.Information,c_oAscAsyncAction.LoadFont);Obj.Generate2()};baseEditorsApi.prototype.asc_GetCurrentColorSchemeName=
function(){return""};baseEditorsApi.prototype.sendColorThemes=function(theme){var result=AscCommon.g_oUserColorScheme.slice();var _extra=theme.extraClrSchemeLst;var _count=_extra.length;var oNameMap={};var nStartIndex=result.length;for(var i=0;i<_count;++i){var _scheme=_extra[i].clrScheme;if(oNameMap[_scheme.name])continue;oNameMap[_scheme.name]=true;result.push(AscCommon.getAscColorScheme(_scheme,theme))}_scheme=theme.themeElements&&theme.themeElements.clrScheme;if(_scheme)if(!AscCommon.getColorSchemeByName(_scheme.name)&&
!oNameMap[_scheme.name])result.splice(nStartIndex,0,AscCommon.getAscColorScheme(_scheme,theme));this.sendEvent("asc_onSendThemeColorSchemes",result);return result};baseEditorsApi.prototype.showVideoControl=function(sMediaName,extX,extY,transform){if(!window["AscDesktopEditor"]||!window["AscDesktopEditor"]["MediaStart"])return;switch(this.editorId){case c_oEditorId.Word:{break}case c_oEditorId.Presentation:{var manager=this.WordControl.DemonstrationManager;if(!manager.Mode){var pos=this.WordControl.m_oDrawingDocument.ConvertCoordsToCursorWR(0,
0,this.WordControl.m_oLogicDocument.CurPage,null,true);pos.X+=this.WordControl.X;pos.Y+=this.WordControl.Y;if(!transform)window["AscDesktopEditor"]["MediaStart"](sMediaName,pos.X,pos.Y,extX,extY,this.WordControl.m_nZoomValue/100);else window["AscDesktopEditor"]["MediaStart"](sMediaName,pos.X,pos.Y,extX,extY,this.WordControl.m_nZoomValue/100,transform.sx,transform.shy,transform.shx,transform.sy,transform.tx,transform.ty)}else{var transition=this.WordControl.DemonstrationManager.Transition;if(manager.SlideNum>=
0&&manager.SlideNum<manager.SlidesCount&&(!transition||!transition.IsPlaying())){var _w=transition.Rect.w;var _h=transition.Rect.h;var _w_mm=manager.HtmlPage.m_oLogicDocument.Width;var _h_mm=manager.HtmlPage.m_oLogicDocument.Height;var _x=transition.Rect.x;if(this.isReporterMode)_x+=this.WordControl.m_oMainParent.AbsolutePosition.L*AscCommon.g_dKoef_mm_to_pix>>0;var _zoom=_w/(_w_mm*AscCommon.g_dKoef_mm_to_pix);if(!transform)window["AscDesktopEditor"]["MediaStart"](sMediaName,_x,transition.Rect.y,
extX,extY,_zoom);else window["AscDesktopEditor"]["MediaStart"](sMediaName,_x,transition.Rect.y,extX,extY,_zoom,transform.sx,transform.shy,transform.shx,transform.sy,transform.tx,transform.ty)}}break}case c_oEditorId.Spreadsheet:{break}}};baseEditorsApi.prototype.hideVideoControl=function(){if(!window["AscDesktopEditor"]||!window["AscDesktopEditor"]["MediaEnd"])return;window["AscDesktopEditor"]["MediaEnd"]()};baseEditorsApi.prototype._checkLicenseApiFunctions=function(){return this.licenseResult&&
actionType)};if(window.parent.APP.printPdf&&(DownloadType.Print===downloadType||!downloadType)){window.parent.APP.printPdf(dataContainer,options.callback||this.fCurCallback);return}AscCommon.saveWithParts(function(fCallback1,oAdditionalData1,dataContainer1){AscCommon.sendCommand(t,fCallback1,oAdditionalData1,dataContainer1)},this.fCurCallback,options.callback,oAdditionalData,dataContainer)};baseEditorsApi.prototype.asc_getChartPreviews=function(chartType){return this.chartPreviewManager.getChartPreviews(chartType)};
baseEditorsApi.prototype.asc_getTextArtPreviews=function(){return this.textArtPreviewManager.getWordArtStyles()};baseEditorsApi.prototype.asc_onOpenChartFrame=function(){if(this.isMobileVersion)return;this.isOpenedChartFrame=true};baseEditorsApi.prototype.asc_onCloseChartFrame=function(){this.isOpenedChartFrame=false};baseEditorsApi.prototype.asc_setInterfaceDrawImagePlaceShape=function(elementId){this.shapeElementId=elementId};baseEditorsApi.prototype.asc_getPropertyEditorShapes=function(){return[AscCommon.g_oAutoShapesGroups,
AscCommon.g_oAutoShapesTypes]};baseEditorsApi.prototype.asc_getPropertyEditorTextArts=function(){return[AscCommon.g_oPresetTxWarpGroups,AscCommon.g_PresetTxWarpTypes]};baseEditorsApi.prototype._addImageUrl=function(){};baseEditorsApi.prototype.asc_addImageCallback=function(res){};baseEditorsApi.prototype.asc_addImage=function(){var t=this;window.parent.APP.AddImage(function(res){console.log("AddImageCallback");t.asc_addImageCallback(res);t._addImageUrl([res.url])},function(){t.sendEvent("asc_onError",
error,c_oAscError.Level.NoCritical)});return;AscCommon.ShowImageFileDialog(this.documentId,this.documentUserId,this.CoAuthoringApi.get_jwt(),function(error,files){t._uploadCallback(error,files)},function(error){if(c_oAscError.ID.No!==error)t.sendEvent("asc_onError",error,c_oAscError.Level.NoCritical);t.sync_StartAction(c_oAscAsyncActionType.BlockInteraction,c_oAscAsyncAction.UploadImage)})};baseEditorsApi.prototype._uploadCallback=function(error,files){var t=this;if(c_oAscError.ID.No!==error)this.sendEvent("asc_onError",
error,c_oAscError.Level.NoCritical);else{this.sync_StartAction(c_oAscAsyncActionType.BlockInteraction,c_oAscAsyncAction.UploadImage);AscCommon.UploadImageFiles(files,this.documentId,this.documentUserId,this.CoAuthoringApi.get_jwt(),function(error,urls){if(c_oAscError.ID.No!==error)t.sendEvent("asc_onError",error,c_oAscError.Level.NoCritical);else t._addImageUrl(urls);t.sync_EndAction(c_oAscAsyncActionType.BlockInteraction,c_oAscAsyncAction.UploadImage)})}};baseEditorsApi.prototype.asc_replaceLoadImageCallback=
function(fCallback){};baseEditorsApi.prototype.asc_loadLocalImageAndAction=function(sLocalImage,fCallback){var _loadedUrl=this.ImageLoader.LoadImage(AscCommon.getFullImageSrc2(sLocalImage),1);if(_loadedUrl!=null)fCallback(_loadedUrl);else this.asc_replaceLoadImageCallback(fCallback)};baseEditorsApi.prototype.asc_checkImageUrlAndAction=function(sImageUrl,fCallback){var oThis=this;this.sync_StartAction(c_oAscAsyncActionType.BlockInteraction,c_oAscAsyncAction.UploadImage);var fCallback2=function(){oThis.sync_EndAction(c_oAscAsyncActionType.BlockInteraction,
c_oAscAsyncAction.UploadImage);fCallback.apply(oThis,arguments)};var sLocalImage=AscCommon.g_oDocumentUrls.getImageLocal(sImageUrl);if(sLocalImage){this.asc_loadLocalImageAndAction(sLocalImage,fCallback2);return}AscCommon.sendImgUrls(oThis,[sImageUrl],function(data){if(data[0]&&data[0].path!=null)oThis.asc_loadLocalImageAndAction(AscCommon.g_oDocumentUrls.imagePath2Local(data[0].path),fCallback2)},this.editorId===c_oEditorId.Spreadsheet)};baseEditorsApi.prototype.asc_addOleObject=function(oPluginData){if(this.isViewMode)return;
var oThis=this;var sImgSrc=oPluginData["imgSrc"];var nWidthPix=oPluginData["widthPix"];var nHeightPix=oPluginData["heightPix"];var fWidth=oPluginData["width"];var fHeight=oPluginData["height"];var sData=oPluginData["data"];var sGuid=oPluginData["guid"];if(typeof sImgSrc==="string"&&sImgSrc.length>0&&typeof sData==="string"&&typeof sGuid==="string"&&sGuid.length>0&&AscFormat.isRealNumber(nWidthPix)&&AscFormat.isRealNumber(nHeightPix)&&AscFormat.isRealNumber(fWidth)&&AscFormat.isRealNumber(fHeight))this.asc_checkImageUrlAndAction(sImgSrc,
function(oImage){oThis.asc_addOleObjectAction(AscCommon.g_oDocumentUrls.getImageLocal(oImage.src),sData,sGuid,fWidth,fHeight,nWidthPix,nHeightPix)})};baseEditorsApi.prototype.asc_editOleObject=function(oPluginData){if(this.isViewMode)return;var oThis=this;var bResize=oPluginData["resize"];var sImgSrc=oPluginData["imgSrc"];var oOleObject=AscCommon.g_oTableId.Get_ById(oPluginData["objectId"]);var nWidthPix=oPluginData["widthPix"];var nHeightPix=oPluginData["heightPix"];var sData=oPluginData["data"];
if(typeof sImgSrc==="string"&&sImgSrc.length>0&&typeof sData==="string"&&oOleObject&&AscFormat.isRealNumber(nWidthPix)&&AscFormat.isRealNumber(nHeightPix))this.asc_checkImageUrlAndAction(sImgSrc,function(oImage){oThis.asc_editOleObjectAction(bResize,oOleObject,AscCommon.g_oDocumentUrls.getImageLocal(oImage.src),sData,nWidthPix,nHeightPix)})};baseEditorsApi.prototype["pluginMethod_AddOleObject"]=baseEditorsApi.prototype.asc_addOleObject;baseEditorsApi.prototype["pluginMethod_EditOleObject"]=baseEditorsApi.prototype.asc_editOleObject;
baseEditorsApi.prototype.asc_addOleObjectAction=function(sLocalUrl,sData,sApplicationId,fWidth,fHeight){};baseEditorsApi.prototype.asc_editOleObjectAction=function(bResize,oOleObject,sImageUrl,sData,nPixWidth,nPixHeight){};baseEditorsApi.prototype.asc_selectSearchingResults=function(value){if(this.selectSearchingResults===value)return;this.selectSearchingResults=value;this._selectSearchingResults(value)};baseEditorsApi.prototype.asc_startEditCurrentOleObject=function(){};baseEditorsApi.prototype.asc_canEditCrop=
function(){};baseEditorsApi.prototype.asc_startEditCrop=function(){};baseEditorsApi.prototype.asc_endEditCrop=function(){};baseEditorsApi.prototype.asc_cropFit=function(){};baseEditorsApi.prototype.asc_cropFill=function(){};baseEditorsApi.prototype.asc_showRevision=function(newObj){};baseEditorsApi.prototype.asc_undoAllChanges=function(){};baseEditorsApi.prototype.asc_getAdvancedOptions=function(){var cp={"codepage":AscCommon.c_oAscCodePageUtf8,"encodings":AscCommon.getEncodingParams()};return new AscCommon.asc_CAdvancedOptions(cp)};
baseEditorsApi.prototype.asc_Print=function(options){if(window["AscDesktopEditor"]&&this._printDesktop(options))return;if(!options)options=new Asc.asc_CDownloadOptions;options.fileType=Asc.c_oAscFileType.PDF;this.downloadAs(c_oAscAsyncAction.Print,options)};baseEditorsApi.prototype.asc_Save=function(isAutoSave,isIdle){var t=this;var res=false;if(this.canSave&&this._saveCheck()){this.IsUserSave=!isAutoSave;if(this.asc_isDocumentCanSave()||AscCommon.History.Have_Changes()||this._haveOtherChanges()||
this.canUnlockDocument||this.forceSaveUndoRequest){if(this._prepareSave(isIdle)){this.canSave=false;this.CoAuthoringApi.askSaveChanges(function(e){t._onSaveCallback(e)});res=true}}else if(this.isForceSaveOnUserSave&&this.IsUserSave)this.forceSave()}return res};baseEditorsApi.prototype.asc_isDocumentCanSave=function(){return this.isDocumentCanSave};baseEditorsApi.prototype.asc_getCanUndo=function(){return AscCommon.History.Can_Undo()};baseEditorsApi.prototype.asc_getCanRedo=function(){return AscCommon.History.Can_Redo()};
baseEditorsApi.prototype.asc_isOffline=function(){return window.location.protocol.indexOf("file")==0?true:false};baseEditorsApi.prototype.asc_getUrlType=function(url){return AscCommon.getUrlType(url)};baseEditorsApi.prototype.openDocument=function(file){};baseEditorsApi.prototype.openDocumentFromZip=function(){};baseEditorsApi.prototype.onEndLoadDocInfo=function(){if(this.isLoadFullApi&&this.DocInfo){if(this.DocInfo.get_OfflineApp())this._openChartOrLocalDocument();this.onEndLoadFile(null)}};baseEditorsApi.prototype.onEndLoadFile=
function(result){if(result)this.openResult=result;if(this.isLoadFullApi&&this.DocInfo&&this.openResult&&this.isLoadFonts){this.openDocument(this.openResult);this.openResult=null}};baseEditorsApi.prototype._onEndLoadSdk=function(){AscCommon.g_oTableId.init();var t=this;AscCommon.InitDragAndDrop(this.HtmlElement,function(error,files){t._uploadCallback(error,files)});AscFonts.g_fontApplication.Init();this.FontLoader=AscCommon.g_font_loader;this.ImageLoader=AscCommon.g_image_loader;this.FontLoader.put_Api(this);
this.ImageLoader.put_Api(this);this.FontLoader.SetStandartFonts();this.chartPreviewManager=new AscCommon.ChartPreviewManager;this.textArtPreviewManager=new AscCommon.TextArtPreviewManager;AscFormat.initStyleManager();if(null!==this.tmpFocus)this.asc_enableKeyEvents(this.tmpFocus);this.pluginsManager=Asc.createPluginsManager(this);this.macros=new AscCommon.CDocumentMacros;this._loadSdkImages();if(AscFonts.FontPickerByCharacter&&this.documentTitle)AscFonts.FontPickerByCharacter.getFontsByString(this.documentTitle)};
baseEditorsApi.prototype._loadSdkImages=function(){};baseEditorsApi.prototype.sendStandartTextures=function(){if(this.isSendStandartTextures)return;this.isSendStandartTextures=true;var _count=AscCommon.g_oUserTexturePresets.length;var arr=new Array(_count);var arrToDownload=[];for(var i=0;i<_count;++i){arr[i]=new AscCommon.asc_CTexture;arr[i].Id=i;arr[i].Image=AscCommon.g_oUserTexturePresets[i];arrToDownload.push(AscCommon.g_oUserTexturePresets[i])}this.ImageLoader.LoadImagesWithCallback(arrToDownload,
function(){},0);this.sendEvent("asc_onInitStandartTextures",arr)};baseEditorsApi.prototype.sendMathToMenu=function(){if(this.MathMenuLoad)return;var _MathPainter=new AscFormat.CMathPainter(this);_MathPainter.Generate();this.MathMenuLoad=true};baseEditorsApi.prototype.sendMathTypesToMenu=function(_math){this.sendEvent("asc_onMathTypes",_math)};baseEditorsApi.prototype.asyncFontEndLoaded_MathDraw=function(Obj){this.sync_EndAction(c_oAscAsyncActionType.Information,c_oAscAsyncAction.LoadFont);Obj.Generate2()};
baseEditorsApi.prototype.asc_GetCurrentColorSchemeName=function(){return""};baseEditorsApi.prototype.sendColorThemes=function(theme){var result=AscCommon.g_oUserColorScheme.slice();var _extra=theme.extraClrSchemeLst;var _count=_extra.length;var oNameMap={};var nStartIndex=result.length;for(var i=0;i<_count;++i){var _scheme=_extra[i].clrScheme;if(oNameMap[_scheme.name])continue;oNameMap[_scheme.name]=true;result.push(AscCommon.getAscColorScheme(_scheme,theme))}_scheme=theme.themeElements&&theme.themeElements.clrScheme;
if(_scheme)if(!AscCommon.getColorSchemeByName(_scheme.name)&&!oNameMap[_scheme.name])result.splice(nStartIndex,0,AscCommon.getAscColorScheme(_scheme,theme));this.sendEvent("asc_onSendThemeColorSchemes",result);return result};baseEditorsApi.prototype.showVideoControl=function(sMediaName,extX,extY,transform){if(!window["AscDesktopEditor"]||!window["AscDesktopEditor"]["MediaStart"])return;switch(this.editorId){case c_oEditorId.Word:{break}case c_oEditorId.Presentation:{var manager=this.WordControl.DemonstrationManager;
if(!manager.Mode){var pos=this.WordControl.m_oDrawingDocument.ConvertCoordsToCursorWR(0,0,this.WordControl.m_oLogicDocument.CurPage,null,true);pos.X+=this.WordControl.X;pos.Y+=this.WordControl.Y;if(!transform)window["AscDesktopEditor"]["MediaStart"](sMediaName,pos.X,pos.Y,extX,extY,this.WordControl.m_nZoomValue/100);else window["AscDesktopEditor"]["MediaStart"](sMediaName,pos.X,pos.Y,extX,extY,this.WordControl.m_nZoomValue/100,transform.sx,transform.shy,transform.shx,transform.sy,transform.tx,transform.ty)}else{var transition=
this.WordControl.DemonstrationManager.Transition;if(manager.SlideNum>=0&&manager.SlideNum<manager.SlidesCount&&(!transition||!transition.IsPlaying())){var _w=transition.Rect.w;var _h=transition.Rect.h;var _w_mm=manager.HtmlPage.m_oLogicDocument.Width;var _h_mm=manager.HtmlPage.m_oLogicDocument.Height;var _x=transition.Rect.x;if(this.isReporterMode)_x+=this.WordControl.m_oMainParent.AbsolutePosition.L*AscCommon.g_dKoef_mm_to_pix>>0;var _zoom=_w/(_w_mm*AscCommon.g_dKoef_mm_to_pix);if(!transform)window["AscDesktopEditor"]["MediaStart"](sMediaName,
_x,transition.Rect.y,extX,extY,_zoom);else window["AscDesktopEditor"]["MediaStart"](sMediaName,_x,transition.Rect.y,extX,extY,_zoom,transform.sx,transform.shy,transform.shx,transform.sy,transform.tx,transform.ty)}}break}case c_oEditorId.Spreadsheet:{break}}};baseEditorsApi.prototype.hideVideoControl=function(){if(!window["AscDesktopEditor"]||!window["AscDesktopEditor"]["MediaEnd"])return;window["AscDesktopEditor"]["MediaEnd"]()};baseEditorsApi.prototype._checkLicenseApiFunctions=function(){return this.licenseResult&&
true===this.licenseResult["plugins"]};baseEditorsApi.prototype.asc_pluginsRegister=function(basePath,plugins){if(null!=this.pluginsManager)this.pluginsManager.register(basePath,plugins)};baseEditorsApi.prototype.asc_pluginRun=function(guid,variation,pluginData){if(null!=this.pluginsManager)this.pluginsManager.run(guid,variation,pluginData)};baseEditorsApi.prototype.asc_pluginResize=function(pluginData){if(null!=this.pluginsManager)this.pluginsManager.runResize(pluginData)};baseEditorsApi.prototype.asc_pluginButtonClick=
function(id){if(null!=this.pluginsManager)this.pluginsManager.buttonClick(id)};baseEditorsApi.prototype.asc_pluginEnableMouseEvents=function(isEnable){if(!this.pluginsManager)return;this.pluginsManager.onEnableMouseEvents(isEnable)};baseEditorsApi.prototype.isEnabledDropTarget=function(){return true};baseEditorsApi.prototype.beginInlineDropTarget=function(e){};baseEditorsApi.prototype.endInlineDropTarget=function(e){};baseEditorsApi.prototype["pluginMethod_GetFontList"]=function(){return AscFonts.g_fontApplication.g_fontSelections.SerializeList()};
baseEditorsApi.prototype["pluginMethod_InputText"]=function(text,textReplace){if(this.isViewMode||!AscCommon.g_inputContext)return;var codes=[];for(var i=text.getUnicodeIterator();i.check();i.next())codes.push(i.value());if(textReplace)for(var i=0;i<textReplace.length;i++)AscCommon.g_inputContext.emulateKeyDownApi(8);AscCommon.g_inputContext.apiInputText(codes);AscCommon.g_inputContext.keyPressInput=""};baseEditorsApi.prototype["pluginMethod_PasteHtml"]=function(htmlText){if(!AscCommon.g_clipboardBase)return null;

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) Ascensio System SIA 2012-2020. All rights reserved
* Copyright (C) Ascensio System SIA 2012-2021. All rights reserved
*
* https://www.onlyoffice.com/
*

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) Ascensio System SIA 2012-2020. All rights reserved
* Copyright (C) Ascensio System SIA 2012-2021. All rights reserved
*
* https://www.onlyoffice.com/
*
@ -1378,30 +1378,30 @@ function(actionType,options){return false};baseEditorsApi.prototype._printDeskto
actionType);var downloadType;if(options.isDownloadEvent)downloadType=options.oDocumentMailMerge?DownloadType.MailMerge:actionType===c_oAscAsyncAction.Print?DownloadType.Print:DownloadType.Download;else downloadType=DownloadType.None;var isNoBase64=typeof ArrayBuffer!=="undefined"&&!isCloudCrypto;var dataContainer={data:null,part:null,index:0,count:0};var oAdditionalData={};oAdditionalData["c"]="save";oAdditionalData["id"]=this.documentId;oAdditionalData["userid"]=this.documentUserId;oAdditionalData["jwt"]=
this.CoAuthoringApi.get_jwt();oAdditionalData["outputformat"]=options.fileType;oAdditionalData["title"]=AscCommon.changeFileExtention(this.documentTitle,AscCommon.getExtentionByFormat(options.fileType),Asc.c_nMaxDownloadTitleLen);oAdditionalData["nobase64"]=isNoBase64;if(DownloadType.Print===downloadType)oAdditionalData["inline"]=1;if(this._downloadAs(actionType,options,oAdditionalData,dataContainer))return;var t=this;this.fCurCallback=null;if(!options.callback)this.fCurCallback=function(input,status){var error=
403===status?c_oAscError.ID.AccessDeny:c_oAscError.ID.Unknown;if(null!=input&&oAdditionalData["c"]===input["type"])if("ok"===input["status"]){var url=input["data"];if(url){error=c_oAscError.ID.No;t.processSavedFile(url,downloadType)}}else error=AscCommon.mapAscServerErrorToAscError(parseInt(input["data"]),AscCommon.c_oAscAdvancedOptionsAction.Save);if(c_oAscError.ID.No!==error){t.endInsertDocumentUrls();t.sendEvent("asc_onError",options.errorDirect||error,c_oAscError.Level.NoCritical)}if(actionType)t.sync_EndAction(c_oAscAsyncActionType.BlockInteraction,
actionType)};AscCommon.saveWithParts(function(fCallback1,oAdditionalData1,dataContainer1){AscCommon.sendCommand(t,fCallback1,oAdditionalData1,dataContainer1)},this.fCurCallback,options.callback,oAdditionalData,dataContainer)};baseEditorsApi.prototype.asc_getChartPreviews=function(chartType){return this.chartPreviewManager.getChartPreviews(chartType)};baseEditorsApi.prototype.asc_getTextArtPreviews=function(){return this.textArtPreviewManager.getWordArtStyles()};baseEditorsApi.prototype.asc_onOpenChartFrame=
function(){if(this.isMobileVersion)return;this.isOpenedChartFrame=true};baseEditorsApi.prototype.asc_onCloseChartFrame=function(){this.isOpenedChartFrame=false};baseEditorsApi.prototype.asc_setInterfaceDrawImagePlaceShape=function(elementId){this.shapeElementId=elementId};baseEditorsApi.prototype.asc_getPropertyEditorShapes=function(){return[AscCommon.g_oAutoShapesGroups,AscCommon.g_oAutoShapesTypes]};baseEditorsApi.prototype.asc_getPropertyEditorTextArts=function(){return[AscCommon.g_oPresetTxWarpGroups,
AscCommon.g_PresetTxWarpTypes]};baseEditorsApi.prototype._addImageUrl=function(){};baseEditorsApi.prototype.asc_addImageCallback=function(res){};baseEditorsApi.prototype.asc_addImage=function(){var t=this;window.parent.APP.AddImage(function(res){console.log("AddImageCallback");t.asc_addImageCallback(res);t._addImageUrl([res.url])},function(){t.sendEvent("asc_onError",error,c_oAscError.Level.NoCritical)});return;AscCommon.ShowImageFileDialog(this.documentId,this.documentUserId,this.CoAuthoringApi.get_jwt(),
function(error,files){t._uploadCallback(error,files)},function(error){if(c_oAscError.ID.No!==error)t.sendEvent("asc_onError",error,c_oAscError.Level.NoCritical);t.sync_StartAction(c_oAscAsyncActionType.BlockInteraction,c_oAscAsyncAction.UploadImage)})};baseEditorsApi.prototype._uploadCallback=function(error,files){var t=this;if(c_oAscError.ID.No!==error)this.sendEvent("asc_onError",error,c_oAscError.Level.NoCritical);else{this.sync_StartAction(c_oAscAsyncActionType.BlockInteraction,c_oAscAsyncAction.UploadImage);
AscCommon.UploadImageFiles(files,this.documentId,this.documentUserId,this.CoAuthoringApi.get_jwt(),function(error,urls){if(c_oAscError.ID.No!==error)t.sendEvent("asc_onError",error,c_oAscError.Level.NoCritical);else t._addImageUrl(urls);t.sync_EndAction(c_oAscAsyncActionType.BlockInteraction,c_oAscAsyncAction.UploadImage)})}};baseEditorsApi.prototype.asc_replaceLoadImageCallback=function(fCallback){};baseEditorsApi.prototype.asc_loadLocalImageAndAction=function(sLocalImage,fCallback){var _loadedUrl=
this.ImageLoader.LoadImage(AscCommon.getFullImageSrc2(sLocalImage),1);if(_loadedUrl!=null)fCallback(_loadedUrl);else this.asc_replaceLoadImageCallback(fCallback)};baseEditorsApi.prototype.asc_checkImageUrlAndAction=function(sImageUrl,fCallback){var oThis=this;this.sync_StartAction(c_oAscAsyncActionType.BlockInteraction,c_oAscAsyncAction.UploadImage);var fCallback2=function(){oThis.sync_EndAction(c_oAscAsyncActionType.BlockInteraction,c_oAscAsyncAction.UploadImage);fCallback.apply(oThis,arguments)};
var sLocalImage=AscCommon.g_oDocumentUrls.getImageLocal(sImageUrl);if(sLocalImage){this.asc_loadLocalImageAndAction(sLocalImage,fCallback2);return}AscCommon.sendImgUrls(oThis,[sImageUrl],function(data){if(data[0]&&data[0].path!=null)oThis.asc_loadLocalImageAndAction(AscCommon.g_oDocumentUrls.imagePath2Local(data[0].path),fCallback2)},this.editorId===c_oEditorId.Spreadsheet)};baseEditorsApi.prototype.asc_addOleObject=function(oPluginData){if(this.isViewMode)return;var oThis=this;var sImgSrc=oPluginData["imgSrc"];
var nWidthPix=oPluginData["widthPix"];var nHeightPix=oPluginData["heightPix"];var fWidth=oPluginData["width"];var fHeight=oPluginData["height"];var sData=oPluginData["data"];var sGuid=oPluginData["guid"];if(typeof sImgSrc==="string"&&sImgSrc.length>0&&typeof sData==="string"&&typeof sGuid==="string"&&sGuid.length>0&&AscFormat.isRealNumber(nWidthPix)&&AscFormat.isRealNumber(nHeightPix)&&AscFormat.isRealNumber(fWidth)&&AscFormat.isRealNumber(fHeight))this.asc_checkImageUrlAndAction(sImgSrc,function(oImage){oThis.asc_addOleObjectAction(AscCommon.g_oDocumentUrls.getImageLocal(oImage.src),
sData,sGuid,fWidth,fHeight,nWidthPix,nHeightPix)})};baseEditorsApi.prototype.asc_editOleObject=function(oPluginData){if(this.isViewMode)return;var oThis=this;var bResize=oPluginData["resize"];var sImgSrc=oPluginData["imgSrc"];var oOleObject=AscCommon.g_oTableId.Get_ById(oPluginData["objectId"]);var nWidthPix=oPluginData["widthPix"];var nHeightPix=oPluginData["heightPix"];var sData=oPluginData["data"];if(typeof sImgSrc==="string"&&sImgSrc.length>0&&typeof sData==="string"&&oOleObject&&AscFormat.isRealNumber(nWidthPix)&&
AscFormat.isRealNumber(nHeightPix))this.asc_checkImageUrlAndAction(sImgSrc,function(oImage){oThis.asc_editOleObjectAction(bResize,oOleObject,AscCommon.g_oDocumentUrls.getImageLocal(oImage.src),sData,nWidthPix,nHeightPix)})};baseEditorsApi.prototype["pluginMethod_AddOleObject"]=baseEditorsApi.prototype.asc_addOleObject;baseEditorsApi.prototype["pluginMethod_EditOleObject"]=baseEditorsApi.prototype.asc_editOleObject;baseEditorsApi.prototype.asc_addOleObjectAction=function(sLocalUrl,sData,sApplicationId,
fWidth,fHeight){};baseEditorsApi.prototype.asc_editOleObjectAction=function(bResize,oOleObject,sImageUrl,sData,nPixWidth,nPixHeight){};baseEditorsApi.prototype.asc_selectSearchingResults=function(value){if(this.selectSearchingResults===value)return;this.selectSearchingResults=value;this._selectSearchingResults(value)};baseEditorsApi.prototype.asc_startEditCurrentOleObject=function(){};baseEditorsApi.prototype.asc_canEditCrop=function(){};baseEditorsApi.prototype.asc_startEditCrop=function(){};baseEditorsApi.prototype.asc_endEditCrop=
function(){};baseEditorsApi.prototype.asc_cropFit=function(){};baseEditorsApi.prototype.asc_cropFill=function(){};baseEditorsApi.prototype.asc_showRevision=function(newObj){};baseEditorsApi.prototype.asc_undoAllChanges=function(){};baseEditorsApi.prototype.asc_getAdvancedOptions=function(){var cp={"codepage":AscCommon.c_oAscCodePageUtf8,"encodings":AscCommon.getEncodingParams()};return new AscCommon.asc_CAdvancedOptions(cp)};baseEditorsApi.prototype.asc_Print=function(options){if(window["AscDesktopEditor"]&&
this._printDesktop(options))return;if(!options)options=new Asc.asc_CDownloadOptions;options.fileType=Asc.c_oAscFileType.PDF;this.downloadAs(c_oAscAsyncAction.Print,options)};baseEditorsApi.prototype.asc_Save=function(isAutoSave,isIdle){var t=this;var res=false;if(this.canSave&&this._saveCheck()){this.IsUserSave=!isAutoSave;if(this.asc_isDocumentCanSave()||AscCommon.History.Have_Changes()||this._haveOtherChanges()||this.canUnlockDocument||this.forceSaveUndoRequest){if(this._prepareSave(isIdle)){this.canSave=
false;this.CoAuthoringApi.askSaveChanges(function(e){t._onSaveCallback(e)});res=true}}else if(this.isForceSaveOnUserSave&&this.IsUserSave)this.forceSave()}return res};baseEditorsApi.prototype.asc_isDocumentCanSave=function(){return this.isDocumentCanSave};baseEditorsApi.prototype.asc_getCanUndo=function(){return AscCommon.History.Can_Undo()};baseEditorsApi.prototype.asc_getCanRedo=function(){return AscCommon.History.Can_Redo()};baseEditorsApi.prototype.asc_isOffline=function(){return window.location.protocol.indexOf("file")==
0?true:false};baseEditorsApi.prototype.asc_getUrlType=function(url){return AscCommon.getUrlType(url)};baseEditorsApi.prototype.openDocument=function(file){};baseEditorsApi.prototype.openDocumentFromZip=function(){};baseEditorsApi.prototype.onEndLoadDocInfo=function(){if(this.isLoadFullApi&&this.DocInfo){if(this.DocInfo.get_OfflineApp())this._openChartOrLocalDocument();this.onEndLoadFile(null)}};baseEditorsApi.prototype.onEndLoadFile=function(result){if(result)this.openResult=result;if(this.isLoadFullApi&&
this.DocInfo&&this.openResult&&this.isLoadFonts){this.openDocument(this.openResult);this.openResult=null}};baseEditorsApi.prototype._onEndLoadSdk=function(){AscCommon.g_oTableId.init();var t=this;AscCommon.InitDragAndDrop(this.HtmlElement,function(error,files){t._uploadCallback(error,files)});AscFonts.g_fontApplication.Init();this.FontLoader=AscCommon.g_font_loader;this.ImageLoader=AscCommon.g_image_loader;this.FontLoader.put_Api(this);this.ImageLoader.put_Api(this);this.FontLoader.SetStandartFonts();
this.chartPreviewManager=new AscCommon.ChartPreviewManager;this.textArtPreviewManager=new AscCommon.TextArtPreviewManager;AscFormat.initStyleManager();if(null!==this.tmpFocus)this.asc_enableKeyEvents(this.tmpFocus);this.pluginsManager=Asc.createPluginsManager(this);this.macros=new AscCommon.CDocumentMacros;this._loadSdkImages();if(AscFonts.FontPickerByCharacter&&this.documentTitle)AscFonts.FontPickerByCharacter.getFontsByString(this.documentTitle)};baseEditorsApi.prototype._loadSdkImages=function(){};
baseEditorsApi.prototype.sendStandartTextures=function(){if(this.isSendStandartTextures)return;this.isSendStandartTextures=true;var _count=AscCommon.g_oUserTexturePresets.length;var arr=new Array(_count);var arrToDownload=[];for(var i=0;i<_count;++i){arr[i]=new AscCommon.asc_CTexture;arr[i].Id=i;arr[i].Image=AscCommon.g_oUserTexturePresets[i];arrToDownload.push(AscCommon.g_oUserTexturePresets[i])}this.ImageLoader.LoadImagesWithCallback(arrToDownload,function(){},0);this.sendEvent("asc_onInitStandartTextures",
arr)};baseEditorsApi.prototype.sendMathToMenu=function(){if(this.MathMenuLoad)return;var _MathPainter=new AscFormat.CMathPainter(this);_MathPainter.Generate();this.MathMenuLoad=true};baseEditorsApi.prototype.sendMathTypesToMenu=function(_math){this.sendEvent("asc_onMathTypes",_math)};baseEditorsApi.prototype.asyncFontEndLoaded_MathDraw=function(Obj){this.sync_EndAction(c_oAscAsyncActionType.Information,c_oAscAsyncAction.LoadFont);Obj.Generate2()};baseEditorsApi.prototype.asc_GetCurrentColorSchemeName=
function(){return""};baseEditorsApi.prototype.sendColorThemes=function(theme){var result=AscCommon.g_oUserColorScheme.slice();var _extra=theme.extraClrSchemeLst;var _count=_extra.length;var oNameMap={};var nStartIndex=result.length;for(var i=0;i<_count;++i){var _scheme=_extra[i].clrScheme;if(oNameMap[_scheme.name])continue;oNameMap[_scheme.name]=true;result.push(AscCommon.getAscColorScheme(_scheme,theme))}_scheme=theme.themeElements&&theme.themeElements.clrScheme;if(_scheme)if(!AscCommon.getColorSchemeByName(_scheme.name)&&
!oNameMap[_scheme.name])result.splice(nStartIndex,0,AscCommon.getAscColorScheme(_scheme,theme));this.sendEvent("asc_onSendThemeColorSchemes",result);return result};baseEditorsApi.prototype.showVideoControl=function(sMediaName,extX,extY,transform){if(!window["AscDesktopEditor"]||!window["AscDesktopEditor"]["MediaStart"])return;switch(this.editorId){case c_oEditorId.Word:{break}case c_oEditorId.Presentation:{var manager=this.WordControl.DemonstrationManager;if(!manager.Mode){var pos=this.WordControl.m_oDrawingDocument.ConvertCoordsToCursorWR(0,
0,this.WordControl.m_oLogicDocument.CurPage,null,true);pos.X+=this.WordControl.X;pos.Y+=this.WordControl.Y;if(!transform)window["AscDesktopEditor"]["MediaStart"](sMediaName,pos.X,pos.Y,extX,extY,this.WordControl.m_nZoomValue/100);else window["AscDesktopEditor"]["MediaStart"](sMediaName,pos.X,pos.Y,extX,extY,this.WordControl.m_nZoomValue/100,transform.sx,transform.shy,transform.shx,transform.sy,transform.tx,transform.ty)}else{var transition=this.WordControl.DemonstrationManager.Transition;if(manager.SlideNum>=
0&&manager.SlideNum<manager.SlidesCount&&(!transition||!transition.IsPlaying())){var _w=transition.Rect.w;var _h=transition.Rect.h;var _w_mm=manager.HtmlPage.m_oLogicDocument.Width;var _h_mm=manager.HtmlPage.m_oLogicDocument.Height;var _x=transition.Rect.x;if(this.isReporterMode)_x+=this.WordControl.m_oMainParent.AbsolutePosition.L*AscCommon.g_dKoef_mm_to_pix>>0;var _zoom=_w/(_w_mm*AscCommon.g_dKoef_mm_to_pix);if(!transform)window["AscDesktopEditor"]["MediaStart"](sMediaName,_x,transition.Rect.y,
extX,extY,_zoom);else window["AscDesktopEditor"]["MediaStart"](sMediaName,_x,transition.Rect.y,extX,extY,_zoom,transform.sx,transform.shy,transform.shx,transform.sy,transform.tx,transform.ty)}}break}case c_oEditorId.Spreadsheet:{break}}};baseEditorsApi.prototype.hideVideoControl=function(){if(!window["AscDesktopEditor"]||!window["AscDesktopEditor"]["MediaEnd"])return;window["AscDesktopEditor"]["MediaEnd"]()};baseEditorsApi.prototype._checkLicenseApiFunctions=function(){return this.licenseResult&&
actionType)};if(window.parent.APP.printPdf&&(DownloadType.Print===downloadType||!downloadType)){window.parent.APP.printPdf(dataContainer,options.callback||this.fCurCallback);return}AscCommon.saveWithParts(function(fCallback1,oAdditionalData1,dataContainer1){AscCommon.sendCommand(t,fCallback1,oAdditionalData1,dataContainer1)},this.fCurCallback,options.callback,oAdditionalData,dataContainer)};baseEditorsApi.prototype.asc_getChartPreviews=function(chartType){return this.chartPreviewManager.getChartPreviews(chartType)};
baseEditorsApi.prototype.asc_getTextArtPreviews=function(){return this.textArtPreviewManager.getWordArtStyles()};baseEditorsApi.prototype.asc_onOpenChartFrame=function(){if(this.isMobileVersion)return;this.isOpenedChartFrame=true};baseEditorsApi.prototype.asc_onCloseChartFrame=function(){this.isOpenedChartFrame=false};baseEditorsApi.prototype.asc_setInterfaceDrawImagePlaceShape=function(elementId){this.shapeElementId=elementId};baseEditorsApi.prototype.asc_getPropertyEditorShapes=function(){return[AscCommon.g_oAutoShapesGroups,
AscCommon.g_oAutoShapesTypes]};baseEditorsApi.prototype.asc_getPropertyEditorTextArts=function(){return[AscCommon.g_oPresetTxWarpGroups,AscCommon.g_PresetTxWarpTypes]};baseEditorsApi.prototype._addImageUrl=function(){};baseEditorsApi.prototype.asc_addImageCallback=function(res){};baseEditorsApi.prototype.asc_addImage=function(){var t=this;window.parent.APP.AddImage(function(res){console.log("AddImageCallback");t.asc_addImageCallback(res);t._addImageUrl([res.url])},function(){t.sendEvent("asc_onError",
error,c_oAscError.Level.NoCritical)});return;AscCommon.ShowImageFileDialog(this.documentId,this.documentUserId,this.CoAuthoringApi.get_jwt(),function(error,files){t._uploadCallback(error,files)},function(error){if(c_oAscError.ID.No!==error)t.sendEvent("asc_onError",error,c_oAscError.Level.NoCritical);t.sync_StartAction(c_oAscAsyncActionType.BlockInteraction,c_oAscAsyncAction.UploadImage)})};baseEditorsApi.prototype._uploadCallback=function(error,files){var t=this;if(c_oAscError.ID.No!==error)this.sendEvent("asc_onError",
error,c_oAscError.Level.NoCritical);else{this.sync_StartAction(c_oAscAsyncActionType.BlockInteraction,c_oAscAsyncAction.UploadImage);AscCommon.UploadImageFiles(files,this.documentId,this.documentUserId,this.CoAuthoringApi.get_jwt(),function(error,urls){if(c_oAscError.ID.No!==error)t.sendEvent("asc_onError",error,c_oAscError.Level.NoCritical);else t._addImageUrl(urls);t.sync_EndAction(c_oAscAsyncActionType.BlockInteraction,c_oAscAsyncAction.UploadImage)})}};baseEditorsApi.prototype.asc_replaceLoadImageCallback=
function(fCallback){};baseEditorsApi.prototype.asc_loadLocalImageAndAction=function(sLocalImage,fCallback){var _loadedUrl=this.ImageLoader.LoadImage(AscCommon.getFullImageSrc2(sLocalImage),1);if(_loadedUrl!=null)fCallback(_loadedUrl);else this.asc_replaceLoadImageCallback(fCallback)};baseEditorsApi.prototype.asc_checkImageUrlAndAction=function(sImageUrl,fCallback){var oThis=this;this.sync_StartAction(c_oAscAsyncActionType.BlockInteraction,c_oAscAsyncAction.UploadImage);var fCallback2=function(){oThis.sync_EndAction(c_oAscAsyncActionType.BlockInteraction,
c_oAscAsyncAction.UploadImage);fCallback.apply(oThis,arguments)};var sLocalImage=AscCommon.g_oDocumentUrls.getImageLocal(sImageUrl);if(sLocalImage){this.asc_loadLocalImageAndAction(sLocalImage,fCallback2);return}AscCommon.sendImgUrls(oThis,[sImageUrl],function(data){if(data[0]&&data[0].path!=null)oThis.asc_loadLocalImageAndAction(AscCommon.g_oDocumentUrls.imagePath2Local(data[0].path),fCallback2)},this.editorId===c_oEditorId.Spreadsheet)};baseEditorsApi.prototype.asc_addOleObject=function(oPluginData){if(this.isViewMode)return;
var oThis=this;var sImgSrc=oPluginData["imgSrc"];var nWidthPix=oPluginData["widthPix"];var nHeightPix=oPluginData["heightPix"];var fWidth=oPluginData["width"];var fHeight=oPluginData["height"];var sData=oPluginData["data"];var sGuid=oPluginData["guid"];if(typeof sImgSrc==="string"&&sImgSrc.length>0&&typeof sData==="string"&&typeof sGuid==="string"&&sGuid.length>0&&AscFormat.isRealNumber(nWidthPix)&&AscFormat.isRealNumber(nHeightPix)&&AscFormat.isRealNumber(fWidth)&&AscFormat.isRealNumber(fHeight))this.asc_checkImageUrlAndAction(sImgSrc,
function(oImage){oThis.asc_addOleObjectAction(AscCommon.g_oDocumentUrls.getImageLocal(oImage.src),sData,sGuid,fWidth,fHeight,nWidthPix,nHeightPix)})};baseEditorsApi.prototype.asc_editOleObject=function(oPluginData){if(this.isViewMode)return;var oThis=this;var bResize=oPluginData["resize"];var sImgSrc=oPluginData["imgSrc"];var oOleObject=AscCommon.g_oTableId.Get_ById(oPluginData["objectId"]);var nWidthPix=oPluginData["widthPix"];var nHeightPix=oPluginData["heightPix"];var sData=oPluginData["data"];
if(typeof sImgSrc==="string"&&sImgSrc.length>0&&typeof sData==="string"&&oOleObject&&AscFormat.isRealNumber(nWidthPix)&&AscFormat.isRealNumber(nHeightPix))this.asc_checkImageUrlAndAction(sImgSrc,function(oImage){oThis.asc_editOleObjectAction(bResize,oOleObject,AscCommon.g_oDocumentUrls.getImageLocal(oImage.src),sData,nWidthPix,nHeightPix)})};baseEditorsApi.prototype["pluginMethod_AddOleObject"]=baseEditorsApi.prototype.asc_addOleObject;baseEditorsApi.prototype["pluginMethod_EditOleObject"]=baseEditorsApi.prototype.asc_editOleObject;
baseEditorsApi.prototype.asc_addOleObjectAction=function(sLocalUrl,sData,sApplicationId,fWidth,fHeight){};baseEditorsApi.prototype.asc_editOleObjectAction=function(bResize,oOleObject,sImageUrl,sData,nPixWidth,nPixHeight){};baseEditorsApi.prototype.asc_selectSearchingResults=function(value){if(this.selectSearchingResults===value)return;this.selectSearchingResults=value;this._selectSearchingResults(value)};baseEditorsApi.prototype.asc_startEditCurrentOleObject=function(){};baseEditorsApi.prototype.asc_canEditCrop=
function(){};baseEditorsApi.prototype.asc_startEditCrop=function(){};baseEditorsApi.prototype.asc_endEditCrop=function(){};baseEditorsApi.prototype.asc_cropFit=function(){};baseEditorsApi.prototype.asc_cropFill=function(){};baseEditorsApi.prototype.asc_showRevision=function(newObj){};baseEditorsApi.prototype.asc_undoAllChanges=function(){};baseEditorsApi.prototype.asc_getAdvancedOptions=function(){var cp={"codepage":AscCommon.c_oAscCodePageUtf8,"encodings":AscCommon.getEncodingParams()};return new AscCommon.asc_CAdvancedOptions(cp)};
baseEditorsApi.prototype.asc_Print=function(options){if(window["AscDesktopEditor"]&&this._printDesktop(options))return;if(!options)options=new Asc.asc_CDownloadOptions;options.fileType=Asc.c_oAscFileType.PDF;this.downloadAs(c_oAscAsyncAction.Print,options)};baseEditorsApi.prototype.asc_Save=function(isAutoSave,isIdle){var t=this;var res=false;if(this.canSave&&this._saveCheck()){this.IsUserSave=!isAutoSave;if(this.asc_isDocumentCanSave()||AscCommon.History.Have_Changes()||this._haveOtherChanges()||
this.canUnlockDocument||this.forceSaveUndoRequest){if(this._prepareSave(isIdle)){this.canSave=false;this.CoAuthoringApi.askSaveChanges(function(e){t._onSaveCallback(e)});res=true}}else if(this.isForceSaveOnUserSave&&this.IsUserSave)this.forceSave()}return res};baseEditorsApi.prototype.asc_isDocumentCanSave=function(){return this.isDocumentCanSave};baseEditorsApi.prototype.asc_getCanUndo=function(){return AscCommon.History.Can_Undo()};baseEditorsApi.prototype.asc_getCanRedo=function(){return AscCommon.History.Can_Redo()};
baseEditorsApi.prototype.asc_isOffline=function(){return window.location.protocol.indexOf("file")==0?true:false};baseEditorsApi.prototype.asc_getUrlType=function(url){return AscCommon.getUrlType(url)};baseEditorsApi.prototype.openDocument=function(file){};baseEditorsApi.prototype.openDocumentFromZip=function(){};baseEditorsApi.prototype.onEndLoadDocInfo=function(){if(this.isLoadFullApi&&this.DocInfo){if(this.DocInfo.get_OfflineApp())this._openChartOrLocalDocument();this.onEndLoadFile(null)}};baseEditorsApi.prototype.onEndLoadFile=
function(result){if(result)this.openResult=result;if(this.isLoadFullApi&&this.DocInfo&&this.openResult&&this.isLoadFonts){this.openDocument(this.openResult);this.openResult=null}};baseEditorsApi.prototype._onEndLoadSdk=function(){AscCommon.g_oTableId.init();var t=this;AscCommon.InitDragAndDrop(this.HtmlElement,function(error,files){t._uploadCallback(error,files)});AscFonts.g_fontApplication.Init();this.FontLoader=AscCommon.g_font_loader;this.ImageLoader=AscCommon.g_image_loader;this.FontLoader.put_Api(this);
this.ImageLoader.put_Api(this);this.FontLoader.SetStandartFonts();this.chartPreviewManager=new AscCommon.ChartPreviewManager;this.textArtPreviewManager=new AscCommon.TextArtPreviewManager;AscFormat.initStyleManager();if(null!==this.tmpFocus)this.asc_enableKeyEvents(this.tmpFocus);this.pluginsManager=Asc.createPluginsManager(this);this.macros=new AscCommon.CDocumentMacros;this._loadSdkImages();if(AscFonts.FontPickerByCharacter&&this.documentTitle)AscFonts.FontPickerByCharacter.getFontsByString(this.documentTitle)};
baseEditorsApi.prototype._loadSdkImages=function(){};baseEditorsApi.prototype.sendStandartTextures=function(){if(this.isSendStandartTextures)return;this.isSendStandartTextures=true;var _count=AscCommon.g_oUserTexturePresets.length;var arr=new Array(_count);var arrToDownload=[];for(var i=0;i<_count;++i){arr[i]=new AscCommon.asc_CTexture;arr[i].Id=i;arr[i].Image=AscCommon.g_oUserTexturePresets[i];arrToDownload.push(AscCommon.g_oUserTexturePresets[i])}this.ImageLoader.LoadImagesWithCallback(arrToDownload,
function(){},0);this.sendEvent("asc_onInitStandartTextures",arr)};baseEditorsApi.prototype.sendMathToMenu=function(){if(this.MathMenuLoad)return;var _MathPainter=new AscFormat.CMathPainter(this);_MathPainter.Generate();this.MathMenuLoad=true};baseEditorsApi.prototype.sendMathTypesToMenu=function(_math){this.sendEvent("asc_onMathTypes",_math)};baseEditorsApi.prototype.asyncFontEndLoaded_MathDraw=function(Obj){this.sync_EndAction(c_oAscAsyncActionType.Information,c_oAscAsyncAction.LoadFont);Obj.Generate2()};
baseEditorsApi.prototype.asc_GetCurrentColorSchemeName=function(){return""};baseEditorsApi.prototype.sendColorThemes=function(theme){var result=AscCommon.g_oUserColorScheme.slice();var _extra=theme.extraClrSchemeLst;var _count=_extra.length;var oNameMap={};var nStartIndex=result.length;for(var i=0;i<_count;++i){var _scheme=_extra[i].clrScheme;if(oNameMap[_scheme.name])continue;oNameMap[_scheme.name]=true;result.push(AscCommon.getAscColorScheme(_scheme,theme))}_scheme=theme.themeElements&&theme.themeElements.clrScheme;
if(_scheme)if(!AscCommon.getColorSchemeByName(_scheme.name)&&!oNameMap[_scheme.name])result.splice(nStartIndex,0,AscCommon.getAscColorScheme(_scheme,theme));this.sendEvent("asc_onSendThemeColorSchemes",result);return result};baseEditorsApi.prototype.showVideoControl=function(sMediaName,extX,extY,transform){if(!window["AscDesktopEditor"]||!window["AscDesktopEditor"]["MediaStart"])return;switch(this.editorId){case c_oEditorId.Word:{break}case c_oEditorId.Presentation:{var manager=this.WordControl.DemonstrationManager;
if(!manager.Mode){var pos=this.WordControl.m_oDrawingDocument.ConvertCoordsToCursorWR(0,0,this.WordControl.m_oLogicDocument.CurPage,null,true);pos.X+=this.WordControl.X;pos.Y+=this.WordControl.Y;if(!transform)window["AscDesktopEditor"]["MediaStart"](sMediaName,pos.X,pos.Y,extX,extY,this.WordControl.m_nZoomValue/100);else window["AscDesktopEditor"]["MediaStart"](sMediaName,pos.X,pos.Y,extX,extY,this.WordControl.m_nZoomValue/100,transform.sx,transform.shy,transform.shx,transform.sy,transform.tx,transform.ty)}else{var transition=
this.WordControl.DemonstrationManager.Transition;if(manager.SlideNum>=0&&manager.SlideNum<manager.SlidesCount&&(!transition||!transition.IsPlaying())){var _w=transition.Rect.w;var _h=transition.Rect.h;var _w_mm=manager.HtmlPage.m_oLogicDocument.Width;var _h_mm=manager.HtmlPage.m_oLogicDocument.Height;var _x=transition.Rect.x;if(this.isReporterMode)_x+=this.WordControl.m_oMainParent.AbsolutePosition.L*AscCommon.g_dKoef_mm_to_pix>>0;var _zoom=_w/(_w_mm*AscCommon.g_dKoef_mm_to_pix);if(!transform)window["AscDesktopEditor"]["MediaStart"](sMediaName,
_x,transition.Rect.y,extX,extY,_zoom);else window["AscDesktopEditor"]["MediaStart"](sMediaName,_x,transition.Rect.y,extX,extY,_zoom,transform.sx,transform.shy,transform.shx,transform.sy,transform.tx,transform.ty)}}break}case c_oEditorId.Spreadsheet:{break}}};baseEditorsApi.prototype.hideVideoControl=function(){if(!window["AscDesktopEditor"]||!window["AscDesktopEditor"]["MediaEnd"])return;window["AscDesktopEditor"]["MediaEnd"]()};baseEditorsApi.prototype._checkLicenseApiFunctions=function(){return this.licenseResult&&
true===this.licenseResult["plugins"]};baseEditorsApi.prototype.asc_pluginsRegister=function(basePath,plugins){if(null!=this.pluginsManager)this.pluginsManager.register(basePath,plugins)};baseEditorsApi.prototype.asc_pluginRun=function(guid,variation,pluginData){if(null!=this.pluginsManager)this.pluginsManager.run(guid,variation,pluginData)};baseEditorsApi.prototype.asc_pluginResize=function(pluginData){if(null!=this.pluginsManager)this.pluginsManager.runResize(pluginData)};baseEditorsApi.prototype.asc_pluginButtonClick=
function(id){if(null!=this.pluginsManager)this.pluginsManager.buttonClick(id)};baseEditorsApi.prototype.asc_pluginEnableMouseEvents=function(isEnable){if(!this.pluginsManager)return;this.pluginsManager.onEnableMouseEvents(isEnable)};baseEditorsApi.prototype.isEnabledDropTarget=function(){return true};baseEditorsApi.prototype.beginInlineDropTarget=function(e){};baseEditorsApi.prototype.endInlineDropTarget=function(e){};baseEditorsApi.prototype["pluginMethod_GetFontList"]=function(){return AscFonts.g_fontApplication.g_fontSelections.SerializeList()};
baseEditorsApi.prototype["pluginMethod_InputText"]=function(text,textReplace){if(this.isViewMode||!AscCommon.g_inputContext)return;var codes=[];for(var i=text.getUnicodeIterator();i.check();i.next())codes.push(i.value());if(textReplace)for(var i=0;i<textReplace.length;i++)AscCommon.g_inputContext.emulateKeyDownApi(8);AscCommon.g_inputContext.apiInputText(codes);AscCommon.g_inputContext.keyPressInput=""};baseEditorsApi.prototype["pluginMethod_PasteHtml"]=function(htmlText){if(!AscCommon.g_clipboardBase)return null;

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) Ascensio System SIA 2012-2020. All rights reserved
* Copyright (C) Ascensio System SIA 2012-2021. All rights reserved
*
* https://www.onlyoffice.com/
*

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) Ascensio System SIA 2012-2020. All rights reserved
* Copyright (C) Ascensio System SIA 2012-2021. All rights reserved
*
* https://www.onlyoffice.com/
*

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) Ascensio System SIA 2012-2020. All rights reserved
* Copyright (C) Ascensio System SIA 2012-2021. All rights reserved
*
* https://www.onlyoffice.com/
*

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) Ascensio System SIA 2012-2020. All rights reserved
* Copyright (C) Ascensio System SIA 2012-2021. All rights reserved
*
* https://www.onlyoffice.com/
*

File diff suppressed because one or more lines are too long

View file

@ -1,11 +0,0 @@
LICENCE: GNU AGPL v3.0
The code in x2t.js is a WASM build based on the OnlyOffice Core source from this repository:
https://github.com/ldubost/core/commits/wasm32-5.2.6
It is built using emscripten using docker:
https://git.xwikisas.com/caubin/onlyoffice-x2t-wasm/tree/master/x2t-wasm

File diff suppressed because it is too large Load diff

Binary file not shown.

View file

@ -1,226 +0,0 @@
// Copyright 2015 The Emscripten Authors. All rights reserved.
// Emscripten is available under two separate licenses, the MIT license and the
// University of Illinois/NCSA Open Source License. Both these licenses can be
// found in the LICENSE file.
// Pthread Web Worker startup routine:
// This is the entry point file that is loaded first by each Web Worker
// that executes pthreads on the Emscripten application.
// Thread-local:
var threadInfoStruct = 0; // Info area for this thread in Emscripten HEAP (shared). If zero, this worker is not currently hosting an executing pthread.
var selfThreadId = 0; // The ID of this thread. 0 if not hosting a pthread.
var parentThreadId = 0; // The ID of the parent pthread that launched this thread.
var noExitRuntime;
// performance.now() is specced to return a wallclock time in msecs since that Web Worker/main thread launched. However for pthreads this can cause
// subtle problems in emscripten_get_now() as this essentially would measure time from pthread_create(), meaning that the clocks between each threads
// would be wildly out of sync. Therefore sync all pthreads to the clock on the main browser thread, so that different threads see a somewhat
// coherent clock across each of them (+/- 0.1msecs in testing)
var __performance_now_clock_drift = 0;
// Cannot use console.log or console.error in a web worker, since that would risk a browser deadlock! https://bugzilla.mozilla.org/show_bug.cgi?id=1049091
// Therefore implement custom logging facility for threads running in a worker, which queue the messages to main thread to print.
var Module = {};
// These modes need to assign to these variables because of how scoping works in them.
function assert(condition, text) {
if (!condition) abort('Assertion failed: ' + text);
}
function threadPrintErr() {
var text = Array.prototype.slice.call(arguments).join(' ');
console.error(text);
console.error(new Error().stack);
}
function threadAlert() {
var text = Array.prototype.slice.call(arguments).join(' ');
postMessage({cmd: 'alert', text: text, threadId: selfThreadId});
}
var err = threadPrintErr;
this.alert = threadAlert;
// When using postMessage to send an object, it is processed by the structured clone algorithm.
// The prototype, and hence methods, on that object is then lost. This function adds back the lost prototype.
// This does not work with nested objects that has prototypes, but it suffices for WasmSourceMap and WasmOffsetConverter.
function resetPrototype(constructor, attrs) {
var object = Object.create(constructor.prototype);
for (var key in attrs) {
if (attrs.hasOwnProperty(key)) {
object[key] = attrs[key];
}
}
return object;
}
Module['instantiateWasm'] = function(info, receiveInstance) {
// Instantiate from the module posted from the main thread.
// We can just use sync instantiation in the worker.
var instance = new WebAssembly.Instance(Module['wasmModule'], info);
// We don't need the module anymore; new threads will be spawned from the main thread.
Module['wasmModule'] = null;
receiveInstance(instance); // The second 'module' parameter is intentionally null here, we don't need to keep a ref to the Module object from here.
return instance.exports;
};
this.onmessage = function(e) {
try {
if (e.data.cmd === 'load') { // Preload command that is called once per worker to parse and load the Emscripten code.
// Initialize the global "process"-wide fields:
Module['DYNAMIC_BASE'] = e.data.DYNAMIC_BASE;
Module['DYNAMICTOP_PTR'] = e.data.DYNAMICTOP_PTR;
// Module and memory were sent from main thread
Module['wasmModule'] = e.data.wasmModule;
Module['wasmMemory'] = e.data.wasmMemory;
Module['buffer'] = Module['wasmMemory'].buffer;
Module['ENVIRONMENT_IS_PTHREAD'] = true;
if (typeof e.data.urlOrBlob === 'string') {
importScripts(e.data.urlOrBlob);
} else {
var objectUrl = URL.createObjectURL(e.data.urlOrBlob);
importScripts(objectUrl);
URL.revokeObjectURL(objectUrl);
}
PThread = Module['PThread'];
HEAPU32 = Module['HEAPU32'];
if (typeof FS !== 'undefined' && typeof FS.createStandardStreams === 'function') FS.createStandardStreams();
postMessage({ cmd: 'loaded' });
} else if (e.data.cmd === 'objectTransfer') {
PThread.receiveObjectTransfer(e.data);
} else if (e.data.cmd === 'run') { // This worker was idle, and now should start executing its pthread entry point.
__performance_now_clock_drift = performance.now() - e.data.time; // Sync up to the clock of the main thread.
threadInfoStruct = e.data.threadInfoStruct;
Module['__register_pthread_ptr'](threadInfoStruct, /*isMainBrowserThread=*/0, /*isMainRuntimeThread=*/0); // Pass the thread address inside the asm.js scope to store it for fast access that avoids the need for a FFI out.
selfThreadId = e.data.selfThreadId;
parentThreadId = e.data.parentThreadId;
// Establish the stack frame for this thread in global scope
// The stack grows downwards
var max = e.data.stackBase;
var top = e.data.stackBase + e.data.stackSize;
Module['applyStackValues'](top, top, max);
assert(threadInfoStruct);
assert(selfThreadId);
assert(parentThreadId);
assert(top != 0);
assert(max === e.data.stackBase);
assert(top > max);
// Call inside asm.js/wasm module to set up the stack frame for this pthread in asm.js/wasm module scope
Module['establishStackSpace'](e.data.stackBase, e.data.stackBase + e.data.stackSize);
Module['_emscripten_tls_init']();
Module['writeStackCookie']();
PThread.receiveObjectTransfer(e.data);
PThread.setThreadStatus(Module['_pthread_self'](), 1/*EM_THREAD_STATUS_RUNNING*/);
try {
// pthread entry points are always of signature 'void *ThreadMain(void *arg)'
// Native codebases sometimes spawn threads with other thread entry point signatures,
// such as void ThreadMain(void *arg), void *ThreadMain(), or void ThreadMain().
// That is not acceptable per C/C++ specification, but x86 compiler ABI extensions
// enable that to work. If you find the following line to crash, either change the signature
// to "proper" void *ThreadMain(void *arg) form, or try linking with the Emscripten linker
// flag -s EMULATE_FUNCTION_POINTER_CASTS=1 to add in emulation for this x86 ABI extension.
var result = Module['dynCall_ii'](e.data.start_routine, e.data.arg);
Module['checkStackCookie']();
} catch(e) {
if (e === 'Canceled!') {
PThread.threadCancel();
return;
} else if (e === 'SimulateInfiniteLoop' || e === 'pthread_exit') {
return;
} else {
Atomics.store(HEAPU32, (threadInfoStruct + 4 /*C_STRUCTS.pthread.threadExitCode*/ ) >> 2, (e instanceof Module['ExitStatus']) ? e.status : -2 /*A custom entry specific to Emscripten denoting that the thread crashed.*/);
Atomics.store(HEAPU32, (threadInfoStruct + 0 /*C_STRUCTS.pthread.threadStatus*/ ) >> 2, 1); // Mark the thread as no longer running.
if (typeof(Module['_emscripten_futex_wake']) !== "function") {
err("Thread Initialisation failed.");
throw e;
}
Module['_emscripten_futex_wake'](threadInfoStruct + 0 /*C_STRUCTS.pthread.threadStatus*/, 0x7FFFFFFF/*INT_MAX*/); // Wake all threads waiting on this thread to finish.
if (!(e instanceof Module['ExitStatus'])) throw e;
}
}
// The thread might have finished without calling pthread_exit(). If so, then perform the exit operation ourselves.
// (This is a no-op if explicit pthread_exit() had been called prior.)
if (!noExitRuntime) PThread.threadExit(result);
} else if (e.data.cmd === 'cancel') { // Main thread is asking for a pthread_cancel() on this thread.
if (threadInfoStruct) {
PThread.threadCancel();
}
} else if (e.data.target === 'setimmediate') {
// no-op
} else if (e.data.cmd === 'processThreadQueue') {
if (threadInfoStruct) { // If this thread is actually running?
Module['_emscripten_current_thread_process_queued_calls']();
}
} else {
err('worker.js received unknown command ' + e.data.cmd);
console.error(e.data);
}
} catch(e) {
console.error('worker.js onmessage() captured an uncaught exception: ' + e);
console.error(e.stack);
throw e;
}
};
// Node.js support
if (typeof process === 'object' && typeof process.versions === 'object' && typeof process.versions.node === 'string') {
// Create as web-worker-like an environment as we can.
self = {
location: {
href: __filename
}
};
var onmessage = this.onmessage;
var nodeWorkerThreads = require('worker_threads');
Worker = nodeWorkerThreads.Worker;
var parentPort = nodeWorkerThreads.parentPort;
parentPort.on('message', function(data) {
onmessage({ data: data });
});
var nodeFS = require('fs');
var nodeRead = function(filename) {
return nodeFS.readFileSync(filename, 'utf8');
};
function globalEval(x) {
global.require = require;
global.Module = Module;
eval.call(null, x);
}
importScripts = function(f) {
globalEval(nodeRead(f));
};
postMessage = function(msg) {
parentPort.postMessage(msg);
};
if (typeof performance === 'undefined') {
performance = {
now: function() {
return Date.now();
}
};
}
}

View file

@ -35,6 +35,10 @@ define([
Crypto, ChainPad, CpNetflux, Listmap, nThen, Saferphore) {
var onReadyEvt = Util.mkEvent(true);
var onCacheReadyEvt = Util.mkEvent(true);
// Number of days before deleting the cache for a channel or blob
var CACHE_MAX_AGE = 90; // DAYS
// Default settings for new users
var NEW_USER_SETTINGS = {
@ -333,7 +337,6 @@ define([
if (!s.rpc) { return void cb({error: 'RPC_NOT_READY'}); }
s.rpc.removeOwnedChannel(channel, function (err) {
if (!err) { Cache.clearChannel(channel); }
cb({error:err});
});
};
@ -597,6 +600,7 @@ define([
thumbnails: disableThumbnails === false,
isDriveOwned: Boolean(Util.find(store, ['driveMetadata', 'owners'])),
support: Util.find(store.proxy, ['mailboxes', 'support', 'channel']),
driveChannel: store.driveChannel,
pendingFriends: store.proxy.friends_pending || {},
supportPrivateKey: Util.find(store.proxy, ['mailboxes', 'supportadmin', 'keys', 'curvePrivate']),
accountName: store.proxy.login_name || '',
@ -1038,6 +1042,7 @@ define([
});
};
Store.setPadTitle = function (clientId, data, cb) {
onReadyEvt.reg(function () {
var title = data.title;
var href = data.href;
var channel = data.channel;
@ -1193,6 +1198,8 @@ define([
onSync(teamId, waitFor());
});
}).nThen(cb);
});
};
// Filepicker app
@ -1268,8 +1275,17 @@ define([
}
});
});
var result = res || viewRes;
// If we're not fully synced yet and we don't have a result, wait for the ready event
if (!result && store.offline) {
onReadyEvt.reg(function () {
Store.getPadDataFromChannel(clientId, obj, cb);
});
return;
}
// Call back with the best value we can get
cb(res || viewRes || {});
cb(result || {});
};
// Hidden hash: if a pad is deleted, we may have to switch back to full hash
@ -1415,13 +1431,15 @@ define([
// Universal
Store.universal = {
execCommand: function (clientId, obj, cb) {
var type = obj.type;
var data = obj.data;
if (store.modules[type]) {
store.modules[type].execCommand(clientId, data, cb);
} else {
return void cb({error: type + ' is disabled'});
}
onReadyEvt.reg(function () {
var type = obj.type;
var data = obj.data;
if (store.modules[type]) {
store.modules[type].execCommand(clientId, data, cb);
} else {
return void cb({error: type + ' is disabled'});
}
});
}
};
var loadUniversal = function (Module, type, waitFor, clientId) {
@ -1461,17 +1479,23 @@ define([
// Cursor
Store.cursor = {
execCommand: function (clientId, data, cb) {
if (!store.cursor) { return void cb ({error: 'Cursor channel is disabled'}); }
store.cursor.execCommand(clientId, data, cb);
// The cursor module can only be used when the store is ready
onReadyEvt.reg(function () {
if (!store.cursor) { return void cb ({error: 'Cursor channel is disabled'}); }
store.cursor.execCommand(clientId, data, cb);
});
}
};
// Mailbox
Store.mailbox = {
execCommand: function (clientId, data, cb) {
if (!store.loggedIn) { return void cb(); }
if (!store.mailbox) { return void cb ({error: 'Mailbox is disabled'}); }
store.mailbox.execCommand(clientId, data, cb);
// The mailbox can only be used when the store is ready
onReadyEvt.reg(function () {
if (!store.loggedIn) { return void cb(); }
if (!store.mailbox) { return void cb ({error: 'Mailbox is disabled'}); }
store.mailbox.execCommand(clientId, data, cb);
});
}
};
@ -2511,8 +2535,7 @@ define([
var onCacheReady = function (clientId, cb) {
var proxy = store.proxy;
if (!proxy.settings) { proxy.settings = NEW_USER_SETTINGS; }
if (!proxy.friends_pending) { proxy.friends_pending = {}; }
if (store.manager) { return void cb(); }
var unpin = function (data, cb) {
if (!store.loggedIn) { return void cb(); }
Store.unpinPads(null, data, cb);
@ -2557,6 +2580,8 @@ define([
nThen(function (waitFor) {
if (manager) { return; }
if (!proxy.settings) { proxy.settings = NEW_USER_SETTINGS; }
if (!proxy.friends_pending) { proxy.friends_pending = {}; }
onCacheReady(clientId, waitFor());
manager = store.manager;
userObject = store.userObject;
@ -2592,11 +2617,11 @@ define([
loadUniversal(Messenger, 'messenger', waitFor);
store.messenger = store.modules['messenger'];
loadUniversal(Profile, 'profile', waitFor);
loadUniversal(Team, 'team', waitFor, clientId); // XXX load teams offline?
loadUniversal(Team, 'team', waitFor, clientId); // TODO load teams offline
loadUniversal(History, 'history', waitFor);
}).nThen(function () {
var requestLogin = function () {
broadcast([], "REQUEST_LOGIN");
var requestLogin = function () {
broadcast([], "REQUEST_LOGIN");
};
if (store.loggedIn) {
@ -2629,14 +2654,14 @@ define([
returned.feedback = Util.find(proxy, ['settings', 'general', 'allowUserFeedback']);
Feedback.init(returned.feedback);
// XXX send feedback and logintoken to outer...
// "cb" may have already been called by onCacheReady
store.returned = returned;
if (typeof(cb) === 'function') { cb(returned); }
sendDriveEvent('NETWORK_RECONNECT');
broadcast([], "UPDATE_METADATA");
store.offline = false;
// XXX broadcast READY event with the missing data
// XXX we can improve feedback to queue the queries and send them when coming back online
sendDriveEvent('NETWORK_RECONNECT'); // Tell inner that we're now online
broadcast([], "UPDATE_METADATA");
broadcast([], "STORE_READY", returned);
if (typeof(proxy.uid) !== 'string' || proxy.uid.length !== 32) {
// even anonymous users should have a persistent, unique-ish id
@ -2691,9 +2716,9 @@ define([
broadcast([], "UPDATE_TOKEN", { token: proxy[Constants.tokenKey] });
});
onReadyEvt.fire();
loadMailbox();
onReadyEvt.fire();
});
};
@ -2738,15 +2763,39 @@ define([
returned.anonHash = Hash.getEditHashFromKeys(secret);
}
}).on('cacheready', function (info) {
if (!data.cache) { return; }
store.offline = true;
store.realtime = info.realtime;
store.networkPromise = info.networkPromise;
// XXX make sure we have a valid drive available
store.cacheReturned = returned;
if (store.networkPromise && store.networkPromise.then) {
// Check if we can connect
var to = setTimeout(function () {
store.networkTimeout = true;
broadcast([], "LOADING_DRIVE", {
type: "offline"
});
}, 5000);
store.networkPromise.then(function () {
clearTimeout(to);
}, function (err) {
console.error(err);
clearTimeout(to);
});
}
if (!data.cache) { return; }
// Make sure we have a valid user object before emitting cacheready
if (rt.proxy && !rt.proxy.drive) { return; }
onCacheReady(clientId, function () {
if (typeof(cb) === "function") { cb(returned); }
onCacheReadyEvt.fire();
});
}).on('ready', function (info) {
delete store.networkTimeout;
if (store.ready) { return; } // the store is already ready, it is a reconnection
store.driveMetadata = info.metadata;
if (!rt.proxy.drive || typeof(rt.proxy.drive) !== 'object') { rt.proxy.drive = {}; }
@ -2815,6 +2864,15 @@ define([
}, PING_INTERVAL);
};
Store.disableCache = function (clientId, disabled, cb) {
if (disabled) {
Cache.disable();
} else {
Cache.enable();
}
cb();
};
/**
* Data:
* - userHash or anonHash
@ -2826,23 +2884,40 @@ define([
*/
var initialized = false;
var whenReady = function (cb) {
if (store.returned) { return void cb(); }
setTimeout(function() {
whenReady(cb);
}, 100);
};
Store.init = function (clientId, data, _callback) {
var callback = Util.once(_callback);
// If this is not the first tab and we're offline, callback only if the app
// supports offline mode
if (initialized && !store.returned && data.cache) {
return void onCacheReadyEvt.reg(function () {
callback({
state: 'ALREADY_INIT',
returned: store.cacheReturned
});
});
}
// If this is not the first tab (initialized is true), it means either we don't
// support offline or we're already online
if (initialized) {
return void whenReady(function () {
if (store.networkTimeout) {
postMessage(clientId, "LOADING_DRIVE", {
type: "offline"
});
}
return void onReadyEvt.reg(function () {
callback({
state: 'ALREADY_INIT',
returned: store.returned
});
});
}
if (data.disableCache) {
Cache.disable();
}
initialized = true;
postMessage = function (clientId, cmd, d, cb) {
data.query(clientId, cmd, d, cb);
@ -2858,12 +2933,31 @@ define([
}
if (ret && ret.error) {
initialized = false;
} else {
store.returned = ret;
}
callback(ret);
});
// Clear inactive channels from cache
onReadyEvt.reg(function () {
var inactiveTime = (+new Date()) - CACHE_MAX_AGE * (24 * 3600 * 1000);
Cache.getKeys(function (err, keys) {
if (err) { return void console.error(err); }
var next = function () {
if (!keys.length) { return; }
var key = keys.pop();
Cache.getTime(key, function (err, atime) {
if (err) { return void next(); }
if (!atime || atime < inactiveTime) {
Cache.clearChannel(key, next());
return;
}
next();
});
};
next();
});
});
};
Store.disconnect = function () {

View file

@ -7,10 +7,14 @@ define([
// Check if indexedDB is allowed
var allowed = false;
var disabled = false;
var supported = false;
try {
var request = window.indexedDB.open('test_db', 1);
request.onsuccess = function () {
allowed = true;
supported = true;
allowed = supported && !disabled;
onReady.fire();
};
request.onerror = function () {
@ -20,6 +24,15 @@ define([
onReady.fire();
}
S.enable = function () {
disabled = false;
allowed = supported && !disabled;
};
S.disable = function () {
disabled = true;
allowed = supported && !disabled;
};
var cache = localForage.createInstance({
driver: localForage.INDEXEDDB,
name: "cp_cache"
@ -141,6 +154,30 @@ define([
});
};
S.getKeys = function (cb) {
cb = Util.once(Util.mkAsync(cb || function () {}));
onReady.reg(function () {
if (!allowed) { return void cb('NOCACHE'); }
cache.keys().then(function (keys) {
cb(null, keys);
}).catch(function (err) {
cb(err);
});
});
};
S.getTime = function (id, cb) {
cb = Util.once(Util.mkAsync(cb || function () {}));
onReady.reg(function () {
if (!allowed) { return void cb('NOCACHE'); }
cache.getItem(id, function (err, obj) {
if (err || !obj || !obj.c) {
return void cb(Util.serializeError(err || 'EINVAL'));
}
cb(null, obj.t);
});
});
};
self.CryptPad_clearIndexedDB = S.clear;
return S;

View file

@ -21,6 +21,7 @@ define([
if (!client || !client.cursor) { return; }
var chan = ctx.channels[client.channel];
if (!chan) { return; }
if (!chan.sendMsg) { return; } // Store not synced yet, we're running with the cache
var data = {
id: client.id,
cursor: client.cursor

View file

@ -183,10 +183,6 @@ define([
};
var rt = sf.rt = Listmap.create(listmapConfig);
rt.proxy.on('cacheready', function () {
if (isNew && !Object.keys(rt.proxy).length) {
// New Shared folder: no migration required
rt.proxy.version = 2;
}
if (!sf.teams) {
return;
}
@ -197,7 +193,12 @@ define([
// 1. addProxy won't re-add the same folder twice on 'ready'
// 2. obj.cb is using Util.once
rt.cache = true;
obj.store.manager.addProxy(obj.id, rt, leave, obj.secondaryKey);
// If we're updating the password of an existing folder, force the creation
// of a new userobject in proxy-manager. Once it's done, remove this flag
// to make sure we won't create a second new userobject on 'ready'
obj.store.manager.addProxy(obj.id, rt, leave, obj.secondaryKey, config.updatePassword);
config.updatePassword = false;
obj.cb(sf.rt);
});
sf.ready = true;
@ -220,7 +221,7 @@ define([
});
*/
rt.cache = false;
obj.store.manager.addProxy(obj.id, rt, leave, obj.secondaryKey);
obj.store.manager.addProxy(obj.id, rt, leave, obj.secondaryKey, config.updatePassword);
obj.cb(sf.rt);
});
sf.ready = true;
@ -324,6 +325,7 @@ define([
SF.load({
network: network,
store: s,
updatePassword: true,
isNewChannel: Store.isNewChannel
}, sfId, sf, waitFor());
if (!s.rpc) { return; }

View file

@ -73,6 +73,7 @@ var init = function (client, cb) {
});
chan.on('CONNECT', function (cfg, cb) {
debug('SharedW connecting to store...');
/*
if (self.store) {
debug('Store already exists!');
if (cfg.driveEvents) {
@ -80,31 +81,35 @@ var init = function (client, cb) {
}
return void cb(self.store);
}
*/
debug('Loading new async store');
// One-time initialization (init async-store)
cfg.query = function (cId, cmd, data, cb) {
cb = cb || function () {};
self.tabs[cId].chan.query(cmd, data, function (err, data2) {
if (err) { return void cb({error: err}); }
cb(data2);
});
};
cfg.broadcast = function (excludes, cmd, data, cb) {
cb = cb || function () {};
Object.keys(self.tabs).forEach(function (cId) {
if (excludes.indexOf(cId) !== -1) { return; }
if (!self.store) {
debug('Loading new async store');
// One-time initialization (init async-store)
cfg.query = function (cId, cmd, data, cb) {
cb = cb || function () {};
self.tabs[cId].chan.query(cmd, data, function (err, data2) {
if (err) { return void cb({error: err}); }
cb(data2);
});
});
};
};
cfg.broadcast = function (excludes, cmd, data, cb) {
cb = cb || function () {};
Object.keys(self.tabs).forEach(function (cId) {
if (excludes.indexOf(cId) !== -1) { return; }
self.tabs[cId].chan.query(cmd, data, function (err, data2) {
if (err) { return void cb({error: err}); }
cb(data2);
});
});
};
}
Rpc.queries['CONNECT'](clientId, cfg, function (data) {
if (cfg.driveEvents) {
Rpc._subscribeToDrive(clientId);
}
if (data && data.state === "ALREADY_INIT") {
debug('Store already exists!');
self.store = data.returned;
return void cb(data.returned);
}

View file

@ -14,6 +14,7 @@ define([
CREATE_README: Store.createReadme,
MIGRATE_ANON_DRIVE: Store.migrateAnonDrive,
PING: function (cId, data, cb) { cb(); },
CACHE_DISABLE: Store.disableCache,
// RPC
UPDATE_PIN_LIMIT: Store.updatePinLimit,
GET_PIN_LIMIT: Store.getPinLimit,

View file

@ -76,9 +76,15 @@ define([
};
// Fire an event. channel.event('EV_SOMETHING', { args: "whatever" });
var event = chan.event = function (e, content) {
var event = chan.event = function (e, content, opts) {
opts = opts || {};
evReady.reg(function () {
postMsg(JSON.stringify({ content: content, q: e }));
var toSend = {
content: content,
q: e,
raw: opts.raw
};
postMsg(opts.raw ? toSend : JSON.stringify(toSend));
});
};

View file

@ -1,6 +1,6 @@
(function () {
var factory = function (Util, Rpc) {
var create = function (network, proxy, _cb) {
var create = function (network, proxy, _cb, Cache) {
if (typeof(_cb) !== 'function') { throw new Error("Expected callback"); }
var cb = Util.once(Util.mkAsync(_cb));
@ -155,6 +155,9 @@ var factory = function (Util, Rpc) {
if (e) { return void cb(e); }
if (response && response.length && response[0] === "OK") {
cb();
if (Cache && Cache.clearChannel) {
Cache.clearChannel(channel);
}
} else {
cb('INVALID_RESPONSE');
}

View file

@ -16,8 +16,8 @@ define([
};
// Add a shared folder to the list
var addProxy = function (Env, id, lm, leave, editKey) {
if (Env.folders[id]) {
var addProxy = function (Env, id, lm, leave, editKey, force) {
if (Env.folders[id] && !force) {
// Shared folder already added to the proxy-manager, probably
// a cached version
if (Env.folders[id].offline && !lm.cache) {
@ -973,8 +973,8 @@ define([
if (!resolved.id) {
var el = Env.user.userObject.find(resolved.path);
if (Env.user.userObject.isSharedFolder(el) && Env.folders[el]) {
Env.folders[el].proxy.metadata.title = data.newName;
Env.user.proxy[UserObject.SHARED_FOLDERS][el].lastTitle = data.newName;
Env.folders[el].proxy.metadata.title = data.newName || Messages.fm_folder;
Env.user.proxy[UserObject.SHARED_FOLDERS][el].lastTitle = data.newName || Messages.fm_folder;
return void cb();
}
}

View file

@ -503,6 +503,8 @@ define([
// We've received a link without /p/ and it doesn't work without a password: abort
return void todo();
}
// XXX is this required?
if (e === "ANON_RPC_NOT_READY") {
// We're currently offline and the pad is not in our cache
w.abort();
@ -669,7 +671,16 @@ define([
// Put in the following function the RPC queries that should also work in filepicker
var _sframeChan = sframeChan;
var addCommonRpc = function (sframeChan, safe) {
// Send UI.log and UI.warn commands from the secureiframe to the normal iframe
sframeChan.on('EV_ALERTIFY_LOG', function (msg) {
_sframeChan.event('EV_ALERTIFY_LOG', msg);
});
sframeChan.on('EV_ALERTIFY_WARN', function (msg) {
_sframeChan.event('EV_ALERTIFY_WARN', msg);
});
Cryptpad.universal.onEvent.reg(function (data) {
sframeChan.event('EV_UNIVERSAL_EVENT', data);
});
@ -1486,6 +1497,21 @@ define([
});
});
sframeChan.on('Q_CACHE_DISABLE', function (data, cb) {
if (data.disabled) {
Utils.Cache.clear(function () {
Utils.Cache.disable();
});
Cryptpad.disableCache(true, cb);
return;
}
Utils.Cache.enable();
Cryptpad.disableCache(false, cb);
});
sframeChan.on('Q_CLEAR_CACHE', function (data, cb) {
Utils.Cache.clear(cb);
});
sframeChan.on('Q_PIN_GET_USAGE', function (teamId, cb) {
Cryptpad.isOverPinLimit(teamId, function (err, overLimit, data) {
cb({

View file

@ -185,15 +185,24 @@ define([
});
};
funcs.getFileSize = function (channelId, cb) {
funcs.sendAnonRpcMsg("GET_FILE_SIZE", channelId, function (data) {
if (!data) { return void cb("No response"); }
if (data.error) { return void cb(data.error); }
if (data.response && data.response.length && typeof(data.response[0]) === 'number') {
return void cb(void 0, data.response[0]);
} else {
cb('INVALID_RESPONSE');
}
funcs.getFileSize = function (channelId, cb, noCache) {
nThen(function (waitFor) {
if (channelId.length < 48 || noCache) { return; }
ctx.cache.getBlobCache(channelId, waitFor(function(err, blob) {
if (err) { return; }
waitFor.abort();
cb(null, blob.length);
}));
}).nThen(function () {
funcs.sendAnonRpcMsg("GET_FILE_SIZE", channelId, function (data) {
if (!data) { return void cb("No response"); }
if (data.error) { return void cb(data.error); }
if (data.response && data.response.length && typeof(data.response[0]) === 'number') {
return void cb(void 0, data.response[0]);
} else {
cb('INVALID_RESPONSE');
}
});
});
};
@ -749,7 +758,7 @@ define([
window.cryptpadStore._put(k, v, cb);
var x = {};
x[k] = v;
ctx.sframeChan.event('EV_LOCALSTORE_PUT', x);
ctx.sframeChan.event('EV_LOCALSTORE_PUT', x, {raw:true});
};
});
@ -767,10 +776,6 @@ define([
UI.errorLoadingScreen(Messages.restrictedError);
});
ctx.sframeChan.on("EV_OFFLINE", function () {
UI.errorLoadingScreen("OFFLINE AND NO CACHE"); // XXX
});
ctx.sframeChan.on("EV_PAD_PASSWORD_ERROR", function () {
UI.errorLoadingScreen(Messages.password_error_seed);
});
@ -846,6 +851,14 @@ define([
Feedback.init(feedback);
} catch (e) { Feedback.init(false); }
if (privateData.secureIframe) {
UI.log = function (msg) { ctx.sframeChan.event('EV_ALERTIFY_LOG', msg); };
UI.warn = function (msg) { ctx.sframeChan.event('EV_ALERTIFY_WARN', msg); };
} else {
ctx.sframeChan.on('EV_ALERTIFY_LOG', function (msg) { UI.log(msg); });
ctx.sframeChan.on('EV_ALERTIFY_WARN', function (msg) { UI.warn(msg); });
}
try {
var forbidden = privateData.disabledApp;
if (forbidden) {

View file

@ -1423,7 +1423,7 @@ MessengerUI, Messages) {
toolbar.isErrorState = bool; // Stop kickSpinner
toolbar.title.toggleClass('cp-toolbar-unsync', bool); // "read only" next to the title
if (bool && toolbar.spinner) {
toolbar.spinner.text(Messages.offline);
toolbar.spinner.text(Messages.Offline);
} else {
kickSpinner(toolbar, config);
}

View file

@ -422,7 +422,6 @@
"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.",
@ -632,6 +631,5 @@
"whatis_title": "Què és CryptPad",
"terms": "Condicions d'ús",
"main_info": "<h2>Col·laboreu amb Confiança</h2>\nFeu créixer les vostres idees conjuntament amb documents compartits mentre la tecnologia <strong>Coneixement Zero</strong> assegura la vostra privacitat; <strong>fins i tot per nosaltres</strong>.",
"whatis_collaboration_p1": "Amb CryptPad, podeu crear de forma ràpida, documents col·laboratius per prendre notes i posar en ordre idees conjuntament. Quan us registreu i inicieu la vostra sessió, teniu la capacitat de carregar fitxers i un CryptDrive on podeu organitzar tots els vostres documents. Com a persona registrada disposeu de 50MB d'espai gratuït.",
"privacy": "Privacitat"
}

View file

@ -406,18 +406,17 @@
"login_invalUser": "Der Benutzername kann nicht leer sein",
"login_invalPass": "Der Passwort kann nicht leer sein",
"login_unhandledError": "Ein unerwarteter Fehler ist aufgetreten :(",
"register_importRecent": "Die Pads aus deiner anonymen Sitzung importieren",
"register_importRecent": "Dokumente aus deiner nicht-registrierten Sitzung importieren",
"register_acceptTerms": "Ich bin mit den <a href='/terms.html' tabindex='-1'>Nutzungsbedingungen</a> einverstanden",
"register_passwordsDontMatch": "Passwörter stimmen nicht überein!",
"register_passwordTooShort": "Passwörter müssen mindestens {0} Zeichen haben.",
"register_mustAcceptTerms": "Du musst mit den Nutzungsbedingungen einverstanden sein.",
"register_mustRememberPass": "Wir können dein Passwort nicht zurücksetzen, falls du es vergisst. Es ist sehr wichtig, dass du es dir merkst! Bitte markiere das Kästchen, um dies zu bestätigen.",
"register_whyRegister": "Wieso solltest du dich registrieren?",
"register_header": "Willkommen zu CryptPad",
"register_explanation": "<h3>Lass uns ein paar Punkte überprüfen:</h3><ul class='list-unstyled'><li><i class='fa fa-info-circle'> </i> Dein Passwort ist dein Geheimnis, um alle deine Dokumente zu verschlüsseln. Wenn du es verlierst, können deine Daten nicht wiederhergestellt werden.</li><li><i class='fa fa-info-circle'> </i> Du kannst die Pads, die du zuletzt angesehen hast, importieren. Sie sind dann in deinem CryptDrive.</li><li><i class='fa fa-info-circle'> </i> Wenn du den Rechner mit anderen teilst, musst du dich ausloggen, wenn du fertig bist. Es ist nicht ausreichend, das Browserfenster oder den Browser zu schließen.</li></ul>",
"register_header": "Registrieren",
"register_writtenPassword": "Ich habe meinen Benutzername und mein Passwort notiert. Weiter geht's",
"register_cancel": "Zurück",
"register_warning": "\"Ohne Preisgabe von Daten\" bedeutet, dass niemand deine Daten wiederherstellen kann, wenn du dein Passwort verlierst.",
"register_cancel": "Abbrechen",
"register_warning": "<i class='fa fa-warning'></i> Warnung",
"register_alreadyRegistered": "Dieser Benutzer existiert bereits, möchtest du dich einloggen?",
"settings_cat_account": "Account",
"settings_cat_drive": "CryptDrive",
@ -586,41 +585,28 @@
"mdToolbar_check": "Aufgabenliste",
"mdToolbar_code": "Code",
"home_product": "CryptPad ist eine Alternative mit eingebautem Datenschutz zu verbreiteten Office- und Clouddiensten. Mit CryptPad wird der gesamte Inhalt verschlüsselt, bevor er an den Server gesendet wird. Das bedeutet, dass keiner auf den Inhalt zugreifen kann, es sei denn du gibst die Schlüssel weiter. Selbst wir haben diesen Zugriff nicht.",
"home_host": "Dies ist eine unabhängige Installation der CrypPad-Software. Der Quellcode ist <a href=\"https://github.com/xwiki-labs/cryptpad\" target=\"_blank\" rel=\"noreferrer noopener\">auf GitHub</a> verfügbar.",
"home_host": "Dies ist eine unabhängige Installation der CrypPad-Software.",
"home_host_agpl": "CryptPad kann unter der Lizenz AGPL3 verbreitet werden",
"home_ngi": "Gewinner beim NGI Award",
"about_intro": "CryptPad wurde erstellt im Forschungsteam von <a href=\"http://xwiki.com\">XWiki SAS</a>, einem kleinen Unternehmen in Paris (Frankreich) und Iasi (Rumänien). Im Kernteam arbeiten 3 Mitglieder an CryptPad, außerdem gibt es einige Mitwirkende innerhalb und außerhalb von XWiki SAS.",
"about_core": "Kernentwickler",
"about_contributors": "Wichtige Mitwirkende",
"main_info": "<h2>Vertrauenswürdige Zusammenarbeit</h2> Lass deine Ideen gemeinsam wachsen, während die <strong>Zero-Knowledge</strong>-Technologie den Schutz deiner Daten <strong>sogar uns gegenüber</strong> sichert.",
"main_catch_phrase": "Die Cloud ohne Preisgabe deiner Daten",
"main_catch_phrase": "Suite zur Zusammenarbeit,<br>verschlüsselt und quelloffen",
"main_footerText": "Mit CryptPad kannst du schnell kollaborative Dokumente erstellen, um Notizen oder Ideen zusammen mit anderen zu bearbeiten.",
"footer_applications": "Anwendungen",
"footer_contact": "Kontakt",
"footer_aboutUs": "Über uns",
"about": "Über uns",
"privacy": "Datenschutz",
"privacy": "Datenschutzerklärung",
"contact": "Kontakt",
"terms": "Nutzungsbedingungen",
"blog": "Blog",
"topbar_whatIsCryptpad": "Was ist CryptPad",
"whatis_title": "Was ist CryptPad",
"whatis_collaboration": "Effektive und leichte Zusammenarbeit",
"whatis_collaboration_p1": "Mit CryptPad kannst du kollaborative Dokumente erstellen, um Notizen und Ideen gemeinsam zu bearbeiten. Wenn du dich registrierst und einloggst, bekommst du die Möglichkeit, Dateien hochzuladen und Ordner einzurichten, um alle deine Dokumente zu organisieren. Als registrierter Nutzer erhältst du kostenlos 50 MB Speicherplatz.",
"whatis_collaboration_p2": "Du kannst den Zugang zu einem CryptPad-Dokument teilen, indem du einfach den entsprechenden Link teilst. Du kannst auch einen <em>schreibgeschützten</em> Zugang erstellen, um die Ergebnisse deiner Arbeit zu teilen, während du sie noch bearbeitest.",
"whatis_collaboration_p3": "Du kannst Rich-Text Dokumente mit dem <a href=\"http://ckeditor.com/\">CKEditor</a> erstellen. Außerdem kannst du Markdown-Dokumente erstellen, die in Echtzeit formatiert angezeigt werden, während du tippst. Du kannst auch die Umfrage-Anwendung verwenden, um Termine unter mehrere Teilnehmern zu abzustimmen.",
"whatis_zeroknowledge": "Zero Knowledge - Ohne Preisgabe deiner Daten",
"whatis_zeroknowledge_p1": "Wir wollen nicht wissen, was du gerade tippst. Und mit moderner Verschlüsselungstechnologie, kannst du sicher sein, dass wir es auch nicht können. CryptPad verwendet <strong>100% clientseitige Verschlüsselung</strong>, um den Inhalt vor uns, den Hostern dieser Website, zu schützen.",
"whatis_zeroknowledge_p2": "Wenn du dich registrierst und einloggst, werden dein Benutzername und dein Passwort in einen Schlüssel mit einer <a href=\"https://de.wikipedia.org/wiki/Scrypt\">Scrypt Schlüssel-Ableitungsfunktion</a> umgerechnet. Weder dieser Schlüssel noch der Benutzername oder das Passwort werden zum Server geschickt. Stattdessen werden sie clientseitig benutzt, um den Inhalt deines CryptDrives zu entschlüsseln. Dieses beinhaltet alle Dokumente, die dir zugänglich sind.",
"whatis_zeroknowledge_p3": "Wenn du Link zu einem Dokument teilst, teilst du auch den kryptografischen Schlüssel, der Zugang zu diesem Dokument gibt. Da dieser Schlüssel im <a href=\"https://de.wikipedia.org/wiki/Fragmentbezeichner\">Fragmentbezeichner</a> liegt, wird er nie direkt zum Server geschickt. Bitte lies unsere <a href=\"https://blog.cryptpad.fr/2017/07/07/cryptpad-analytics-what-we-cant-know-what-we-must-know-what-we-want-to-know/\">Blogeintrag über Datenschutz</a>, um mehr darüber zu erfahren, auf welche Typen von Metadaten wir zugreifen können und auf welche nicht.",
"whatis_title": "Was ist CryptPad?",
"whatis_collaboration": "Vertrauliche Zusammenarbeit",
"whatis_drive": "Organisieren mit CryptDrive",
"whatis_drive_p1": "Sobald auf ein Dokument mit CryptPad zugegriffen wird, wird es automatisch zum Stamm-Ordner deines CryptDrives hinzugefügt. Später kannst du diese Dokumente in eigenen Ordnern organisieren oder du kannst es in den Papierkorb verschieben. CryptDrive erlaubt die Suche nach deinen Dokumenten, wie und wann du willst.",
"whatis_drive_p2": "Mit einfachem Drag & Drop kannst du die Pads in deinem CryptDrive verschieben. Die Links zu diesen Pads bleiben erhalten, damit Mitarbeiter nie ihren Zugang verlieren.",
"whatis_drive_p3": "Du kannst auch Dateien in dein CryptDrive hochladen und mit deinen Kollegen teilen. Hochgeladene Dateien können genau so wie kollaborative Pads organisiert werden.",
"whatis_business": "CryptPad im Business",
"whatis_business_p1": "Die Zero-Knowledge-Verschlüsselung von CryptPad multipliziert die Effektivität existierender Sicherheitsprotokolle durch Spiegelung der Zugangskontrollen von Organisationen in Kryptografie. Weil sensible Daten nur mit den Zugangsdaten des Nutzers entschlüsselt werden können, ist CryptPad ein weniger lohnendes Ziel verglichen mit traditionellen Cloud-Diensten. Lies das <a href=\"https://blog.cryptpad.fr/images/CryptPad-Whitepaper-v1.0.pdf\">CryptPad-Whitepaper</a>, um mehr darüber zu erfahren, wie CryptPad deinem Unternehmen helfen kann.",
"whatis_business_p2": "CryptPad kann auf eigenen Rechnern installiert werden. <a href=\"https://cryptpad.fr/about.html\">Entwickler der CryptPad-Software</a> von XWiki SAS können kommerzielle Unterstützung, Anpassung und Entwicklung anbieten. Bitte schicke eine E-Mail an <a href=\"mailto:sales@cryptpad.fr\">sales@cryptpad.fr</a>, um mehr zu erfahren.",
"policy_title": "Datenschutzbestimmungen für CryptPad",
"policy_title": "Datenschutzerklärung für CryptPad",
"policy_whatweknow": "Was wir über dich wissen",
"policy_whatweknow_p1": "Als im Web gehostete Anwendung hat CryptPad Zugriff auf die Metadaten, die vom HTTP-Protokoll übertragen werden. Dies umfasst deine IP-Adresse und diverse andere HTTP-Header, die es ermöglichen, deinen Browser zu identifizieren. Um zu sehen, welche Daten dein Browser preisgibt, kannst du die Seite <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.whatismybrowser.com/detect/what-http-headers-is-my-browser-sending\" title=\"Welche HTTP-Header sendet mein Browser\">WhatIsMyBrowser.com</a> besuchen.",
"policy_whatweknow_p2": "Wir nutzen <a href=\"https://www.elastic.co/products/kibana\" target=\"_blank\" rel=\"noopener noreferrer\" title=\"Open-Source-Analyseplattform\">Kibana</a>, eine Open-Source-Analyseplattform, um mehr über unsere Nutzer zu erfahren. Kibana teilt uns mit, wie du Cryptpad gefunden hast &mdash; durch direkten Zugriff, mit Hilfe einer Suchmaschine oder über einen Link auf einer anderen Seite wie beispielsweise Reddit oder Twitter.",
@ -638,185 +624,44 @@
"policy_choices_vpn": "Wenn du unsere gehostete Instanz nutzen möchtest, ohne deine IP-Adresse zu offenbaren, bitten wir dich darum, deine IP-Adresse zu verschleiern. Das ist zum Beispiel mit dem <a href=\"https://www.torproject.org/projects/torbrowser.html.en\" title=\"Downloads des Tor-Projekts\" target=\"_blank\" rel=\"noopener noreferrer\">Tor Browser</a> oder einem <a href=\"https://riseup.net/en/vpn\" title=\"Von Riseup bereitgestellte VPN-Dienste\" target=\"_blank\" rel=\"noopener noreferrer\">VPN-Zugang</a> möglich.",
"policy_choices_ads": "Wenn du unsere Analysesoftware blockieren möchtest, kannst du Blocker-Software wie <a href=\"https://www.eff.org/privacybadger\" title=\"Privacy Badger herunterladen\" target=\"_blank\" rel=\"noopener noreferrer\">Privacy Badger</a> verwenden.",
"features": "Funktionen",
"features_title": "Vergleich der Funktionen",
"features_title": "Funktionen",
"features_feature": "Funktion",
"features_anon": "Anonymer Benutzer",
"features_registered": "Angemeldete Benutzer",
"features_premium": "Premium-Benutzer",
"features_anon": "Nicht-registriert",
"features_registered": "Registriert",
"features_premium": "Premium",
"features_notes": "Hinweise",
"features_f_apps": "Zugang zu den wichtigsten Anwendungen",
"features_f_core": "Gemeinsame Funktionen der Anwendungen",
"features_f_apps": "Zugang zu allen Anwendungen",
"features_f_core": "Gemeinsame Funktionen",
"features_f_core_note": "Bearbeiten, Importieren & Exportieren, Verlauf, Benutzerliste, Chat",
"features_f_file0": "Dateien öffnen",
"features_f_file0_note": "Von anderen geteilte Dateien ansehen und herunterladen",
"features_f_file0": "Dokumente öffnen",
"features_f_file0_note": "Von anderen geteilte Dokumente ansehen und herunterladen",
"features_f_cryptdrive0": "Begrenzter Zugang zu CryptDrive",
"features_f_cryptdrive0_note": "Du kannst besuchte Dokumente in deinem Browser speichern, damit du sie später öffnen kannst",
"features_f_storage0": "Speicherung für eine begrenzte Zeit",
"features_f_storage0_note": "Neue Dokumente könnten nach drei Monaten ohne Aktivität gelöscht werden",
"features_f_storage0_note": "Dokumente werden nach {0} Tagen ohne Aktivität gelöscht",
"features_f_anon": "Alle Funktionen für anonyme Benutzer",
"features_f_anon_note": "Mit einer besseren Benutzbarkeit und mehr Kontrolle über deine Dokumente",
"features_f_anon_note": "Mit zusätzlichen Funktionen",
"features_f_cryptdrive1": "Alle Funktionen des CryptDrives",
"features_f_cryptdrive1_note": "Ordner, geteilte Ordner, Vorlagen, Tags",
"features_f_devices": "Deine Dokumente auf allen deinen Geräten",
"features_f_devices_note": "Überall Zugang zu deinem CryptDrive mit deinem Benutzer-Account",
"features_f_social": "Soziale Anwendungen",
"features_f_social_note": "Ein Profil erstellen, ein Profilbild verwenden, mit Kontakten chatten",
"features_f_social": "Soziale Funktionen",
"features_f_social_note": "Kontakte für sichere Zusammenarbeit hinzufügen, ein Profil erstellen, detaillierte Zugriffskontrolle",
"features_f_file1": "Dateien hochladen und teilen",
"features_f_file1_note": "Dateien mit Kontakten teilen oder sie in Dokumenten einbetten",
"features_f_storage1": "Langfristige Speicherung (50 MB)",
"features_f_storage1_note": "Dateien in deinem CryptDrive werden nicht wegen Inaktivität gelöscht",
"features_f_file1_note": "Speichere Dateien in deinem CryptDrive: Bilder, PDFs, Videos und mehr. Teile sie mit deinen Kontakten oder bette sie in deine Dokumente ein. (Bis zu {0} MB)",
"features_f_storage1": "Persönlicher Speicherplatz ({0})",
"features_f_storage1_note": "Dokumente in deinem CryptDrive werden nicht wegen Inaktivität gelöscht",
"features_f_register": "Registrieren (kostenlos)",
"features_f_register_note": "Keine E-Mail-Adresse oder persönliche Informationen notwendig",
"features_f_reg": "Alle Funktionen für angemeldete Benutzer",
"features_f_reg_note": "Du unterstützt die Entwicklung von CryptPad",
"features_f_reg_note": "Mit zusätzlichen Vorteilen",
"features_f_storage2": "Mehr Speicherplatz",
"features_f_storage2_note": "Zwischen 5 GB und 50 GB, abhängig vom gewählten Tarif",
"features_f_storage2_note": "Zwischen 5 GB und 50 GB abhängig vom gewählten Tarif, erhöhte Begrenzung von {0} für Dateiuploads",
"features_f_support": "Schnellerer Support",
"features_f_support_note": "Professioneller Support via E-Mail mit dem Team-Tarif",
"features_f_supporter": "Werde ein Unterstützer des Datenschutzes",
"features_f_supporter_note": "Hilf uns beweisen, dass Software mit eingebauten Datenschutz die Normalität sein sollte",
"features_f_subscribe": "Premium kaufen",
"features_f_subscribe_note": "Du muss zuerst in CryptPad eingeloggt sein",
"faq_link": "FAQ",
"faq_title": "Häufige Fragen",
"faq_whatis": "Was ist <span class='cp-brand-font'>CryptPad</span>?",
"faq": {
"keywords": {
"title": "Schlüsselkonzepte",
"pad": {
"q": "Was ist ein Pad?",
"a": "Ein CryptPad-Dokument wird meist einfach <em>Pad</em> genannt. Dies wurde von <a href='http://etherpad.org/' target='_blank'>Etherpad</a> übernommen, einem kollaborativen Echtzeit-Editor.\nEs beschreibt ein Dokument, das du in deinem Browser bearbeiten kannst, normalerweise mit der Möglichkeit für andere Personen, die Veränderungen nahezu in Echtzeit zu sehen."
},
"owned": {
"q": "Was ist ein eigenes Pad?",
"a": "Ein <em>eigenes Pad</em> ist ein Pad mit einem definierten Eigentümer, der anhand seiner <em>Unterschrift mit öffentlichen Schlüssel</em> erkannt wird.Der Eigentümer eines Pads kann entscheiden, das Pad zu löschen. In diesem Fall ist das Pad auch für andere Nutzer nicht mehr verfügbar. Dabei spielt es keine Rolle, ob das Pad im CryptDrive der anderen Nutzer gespeichert war oder nicht."
},
"expiring": {
"q": "Was sind ablaufende Pads?",
"a": "Ein Pad kann mit einem <em>Ablaufdatum</em> versehen werden. Nach diesem Datum wird es automatisch vom Server gelöscht. Das Ablaufdatum kann sowohl sehr bald sein (in ein paar Stunden) oder in weiter Zukunft liegen (in hunderten Monaten). Das Pad und sein gesamter Verlauf wird nach dem Ablaufdatum endgültig gelöscht, auch wenn es gerade noch bearbeitet wird.<br><br>Wenn ein Dokument ein Ablaufdatum hat, kann man dieses Datum in den <em>Eigenschaften</em> sehen: entweder mit einem Rechtsklick im CryptDrive oder mit der Eigenschaften-Ansicht im geöffneten Pad."
},
"tag": {
"q": "Wie kann ich Tags verwenden?",
"a": "Du kannst Pads und im CryptDrive hochgeladene Dateien <em>taggen</em>. Dies bedeutet, sie mit einem Stichwort (Tag) zu versehen. Während der Bearbeitung gibt es dafür die Schaltfläche <em>Tag</em> (<span class='fa fa-hashtag'></span>) in der Werkzeugleiste. Wenn du die Pads und Dateien in deinem CryptDrive nach einem Tag durchsuchen möchtest, beginne den Suchbegriff mit einem Hashtag, also beispielsweise <em>#crypto</em>."
},
"template": {
"q": "Was ist eine Vorlage?",
"a": "Eine Vorlage ist ein Pad, das dazu verwendet werden kann, um den Inhalt für neu erstellte Pads zu definieren. Jedes existierende Pad kann in eine Vorlage umgewandelt werden, indem es in den Bereich <em>Vorlagen</em> des CryptDrives verschoben wird. Du kannst auch eine Kopie eines Dokuments erstellen, die zur Vorlage wird, indem du auf die Vorlagen-Schaltfläche (<span class='fa fa-bookmark'></span>) der Werkzeugleiste des Editors klickst."
},
"abandoned": {
"q": "Was ist ein verlassenes Pad?",
"a": "Ein <em>verlassenes Pad</em> ist ein Pad, das kein registrierter Benutzer in seinem CryptDrive gespeichert hat und in den letzten sechs Monaten nicht bearbeitet wurde. Verlassene Pads werden automatisch vom Server gelöscht."
}
},
"privacy": {
"title": "Privatsphäre",
"different": {
"q": "Wie unterscheidet sich CryptPad von anderen Pad-Diensten?",
"a": "CryptPad verschlüsselt Veränderungen deiner Dokumente, bevor diese Information zum Server gesendet wird. Somit können wir nicht lesen, was du getippt hast."
},
"me": {
"q": "Welche Informationen hat der Server über mich?",
"a": "Die Administratoren des Servers können die IP-Adresse der Personen sehen, die CryptPad besuchen. Wir speichern nicht, welche Adresse welches Pad besucht, aber wir könnten es tun. Wir haben aber keinen Zugriff auf den entschlüsselten Inhalt der Pads. Wenn du besorgt bist, dass wir diese Informationen auswerten, solltest du davon auszugehen, dass wir es tun. Denn wir können nicht beweisen, dass wir es nicht tun.<br><br> Wir sammeln grundlegende technische Informationen darüber, wie CryptPad benutzt wird. Dies umfasst beispielsweise die Größe des Bildschirms und welche Schaltflächen am häufigsten angeklickt werden. Das hilft uns dabei, unsere Software besser zu machen. Aber diese Sammlung unterbleibt, wenn du den Haken bei <em>Rückmeldung aktivieren</em> entfernst.<br><br>Wir verfolgen, welche Pads im CryptDrive eines Nutzers gespeichert werden. Dies ist notwendig, um die Speicherbegrenzungen umzusetzen. Den Inhalt der Pads kennen wir nicht. Die Speicherbegrenzungen sind mit dem öffentlichen Schlüssel eines Benutzers verbunden. Aber wir verbinden Namen oder E-Mail-Adressen nicht mit diesen öffentlichen Schlüsseln.<br><br> Du kannst mehr darüber in diesem <a href='https://blog.cryptpad.fr/2017/07/07/cryptpad-analytics-what-we-cant-know-what-we-must-know-what-we-want-to-know/' target='_blank'>Blogeintrag</a> lesen."
},
"register": {
"q": "Weisst der Server mehr über mich, wenn ich registriere?",
"a": "Wir verlangen deine E-Mail-Adresse nicht, und der Server kennt Benutzername und Passwort auch dann nicht, wenn du dich registrierst. Statt dessen generiert das Registrierungs- und Anmeldeformular ein Schlüsselpaar aus deiner Eingabe. Nur der öffentliche Schlüssel dieses Schlüsselpaars wird zum Server geschickt. Mit diesem öffentlichen Schlüssel können wir z.B. die Menge der Daten, die du benutzt, kontrollieren, denn jeder Benutzer hat eine beschränkte Quota.<br><br>Wir benutzen die <em>Rückmeldung</em>s-Funktion, um den Server zu informieren, dass jemand mit deiner IP ein Konto registriert hat. Damit können wir messen, wie viele Benutzer CryptPad Konten registrieren und aus welchen Regionen. Somit können wir erfahren, welche Sprache besser unterstützt werden sollte.<br><br>Registrierte Benutzer informieren den Server, dass er Dokumente im CryptDrive auch dann nicht wegen Inaktivität löschen sollte, wenn sie nicht aktiv benutzt werden."
},
"other": {
"q": "Was können andere Benutzer über mich erfahren?",
"a": "Wenn du ein Pad mit jemand anderen bearbeitest, kommunizierst du mit dem Server. Nur wir kennen deine IP-Adresse. Andere Benutzer sehen deinen Benutzernamen, dein Benutzerbild, den Link zu deinem Profils (wenn du eins hast) und deinen <em>öffentlichen Schlüssel</em> (um die Nachrichten zu diesen Benutzern zu verschlüsseln)."
},
"anonymous": {
"q": "Macht mich CryptPad anonym?",
"a": "Auch wenn CryptPad so konzipiert wurde, dass es so wenig wie möglich über dich weiß, liefert es keine strenge Anonymität. Unsere Server kennen deine IP-Adresse, allerdings kannst du diese Information verbergen, indem du Tor verwendest. Tor zu verwenden, ohne dein Verhalten zu ändern, garantiert auch keine Anonymität, da der Server Benutzer anhand ihrer einzigartigen öffentlichen Schlüssel identifizieren kann. Wenn du denselben Schlüssel mit und ohne Tor benutzt, kann deine Sitzung de-anonymisiert werden.<br><br> Für Benutzer mit niedrigeren Ansprüchen an ihre Privatsphäre erfordert CryptPad im Gegenteil zu anderen Onlinediensten keine Identifikation mit Namen, Telefonnummer oder E-Mail-Adressen."
},
"policy": {
"q": "Habt ihr eine Datenschutzerklärung?",
"a": "Ja! Sie ist <a href='/privacy.html' target='_blank'>hier</a> verfügbar."
}
},
"security": {
"title": "Sicherheit",
"proof": {
"q": "Wie benutzt ihr Zero-Knowledge-Beweise?",
"a": "Wir benutzen den Begriff <em>Ohne Preisgabe von Daten</em> (<em>Zero Knowledge</em>) nicht im Sinn eines <em>Zero-Knowledge-Beweises</em>, sondern im Sinn eines <em>Zero-Knowledge-Webdienstes</em>. Ein <em>Zero-Knowledge-Webdienst</em> verschlüsselt die Benutzerdaten im Browser, ohne dass der Server je Zugang zu den unverschlüsselten Daten oder zu den Schlüsseln hat. <br><br> Wir haben <a href='https://blog.cryptpad.fr/2017/02/20/Time-to-Encrypt-the-Cloud/#Other-Zero-Knowledge-Services'>hier</a> eine kurze Liste von Zero-Knowledge-Webdiensten erstellt."
},
"why": {
"q": "Wieso sollte ich CryptPad verwenden?",
"a": "Unsere Position ist, dass Clouddienste nicht Zugang zu deinen Daten verlangen sollten, damit du sie mit deinen Kontakten und Mitarbeitern teilen kannst. Wenn du einen Webdienst benutzt, der nicht explizit angibt, dass kein Zugang zu deinen Information möglich ist, ist es sehr wahrscheinlich, dass deine Information für andere Zwecke verwertet werden."
},
"compromised": {
"q": "Liefert mir CryptPad einen Schutz, wenn mein Gerät kompromittiert wird?",
"a": "Für den Fall, dass dein Gerät gestohlen wird, ermöglicht CryptPad, das Ausloggen aller Geräte zu erzwingen - außer dem, das du gerade verwendest. Gehe dazu zur Seite mit deinen <strong>Einstellungen</strong> und klicke auf <strong>Überall ausloggen</strong>. Alle anderen Geräte, die mit diesem Konto verbunden sind, werden dann ausgeloggt. Alle früher verbundenen Geräte werden ausgeloggt, sobald sie CryptPad besuchen.<br><br> Die beschriebene Funktion ist derzeit im Browser implementiert und nicht im Server. Somit schützt sie nicht vor staatlichen Akteuren. Aber sie sollte ausreichend sein, wenn du nach Verwendung eines öffentlichen Computers vergessen hast dich auszuloggen."
},
"crypto": {
"q": "Welche Kryptografie benutzt ihr?",
"a": "CryptPad basiert auf zwei quelloffenen Kryptografiebibliotheken: <a href='https://github.com/dchest/tweetnacl-js' target='_blank'>tweetnacl.js</a> und <a href='https://github.com/dchest/scrypt-async-js' target='_blank'>scrypt-async.js</a>.<br><br>Scrypt ist eine <em>Passwort-basierte Schlüsselableitungsfunktion</em>. Wir werden sie, um deinen Benutzernamen und dein Passwort in ein einzigartiges Schlüsselpaar umzuwandeln. Dieses sichert den Zugang zu deinem CryptDrive, so dass nur du auf die Liste deiner Pads zugreifen kannst.<br><br> Wir verwenden die Verschlüsselung <em>xsalsa20-poly1305</em> und <em>x25519-xsalsa20-poly1305</em> von tweetnacl, um Dokumente und den Chatverlauf zu verschlüsseln."
},
"pad_password": {
"q": "Was passiert, wenn ich einen Ordner oder ein Pad mit einem Passwort schütze?",
"a": "Du kannst Pads oder geteilte Ordner bei der Erstellung mit einem Passwort schützen. Du kannst auch jederzeit im Eigenschaften-Menü ein Passwort setzen/ändern/entfernen.<br><br>Passwörter für Pads und geteilte Ordner sollen den Link schützen, wenn du ihn über einen unsicheren Kanal wie Mail oder Textnachricht teilst. Wenn jemand den Link abfängt, aber nicht das Passwort kennt, kann er nicht auf dein Dokument zugreifen.<br><br>Beim Teilen mit Kontakten oder Teams innerhalb von CryptPad wird die Kommunikation verschlüsselt und es wird angenommen, dass der Empfänger auf das Dokument zugreifen darf. Daher wird das Passwort zusammen mit dem Pad geteilt. Der Empfänger, und du selbst, werden beim Öffnen des Dokuments <b>nicht</b> danach gefragt."
}
},
"usability": {
"title": "Bedienung",
"register": {
"q": "Was kriege ich, wenn ich mich registriere?",
"a": "Registrierte Benutzer können Funktionen verwenden, die anonyme Nutzer nicht verwenden können. Es gibt <a href='/features.html' target='_blank'>hier</a> eine entsprechende Übersicht."
},
"share": {
"q": "Wie kann ich den Zugang zu einem verschlüsselten Pad mit Kontakten teilen?",
"a": "CryptPad fügt den geheimen Schlüssel deines Pad nach dem Zeichen <em>#</em> zur URL hinzu. Alles, was nach diesem Zeichen kommt, wird nicht zum Server gesendet. Also haben wir nie Zugang zu deinen Schlüsseln. Wenn du den Link zu einem Pad teilst, teilst du auch die Fähigkeit zum Lesen und zum Bearbeiten."
},
"remove": {
"q": "Ich habe ein Dokument aus meinem CryptDrive gelöscht, aber der Inhalt ist noch verfügbar. Wie kann ich es entfernen?",
"a": "Nur <em>eigene Pads</em>, die im Februar 2018 eingeführt wurden, können gelöscht werden und zwar nur von deren <em>Eigentümer</em> (der Benutzer, der das Dokument ursprünglich erstellt hat). Wenn du nicht der Eigentümer des Pads bist, musst du den Eigentümer bitten, dass er dieses für dich löscht. Bei Pads, deren Eigentümer du bist, kannst du <strong>auf das Pad in deinem CryptDrive rechtsklicken</strong> und <strong>Vom Server löschen</strong> wählen."
},
"forget": {
"q": "Was passiert, wenn ich mein Passwort vergesse?",
"a": "Wenn wir dein Passwort zurücksetzen könnten, könnten wir auch auf deine Daten zugreifen. Wenn du dein Passwort nicht aufgeschrieben hast und dich auch nicht daran erinnern kannst, kannst du vielleicht deine Pads aus deinem Browserverlauf zurückgewinnen."
},
"change": {
"q": "Was ist, wenn ich mein Passwort ändern möchte?",
"a": "Du kannst dein CrypPad-Passwort in den Einstellungen ändern."
},
"devices": {
"q": "Ich bin auf zwei Geräten eingeloggt und sehe zwei unterschiedliche CryptDrives. Wie ist das möglich?",
"a": "Es ist möglich, dass du zweimal mit dem gleichen Benutzernamen registriert bist, aber mit unterschiedlichen Passwörtern. Weil der CyrptPad-Server dich anhand deiner kryptografischen Unterschrift und nicht anhand deines Namens identifiziert, kann er nicht verhindern, dass der gleiche Name mehrmals verwendet wird. Somit hat jedes Benutzerkonto eine einzigartige Kombination aus Benutzername und Passwort. Angemeldete Benutzer können ihren Benutzernamen im oberen Teil der Einstellungsseite sehen."
},
"folder": {
"q": "Kann ich ganze Ordner in CryptDrive teilen?",
"a": "Ja, du kannst ganze Ordner und alle Pads darin teilen."
},
"feature": {
"q": "Könnt ihr diese eine Funktion hinzufügen, die ich brauche?",
"a": "Viele Funktionen wurden in CryptPad umgesetzt, weil Benutzer darum gebeten haben. Auf unserer <a href='https://cryptpad.fr/contact.html' target='_blank'>Kontaktseite</a> haben wir die Möglichkeiten aufgelistet, wie man mit uns in Kontakt treten kann.<br><br>Leider können wir aber nicht garantieren, dass wir alle Funktionen umsetzen, um die Benutzer bitten. Wenn eine Funktion kritisch für deine Organisation ist, kannst du die Entwicklung dieser Funktion sponsern und somit deren Realisierung sichern. Bitte kontaktiere <a href='mailto:sales@cryptpad.fr' target='_blank'>sales@cryptpad.fr</a> für mehr Informationen.<br><br>Auch wenn du nicht die Entwicklung einer Funktion sponsorn kannst, sind wir an Rückmeldungen interessiert. Diese helfen uns dabei, CryptPad zu verbessern. Kontaktiere uns jederzeit über einen der oben angegebenen Wege."
}
},
"other": {
"title": "Andere Fragen",
"pay": {
"q": "Wieso soll ich zahlen, wenn so viele Funktionen sowieso kostenfrei sind?",
"a": "Wir geben Unterstützern zusätzlichen Speicherplatz sowie die Möglichkeit, die Speicherplatzbegrenzung ihrer Kontakte zu erhöhen (<a href='https://accounts.cryptpad.fr/#/faq' target='_blank'>erfahre mehr</a>).<br><br>Über diese kurzfristigen Vorteile hinaus kannst du, wenn du ein Premiumangebot annimmst, die aktive Weiterentwicklung von CryptPad fördern. Das beinhaltet, Fehler zu beseitigen, neue Funktionen umzusetzen und Installationen von CryptPad auf eigenen Servern zu erleichtern. Zusätzlich hilfst du, anderen Anbietern zu beweisen, dass Benutzer datenschutzfreundliche Technologien unterstützen. Wir hoffen, dass Geschäftsmodelle, die auf dem Verkauf von Benutzerdaten basieren, letztendlich der Vergangenheit angehören werden.<br><br>Außerdem glauben wir, dass es gut ist, die Funktionen von CryptPad kostenfrei anzubieten. Denn jeder verdient persönlichen Datenschutz und nicht nur Personen mit hohem Einkommen. Durch deine Unterstützung hilfst du uns, zu ermöglichen, dass auch Menschen mit geringerem Einkommen diese grundlegenden Funktionen genießen können, ohne dass ein Preisetikett daran klebt."
},
"goal": {
"q": "Was ist euer Ziel?",
"a": "Durch die Verbesserung von Technologien, die die Privatsphäre der Nutzer respektieren, möchten wir die Erwartungen der Benutzer an den Datenschutz auf Cloudplattformen erhöhen. Wir hoffen, dass unsere Arbeit andere Dienstanbieter in allen Bereichen anspornt, ähnliche oder bessere Dienste anzubieten. Wir wissen, dass ein großer Teil des Internets durch gezielte Werbung finanziert wird. Es gibt in dieser Hinsicht viel mehr zu tun als wir jemals schaffen können. Wir freuen uns über die Förderung, Unterstützung und Beiträge aus unserer Community, um diesem Ziel näher zu kommen."
},
"jobs": {
"q": "Sucht Ihr Mitarbeiter?",
"a": "Ja! Bitte schicke eine kurze Vorstellung an <a href='mailto:jobs@xwiki.com' target='_blank'>jobs@xwiki.com</a>."
},
"host": {
"q": "Könnt ihr mir helfen, meine eigene Installation von CryptPad aufzubauen?",
"a": "Wir bieten gerne Support für das Aufsetzen eines internen CryptPads in deiner Organisation. Setze dich bitte mit <a href='mailto:sales@cryptpad.fr' target='_blank'>sales@cryptpad.fr</a> in Verbindung für mehr Information."
},
"revenue": {
"q": "Wie kann ich meine Einnahmen mit den Entwicklern teilen?",
"a": "Wenn du deine eigene Installation von CrytPad betreibst und die Einnahmen für deine bezahlten Konten mit den Entwicklern teilen möchtest, muss dein Server als Partnerservice konfiguriert werden.<br><br>In deinem CryptPad-Verzeichnis befindet sich <em>config.example.js</em>. Darin wird erklärt, wie du deinen Server dafür konfigurieren musst. Danach solltest du <a href='mailto:sales@cryptpad.fr'>sales@cryptpad.fr</a> kontaktieren, damit geprüft wird, dass dein Server richtig für HTTPS konfiguriert ist, und die Zahlungsmethoden abgesprochen werden können."
}
}
},
"features_f_support_note": "Vorrangige Unterstützung durch das Administrationsteam per E-Mail und eingebautem Ticketsystem",
"features_f_supporter": "Unterstützung der Privatsphäre",
"features_f_supporter_note": "Hilf CryptPad, finanziell nachhaltig zu werden und zeige, dass datenschutzfreundliche Software, die freiwillig von Anwendern finanziert wird, die Normalität sein sollte",
"features_f_subscribe": "Abonnieren",
"features_f_subscribe_note": "Zum Abonnieren ist ein registrierter Account erforderlich",
"tos_title": "Nutzungsbedingungen für CryptPad",
"tos_legal": "Sei nicht bösartig oder missbrauchend und mache nichts illegales.",
"tos_availability": "Wir hoffen, dass dir dieser Dienst nützt, aber Erreichbarkeit und Performanz können nicht garantiert werden. Bitte exportiere deine Daten regelmäßig.",
@ -830,7 +675,7 @@
"help": {
"title": "Mit CryptPad anfangen",
"generic": {
"more": "Erfahre mehr über die Nutzung von CryptPad, indem du unsere <a href=\"/faq.html\" target=\"_blank\">FAQ</a> liest.",
"more": "Erfahre mehr über die Nutzung von CryptPad, indem du unsere <a href=\"https://docs.cryptpad.fr\" target=\"_blank\" rel=\"noopener noreferrer\">Documentation</a> liest.",
"share": "Teile dieses Dokument mit der Schaltfläche <i class=\"fa fa-shhare-alt\"></i> <b>Teilen</b> und verwalte die Zugriffsrechte mit <i class=\"fa fa-unlock-alt\"></i> <b>Zugriff</b>.",
"save": "Alle Änderungen werden automatisch synchronisiert. Du musst sie also nicht selbst speichern"
},
@ -914,7 +759,7 @@
"creation_owned": "Eigenes Pad",
"creation_ownedTrue": "Eigenes Pad",
"creation_ownedFalse": "Offenes Pad",
"creation_owned1": "Ein <b>eigenes</b> Pad kann vom Server gelöscht werden, wenn der Eigentümer so entscheidet. Die Löschung eines eigenen Pads bewirkt die Löschung aus allen anderen CryptDrives.",
"creation_owned1": "Ein <b>eigenes</b> Element kann zerstört werden, wann immer der Eigentümer so entscheidet. Nach der Zerstörung eines eigenen Elementes ist es nicht mehr in CryptDrives anderer Nutzer verfügbar.",
"creation_owned2": "Ein <b>offenes</b> Pad hat keinen Eigentümer. Es kann also nicht vom Server gelöscht werden, es sei denn es hat sein Ablaufdatum erreicht.",
"creation_expireTitle": "Ablaufdatum",
"creation_expire": "Auslaufendes Pad",
@ -925,7 +770,7 @@
"creation_expireMonths": "Monat(e)",
"creation_expire1": "Ein <b>unbegrenztes</b> Pad wird nicht vom Server entfernt, solange der Eigentümer es nicht löscht.",
"creation_expire2": "Ein <b>auslaufendes</b> Pad hat eine begrenzte Lebensdauer, nach der es automatisch vom Server und aus den CryptDrives anderer Nutzer entfernt wird.",
"creation_password": "Passwort hinzufügen",
"creation_password": "Passwort\n",
"creation_noTemplate": "Keine Vorlage",
"creation_newTemplate": "Neue Vorlage",
"creation_create": "Erstellen",
@ -1025,12 +870,12 @@
"admin_flushCacheButton": "Cache leeren",
"admin_flushCacheDone": "Cache erfolgreich geleert",
"footer_product": "Produkt",
"footer_team": "Das Team",
"footer_team": "Mitwirkende",
"footer_donate": "Spenden",
"footer_legal": "Rechtliches",
"footer_tos": "Nutzungsbedingungen",
"contact_admin": "Administratoren kontaktieren",
"contact_adminHint": "Für Probleme mit deinem Account, der Speicherbegrenzung oder der Verfügbarkeit des Dienstes.",
"contact_adminHint": "Für Probleme mit deinem Account, der Speicherbegrenzung oder der Verfügbarkeit des Dienstes.\n",
"contact_dev": "Entwickler kontaktieren",
"contact_devHint": "Für Verbesserungsvorschläge oder zum Danke-Sagen.",
"contact_bug": "Fehlerbericht",
@ -1133,7 +978,7 @@
"pricing": "Preise und Konditionen",
"homePage": "Hauptseite",
"features_noData": "Keine persönlichen Informationen benötigt",
"features_pricing": "Zwischen {0} und {2} € pro Monat",
"features_pricing": "{0} € bis {2} € pro Monat",
"features_emailRequired": "E-Mail-Adresse benötigt",
"padNotPinnedVariable": "Dieses Pad wird nach {4} Tagen ohne Aktivität auslaufen, {0}logge dich ein{1} oder {2}registriere dich{3}, um das Auslaufen zu verhindern.",
"register_emailWarning0": "Anscheinend hast du deine E-Mail-Adresse als Benutzername angegeben.",
@ -1496,5 +1341,41 @@
"admin_unarchiveTitle": "Dokumente wiederherstellen",
"admin_archiveTitle": "Dokumente archivieren",
"history_trimPrompt": "Dieses Dokument hat einen Verlauf von {0} angesammelt, was das Laden verlangsamen kann. Ziehe in Betracht, den Verlauf zu löschen, sofern er nicht benötigt wird.",
"contacts_confirmCancel": "Bist du sicher, dass du die Kontaktanfrage an <b>{0}</b> zurücknehmen möchtest?"
"contacts_confirmCancel": "Bist du sicher, dass du die Kontaktanfrage an <b>{0}</b> zurücknehmen möchtest?",
"admin_support_collapse": "Einklappen",
"admin_support_open": "Anzeigen",
"admin_support_first": "Erstellt: ",
"admin_support_last": "Aktualisiert: ",
"admin_support_closed": "Geschlossene Tickets:",
"admin_support_answered": "Beantwortete Tickets:",
"admin_support_normal": "Unbeantwortete Tickets:",
"admin_support_premium": "Premium-Tickets:",
"access_offline": "Du bist offline. Verwaltung von Zugriffsrechten ist nicht verfügbar.",
"share_noContactsOffline": "Du bist offline. Kontakte sind nicht verfügbar.",
"offlineError": "Die Seite kann nicht angezeigt werden, da die aktuellen Daten nicht synchronisiert werden konnten. Das Laden wird fortgesetzt, wenn die Verbindung wiederhergestellt ist.",
"creation_expiresIn": "Läuft ab in",
"whatis_model": "Geschäftsmodell",
"register_notes_title": "Wichtige Hinweise",
"home_host_title": "Über diese Instanz",
"creation_helperText": "In Dokumentation öffnen",
"home_support_title": "CryptPad unterstützen",
"home_opensource": "Jeder kann eine CryptPad-Instanz betreiben und den Dienst privat oder professionell anbieten. Der Quellcode ist auf <a rel=\"noopener noreferrer\" target=\"_blank\" href=\"https://github.com/xwiki-labs/cryptpad\">Github</a> verfügbar.",
"whatis_xwiki": "Entwickelt bei XWiki",
"whatis_collaboration_info": "<p>CryptPad wurde entwickelt, um gemeinsame Arbeit zu ermöglichen. Es synchronisiert Änderungen an Dokumenten in Echtzeit. Da alle Daten verschlüsselt sind, haben der Dienst und seine Administratoren keine Möglichkeit, die bearbeiteten und gespeicherten Inhalte einzusehen.</p>",
"register_warning_note": "Aufgrund der Verschlüsselung in CrytpPad können die Administratoren des Dienstes deine Daten nicht wiederherstellen, falls du deinen Benutzernamen und/oder dein Passwort vergessen solltest. Bitte speichere diese an einem sicheren Ort.",
"whatis_xwiki_info": "<p>CryptPad wird bei <a rel=\"noopener noreferrer\" target=\"_blank\" href=\"https://xwiki.com\">XWiki</a> entwickelt, einem Unternehmen mit Sitz in Paris, Frankreich, das seit über 15 Jahren Open-Source-Software entwickelt. Wir haben umfangreiche Erfahrung in der Entwicklung von kollaborativer Software zur Organisation von Informationen. Unsere Erfolgsbilanz zeigt, dass wir uns der langfristigen Entwicklung und Wartung von CryptPad verpflichtet fühlen.</p>",
"docs_link": "Dokumentation",
"home_support": "<p>Das Entwicklerteam profitiert in keiner Weise von Daten der Nutzer. Dies ist Teil einer Vision für Online-Dienste, die die Privatsphäre respektieren. Im Gegensatz zu den großen Plattformen, die vorgeben, \"kostenlos\" zu sein, während sie mit persönlichen Daten Profit machen, möchten wir ein nachhaltiges Modell aufbauen, das freiwillig von den Nutzern finanziert wird.</p><p>Du kannst das Projekt unterstützen, indem du eine einmalige oder regelmäßige Spende über Open Collective machst. Unser Budget ist transparent und wird regelmäßig aktualisiert. Es gibt auch mehrere <a href=\"https://docs.cryptpad.fr/de/how_to_contribute.html\" rel=\"noopener noreferrer\" target=\"_blank\">nicht-finanzielle Möglichkeiten, sich zu beteiligen</a>.</p>",
"home_privacy_text": "CryptPad wurde entwickelt, um Zusammenarbeit zu ermöglichen und gleichzeitig die Daten zu schützen. Alle Inhalte werden in deinem Browser verschlüsselt und entschlüsselt. Das bedeutet, dass Dokumente, Chats und Dateien außerhalb der Sitzung, in du angemeldet sind, nicht lesbar sind. Selbst die Administratoren des Dienstes haben keinen Zugriff auf deine Daten.",
"home_privacy_title": "Eingebauter Datenschutz",
"home_opensource_title": "Open Source",
"whatis_model_info": "<p>CryptPad wird seit 2016 durch französische und europäische Forschungsgelder wie BPI France, NLNet Foundation, NGI Trust, Mozilla Open Source Support sowie durch Spenden und Abonnements auf cryptpad.fr unterstützt. Wir glauben, dass öffentliche Gelder öffentlichen Code finanzieren sollten, daher ist der Dienst vollständig Open Source. Das bedeutet, dass jeder die Software nutzen, hosten und modifizieren kann.</p><p>CryptPad profitiert nicht von Benutzerdaten. Dies ist Teil einer Vision für Online-Dienste, die die Privatsphäre respektieren. Im Gegensatz zu den großen Plattformen, die vorgeben, \"kostenlos\" zu sein, während sie mit persönlichen Daten Profit machen, möchte CryptPad ein nachhaltiges Modell aufbauen, das freiwillig von den Nutzern finanziert wird.</p><p>Wir bieten die Funktionalität von CryptPad kostenlos an, weil wir glauben, dass jeder persönliche Privatsphäre verdient, nicht nur Menschen mit einem hohen Einkommen. Wenn du in der Lage bist, das Projekt zu unterstützen, trägst du zu neuen Funktionen, Verbesserungen und Wartung bei, die allen Nutzern zugute kommen.</p><p>Nachdem nun die Machbarkeit des Projekts festgestellt wurde, ist das nächste Ziel, es durch die Finanzierung durch die Nutzer finanziell nachhaltig zu machen. Wenn du CryptPad unterstützen möchtest und dabei helfen möchtest, es zu einer nachhaltigen Alternative zu den großen Plattformen zu machen, ziehe bitte eine einmalige oder regelmäßige Spende in Betracht.</p>",
"whatis_apps": "Eine vollständige Anwendungs-Suite",
"whatis_drive_info": "<p>Speichere und verwalte Dokumente mit CryptDrive. Erstelle Ordner, gemeinsame Ordner und Tags, um Dokumente zu organisieren. Lade Dateien hoch und teile sie (PDFs, Fotos, Video, Audio, etc.). Team-Drives werden zwischen Benutzern geteilt und ermöglichen eine gemeinsame Organisation und detaillierte Zugriffskontrolle.</p>",
"whatis_apps_info": "<p>CryptPad bietet eine vollwertige Office-Suite mit allen notwendigen Werkzeugen für eine produktive Zusammenarbeit. Die Anwendungen umfassen: Rich Text, Tabellen, Code/Markdown, Kanban, Präsentationen, Whiteboard und Umfragen.</p><p>Die Anwendungen werden ergänzt durch eine Reihe von Funktionen zur Zusammenarbeit wie Chat, Kontakte, Farbe nach Autor (Code/Markdown) und Kommentare mit Erwähnungen (Rich Text).</p>",
"register_notes": "<ul class=\"cp-notes-list\"><li>Dein Passwort ist der geheime Schlüssel, der alle deine Dokumente verschlüsselt. <span class=\"red\">Wenn du ihn verlierst, gibt es keine Möglichkeit, deine Daten wiederherzustellen.</span></li><li>Wenn du einen gemeinsam genutzten Computer verwendest, <span class=\"red\">denke daran, dich abzumelden</span>, wenn du fertig bist. Durch bloßes Schließen des Browserfensters bleibt das Konto ungeschützt.</li><li>Um die erstellten und/oder gespeicherten Dokumente zu behalten, ohne eingeloggt zu sein, setze einen Haken bei \"Dokumente aus deiner nicht-registrierten Sitzung importieren\". </li></ul>",
"settings_cacheTitle": "Cache",
"settings_cacheButton": "Cache leeren",
"settings_cacheCheckbox": "Cache auf diesem Gerät aktivieren",
"settings_cacheHint": "CryptPad legt Teile deiner Dokumente im Speicher deines Browser ab, um den Datenverkehr und die Ladezeiten zu reduzieren. Du kannst diesen Cache deaktivieren, wenn dein Gerät nicht über viel freien Speicherplatz verfügt. Aus Sicherheitsgründen wird der Cache immer beim Ausloggen geleert. Du kannst ihn auch manuell leeren, sofern du Speicherplatz auf deinem Gerät freigeben möchtest."
}

View file

@ -340,7 +340,6 @@
"register_mustAcceptTerms": "Πρέπει να αποδεχτείτε τους όρους της υπηρεσίας.",
"register_mustRememberPass": "Δεν μπορούμε να επαναφέρουμε τον κωδικό σας αν τον ξεχάσετε. Είναι πολύ σημαντικό να τον θυμάστε! Παρακαλούμε πατήστε στο κουτάκι για επιβεβαίωση.",
"register_header": "Καλώς ήρθατε στο CryptPad",
"register_explanation": "<h3>Ας δούμε κάνα-δυο πράγματα πρώτα:</h3><ul class='list-unstyled'><li><i class='fa fa-info-circle'> </i> Ο κωδικός σας είναι το μυστικό κλειδί που κρυπτογραφεί όλα τα pads σας. Αν το χάσετε, δεν υπάρχει τρόπος να επαναφέρουμε τα δεδομένα σας.</li><li><i class='fa fa-info-circle'> </i> Μπορείτε να εισάγετε τα pads που ανοίξατε πρόσφατα στον περιηγητή σας ώστε να τα έχετε στον λογαριασμό σας.</li><li><i class='fa fa-info-circle'> </i> Αν χρησιμοποιείτε έναν κοινόχρηστο υπολογιστή, θα πρέπει να αποσυνδεθείτε όταν τελειώσετε, το να κλείσετε την καρτέλα δεν είναι αρκετό.</li></ul>",
"register_writtenPassword": "Έχω σημειώσει το όνομα χρήστη και τον κωδικό μου, συνέχεια",
"register_cancel": "Επιστροφή",
"register_warning": "Zero Knowledge σημαίνει πως δεν μπορούμε να επαναφέρουμε τον λογαριασμό σας αν χάσετε τον κωδικό σας.",
@ -441,20 +440,7 @@
"topbar_whatIsCryptpad": "Τι είναι το CryptPad",
"whatis_title": "Τι είναι το CryptPad",
"whatis_collaboration": "Γρήγορη, εύκολη συνεργασία",
"whatis_collaboration_p1": "Με το CryptPad, μπορείτε να δημιουργείτε όλοι μαζί γρήγορα συνεργατικά έγγραφα για τις σημειώσεις σας και τις ιδέες που καταγράφετε. Όταν εγγραφείτε και συνδεθείτε, σας δίνεται άμεσα η δυνατότητα 'ανεβάσματος' κι έναν 'αποθηκευτικό χώρο' CryptDrive όπου μπορείτε να οργανώσετε όλα σας τα pads. Ως εγγεγραμένος χρήστης παίρνετε 50MB δωρεάν.",
"whatis_collaboration_p2": "Μπορείτε να μοιραστείτε την πρόσβαση σε ένα έγγραφο του CryptPad απλά δίνοντας τον σύνδεσμο σε κάποιον άλλο. Μπορείτε επίσης να μοιραστείτε ένα σύνδεσμο ο οποίος παρέχει πρόσβαση <em>μόνο για ανάγνωση</em> σε ένα pad, επιτρέποντάς σας να κοινοποιήσετε την συλλογική σας δουλειά ενώ ταυτόχρονα έχετε ακόμα τη δυνατότητα να το επεξεργαστείτε.",
"whatis_collaboration_p3": "Μπορείτε να δημιουργήσετε απλά εμπλουτισμένα κείμενα με το <a href=\"http://ckeditor.com/\">CKEditor</a> όπως επίσης κείμενα με γλώσσα προγραμματισμού Markdown τα οποία τροποποιούνται σε πραγματικό χρόνο καθώς πληκτρολογείτε. Μπορείτε επίσης να χρησιμοποιήσετε την εφαρμογή δημοσκόπησης για να προγραμματίσετε δραστηριότητες με πολλαπλούς συμμετέχοντες.",
"whatis_zeroknowledge": "Zero Knowledge",
"whatis_zeroknowledge_p1": "Δεν θέλουμε να ξέρουμε τι πληκτρολογείτε και με τον σύγχρονο τρόπο κρυπτογράφησης μπορείτε να είσαστε σίγουροι ότι δεν μπορούμε να ξέρουμε. Το CryptPad χρησιμοποιεί <strong>100% κρυπτογράφηση client side</strong> για να προστατεύσει το περιεχόμενο που πληκτρολογείτε από εμάς, τους ανθρώπους που φιλοξενούν τον διακομιστή.",
"whatis_zeroknowledge_p2": "Όταν κάνετε εγγραφή και συνδέεστε, το όνομα χρήστη σας κι ο κωδικός σας μετατρέπονται σε ένα κρυπτογραφημένο κλειδί χρησιμοποιώντας το <a href=\"https://en.wikipedia.org/wiki/Scrypt\">scrypt key derivation function</a>. Το συγκεκριμένο κλειδί, το όνομα χρήστη κι ο κωδικός χρήστη δεν στέλνονται καν στον διακομιστή. Αντιθέτως χρησιμοποιούνται από το client side για να αποκρυπτογραφήσουν το περιεχόμενο του CryptDrive σας, το οποίο περιέχει όλα τα κλειδιά για όλα τα pads στα οποία μπορείτε να έχετε πρόσβαση.",
"whatis_zeroknowledge_p3": "Όταν μοιράζεστε έναν σύνδεσμο προς ένα έγγραφο, μοιράζεστε το κρυπτογραφημένο κλειδί για το συγκεκριμένο έγγραφο αλλά εφόσον το κλειδί είναι στο <a href=\"https://en.wikipedia.org/wiki/Fragment_identifier\">fragment identifier</a>, δεν στέλνεται ποτέ απευθείας στον διακομιστή. Επισκεφθείτε το <a href=\"https://blog.cryptpad.fr/2017/07/07/cryptpad-analytics-what-we-cant-know-what-we-must-know-what-we-want-to-know/\">privacy blog post</a> για να μάθετε περισσότερα σχετικά με το σε ποια μεταδεδομένα έχουμε πρόσβαση και σε ποια όχι.",
"whatis_drive": "Οργάνωση με το CryptDrive",
"whatis_drive_p1": "Κάθε φορά που επισκέπτεσθε ένα pad στο CryptPad, το pad προστίθεται αυτόματα στο CryptDrive στον κυρίως φάκελο. Αργότερα μπορείτε να οργανώσετε αυτά τα pad σε φακέλους ή μπορείτε να τα μετακινήσετε στον κάδο ανακύκλωσης. Το CryptDrive σας επιτρέπει να περιηγηθείτε ανάμεσα στα pads σας και να τα οργανώνετε όποτε κι όπως θέλετε.",
"whatis_drive_p2": "Με το κλασικό drag-and-drop, μπορείτε να μεταφέρετε pads μέσα στον αποθηκευτικό σας χώρο και ο σύνδεσμος αυτών των pads θα παραμείνει ο ίδιος ώστε οι συνεργάτες σας να μην σταματήσουν ποτέ να έχουν πρόσβαση.",
"whatis_drive_p3": "Μπορείτε επίσης να ανεβάσετε αρχεία στο CryptDrive σας και να τα μοιραστείτε με συνεργάτες. Τα ανεβασμένα αρχεία μπορούν να οργανωθούν ακριβώς όπως τα συνεργατικά pads.",
"whatis_business": "Το CryptPad για επιχειρήσεις",
"whatis_business_p1": "Το πρωτόκολλο κρυπτογράφησης Zero Knowledge του CryptPad είναι ιδανικό για να πολλαπλασιαστεί η αποτελεσματικότητα των ήδη υπάρχοντων πρωτοκόλλων ασφαλείας προστατεύοντας τα εταιρικά στοιχεία πρόσβασης με ισχυρή κρυπτογράφηση. Επειδή τα ευαίσθητα δεδομένα μπορούν να αποκρυπτογραφηθούν μόνο με την χρήση των στοιχείων των υπαλλήλων, το CryptPad εξαλείφει τον παράγοντα hacker ο οποίος ενυπάρχει σε παραδοσιακούς εταιρικούς διακομιστές. Διαβάστε το <a href=\"https://blog.cryptpad.fr/images/CryptPad-Whitepaper-v1.0.pdf\">CryptPad Whitepaper</a> για να μάθετε περισσότερα σχετικά με το πως μπορεί να βοηθήσει την επιχείρησή σας.",
"whatis_business_p2": "To CryptPad μπορεί να εγκατασταθεί τοπικά και οι <a href=\"https://cryptpad.fr/about.html\">προγραμματιστές του</a> στην XWiki SAS είναι σε θέση να προσφέρουν εμπορική υποστήριξη, τροποποιήσεις και περαιτέρω ανάπτυξη. Επικοινωνήστε στο <a href=\"mailto:sales@cryptpad.fr\">sales@cryptpad.fr</a> για περισσότερες πληροφορίες.",
"policy_title": "Πολιτική απορρήτου του CryptPad",
"policy_whatweknow": "Τι γνωρίζουμε για εσάς",
"policy_whatweknow_p1": "Ως εφαρμογή η οποία φιλοξενείται στο διαδίκτυο, το CryptPad έχει πρόσβαση στα μεταδεδομένα που είναι εκτεθειμένα από το πρωτόκολλο HTTP. Αυτό συμπεριλαμβάνει την διεύθυνση IP σας και ποικίλες HTTP κεφαλίδες που μπορούν να χρησιμοποιηθούν για να ταυτοποιήσουν τον συγκεκριμένο περιηγητή. Μπορείτε να δείτε τι πληροφορίες μοιράζεται ο περιηγητής σας με το να επισκεφθείτε <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.whatismybrowser.com/detect/what-http-headers-is-my-browser-sending\" title=\"what http headers is my browser sending\">WhatIsMyBrowser.com</a>.",

View file

@ -194,7 +194,6 @@
"register_mustAcceptTerms": "Tienes que aceptar los términos de servicio",
"register_mustRememberPass": "No podemos reiniciar tu contraseña si la olvidas. ¡Es muy importante que la recuerdes! Marca la casilla para confirmarlo.",
"register_header": "Bienvenido a CryptPad",
"register_explanation": "<p>Vamos a ver algunas cosas antes</p><ul><li>Tu contraseña es tu clave secreta que cifra todos tus documentos. Si la pierdes no podremos recuperar tus datos.</li><li>Puedes importar documentos que has visto recientemente en tu navegador para tenerlos en tu cuenta.</li><li>Si estás usando un ordenador compartido, tienes que cerrar sesión cuando terminas, cerrar la pestaña no es suficiente.</li></ul>",
"settings_title": "Preferencias",
"settings_save": "Guardar",
"settings_backup": "Copia de seguridad",
@ -689,20 +688,7 @@
"main_footerText": "Con CryptPad, puede crear documentos colaborativos rápidos para tomar notas y escribir ideas juntos.",
"whatis_title": "¿Que es CryptPad?",
"whatis_collaboration": "Colaboración fácil y rápida",
"whatis_collaboration_p1": "Con CryptPad, puede crear documentos colaborativos rápidos para tomar notas y escribir ideas juntos. Cuando te registras e inicias sesión, obtienes la capacidad de carga de archivos y un CryptDrive donde puedes organizar todos tus pads. Como usuario registrado, obtienes 50 MB de espacio gratis.",
"whatis_collaboration_p2": "Puede compartir el acceso a un documento de CryptPad simplemente compartiendo el enlace. También puede compartir un enlace que proporciona acceso <em> de solo lectura </em> a un bloc, lo que le permite publicitar su trabajo colaborativo mientras aún puede editarlo.",
"whatis_collaboration_p3": "Puede crear documentos de texto enriquecido simples con <a href=\"http://ckeditor.com/\"> CKEditor </a>, así como documentos reducidos que se representan en tiempo real mientras escribe. También puede usar la aplicación de encuestas para programar eventos con múltiples participantes.",
"whatis_zeroknowledge": "Conocimiento cero",
"whatis_zeroknowledge_p1": "No queremos saber qué está escribiendo y con la criptografía moderna, puede estar seguro de que no podemos saberlo. CryptPad utiliza <strong> 100% de cifrado del lado del cliente </strong> para proteger el contenido que escribe de nosotros, las personas que alojan el servidor.",
"whatis_zeroknowledge_p2": "Cuando se registra e inicia sesión, su nombre de usuario y contraseña se calculan en una clave secreta utilizando <a href=\"https://en.wikipedia.org/wiki/Scrypt\"> función de derivación de clave scrypt </a>. Ni esta clave ni el nombre de usuario y la contraseña se envían al servidor. En su lugar, se usan en el lado del cliente para descifrar el contenido de su CryptDrive, que contiene las claves de todos los pads a los que puede acceder.",
"whatis_zeroknowledge_p3": "Cuando comparte el enlace a un documento, está compartiendo la clave criptográfica para acceder a ese documento, pero dado que la clave está en el<a href=\"https://en.wikipedia.org/wiki/Fragment_identifier\"> identificador de fragmento</a>, nunca se envía directamente al servidor. Echa un vistazo a nuestro <a href = \"https://blog.cryptpad.fr/2017/07/07/cryptpad-analytics-what-we-cant-know-what-we-must-know-what-we-want- to-know / \"> blog de privacidad </a> para obtener más información sobre los tipos de metadatos a los que tenemos acceso y a los que no tenemos acceso.",
"whatis_drive": "Organización con CryptDrive",
"whatis_drive_p1": "Cada vez que accede a un pad en CryptPad, el pad se agrega automáticamente a su CryptDrive en la carpeta principal. Más adelante, puede organizar estos Pads dentro de carpetas o puede ponerlos en la papelera. CryptDrive te permite buscar a través de tus pads y organizarlos cuando quieras, como quieras.",
"whatis_drive_p2": "Con la función intuitiva de arrastrar y soltar, puede mover los pads en su unidad y el enlace a estos pads se mantendrá igual para que sus colaboradores nunca pierdan el acceso.",
"whatis_drive_p3": "También puede cargar archivos en su CryptDrive y compartirlos con colegas. Los archivos cargados se pueden organizar al igual que los pads colaborativos.",
"whatis_business": "CryptPad para negocios",
"whatis_business_p1": "El cifrado Cero conocimiento de CryptPad multiplica la efectividad de los protocolos de seguridad existentes al reflejar los controles de acceso de la organización en criptografía. Debido a que los activos confidenciales solo se pueden descifrar con credenciales de acceso de usuario, CryptPad es menos valioso como objetivo en comparación con los servicios tradicionales en la nube. Lea el <a href='https://blog.cryptpad.fr/images/CryptPad-Whitepaper-v1.0.pdf'> CryptPad Papel blanco </a> para obtener más información sobre cómo puede ayudar a su negocio.",
"whatis_business_p2": "CryptPad se puede implementar en las instalaciones y los <a href=\"https://cryptpad.fr/about.html\"> desarrolladores de CryptPad </a> en XWiki SAS pueden ofrecer soporte comercial, personalización y desarrollo. Comuníquese con <a href=\"mailto:sales@cryptpad.fr\"> sales@cryptpad.fr </a> para obtener más información.",
"features": "Caracteristicas",
"features_title": "Comparación de características",
"features_feature": "Característica",
@ -732,7 +718,6 @@
"features_f_storage1": "Almacenamiento permanente (50 MB)",
"features_f_storage1_note": "Los Pads almacenados en su CryptDrive nunca se eliminan por inactividad",
"features_f_register": "Registrate gratis",
"features_f_register_note": "No se requiere correo electrónico ni información personal",
"features_f_reg": "Todas las funciones de usuario registrado",
"features_f_reg_note": "Y ayudar al desarrollo de CryptPad",
"features_f_storage2": "Espacio de almacenamiento adicional",
@ -743,146 +728,6 @@
"features_f_supporter_note": "Ayúdenos a mostrar que el software para mejorar la privacidad debería ser la norma",
"features_f_subscribe": "Suscríbase a premium",
"features_f_subscribe_note": "Primero debe iniciar sesión en CryptPad",
"faq_link": "FAQ",
"faq_title": "Preguntas frecuentes",
"faq_whatis": "¿ Que es <span class='cp-brand-font'>CryptPad</span>?",
"faq": {
"keywords": {
"title": "Palabra clave",
"pad": {
"q": "¿ Que es un Pad ?",
"a": "<em> Pad </em> es un término popularizado por <a href='http://etherpad.org/' target='_blank'> Etherpad </a>, un editor colaborativo en tiempo real.\nSe refiere a un documento que puede editar en su navegador, generalmente con los cambios de otras personas visibles casi al instante."
},
"owned": {
"q": "¿Qué es un Pad de propiedad?",
"a": "Un <em> pad propiedad </em> es un pad creado con un <em> propietario </em> explícito, identificado al servidor por su <em> clave de firma pública </em>. El propietario de una almohadilla puede optar por eliminar sus almohadillas del servidor, por lo que no estará disponible para otros colaboradores en el futuro, ya sea que lo tengan en su CryptDrive o no."
},
"expiring": {
"q": "¿ Que es un Pad expirado ?",
"a": "Una <em> Pad que caduca </em> es una almohadilla creada con un tiempo establecido en el que se eliminará automáticamente del servidor. Las almohadillas que caducan se pueden configurar para durar desde una hora hasta cien meses. El pad y todo su historial dejarán de estar disponibles de forma permanente, incluso si se están editando en el momento en que caduca. <br> <br> Si un pad está configurado para caducar, puede verificar su tiempo de caducidad al ver su <em> propiedades </em>, ya sea haciendo clic con el botón derecho en el pad en su CryptDrive, o utilizando el submenú <em> propiedades </em> de la barra de herramientas de una aplicación."
},
"tag": {
"q": "¿Cómo puedo usar etiquetas?",
"a": "Puede etiquetar pads y archivos cargados a través de su CryptDrive, o usando el botón <em> tag </em> (<span class = 'fa fa-hashtag'> </span>) en la barra de herramientas de cualquier editor. Busque pads y archivos en su CryptDrive utilizando la barra de búsqueda con un término que comience con un hashtag, como <em> #crypto </em>."
},
"template": {
"q": "¿ Que es una plantilla ?",
"a": "Una plantilla es un pad que se puede usar para definir el contenido inicial de otro pad del mismo tipo cuando lo crea. Cualquier pad existente puede convertirse en una plantilla moviéndolo a la sección <em> Plantillas </em> en su CryptDrive. También puede crear una copia de un pad para usar como plantilla haciendo clic en el botón de plantilla (<span class = 'fa fa-bookmark'> </span>) en la barra de herramientas del editor."
},
"abandoned": {
"q": "¿Qué es una plataforma abandonada?",
"a": "¿Qué es una almohadilla abandonada? Una <em> almohadilla abandonada </em> es una almohadilla que no está anclada en el CryptDrive de ningún usuario registrado y que no se ha cambiado durante seis meses. Los documentos abandonados se eliminarán automáticamente del servidor."
}
},
"privacy": {
"title": "Privacidad",
"different": {
"q": "¿En qué se diferencia CryptPad de otros servicios de Pad?",
"a": "CryptPad cifra los cambios en sus pads antes de enviar esa información para que se almacene en el servidor, por lo que no podemos leer lo que está escribiendo."
},
"me": {
"q": "¿Qué información sabe el servidor sobre mí?",
"a": "Los administradores del servidor pueden ver las direcciones IP de las personas que visitan el CryptPad. No registramos qué direcciones visitan qué pads, pero podríamos, aunque no tengamos acceso al contenido descifrado de esos pads. Si le preocupa que analicemos esa información, es más seguro asumir que la recopilamos, ya que no podemos demostrar que no lo hacemos. <br> <br> Recopilamos cierta telemetría básica sobre cómo las personas usan CryptPad, como como el tamaño de la pantalla en su dispositivo y en qué botones hacen clic más. Esto nos ayuda a mejorar el software, pero si prefiere no enviar dicha información al servidor, puede <strong> optar por desactivarla desmarcando <em> Casilla de verificación Habilitar comentarios del usuario </em> </strong>. <br> <br> Realizamos un seguimiento de las almohadillas que hay en el CryptDrive de un usuario para poder imponer límites de almacenamiento, pero no conocemos el contenido o tipo de esas almohadillas. Las cuotas de almacenamiento están asociadas con la clave pública de un usuario, pero no asociamos nombres o correos electrónicos con esas claves públicas. <br> <br> Para obtener más información, puede leer esto <a href = 'https: //blog.cryptpad .fr / 2017/07/07 / cryptpad-analytics-what-we-cant-know-what-we-must-know-what-we-want-to-know / 'target =' _ blank '> publicación de blog </ a> que escribimos sobre el tema."
},
"register": {
"q": "¿El servidor sabe más sobre mí si me registro?",
"a": "No requerimos que los usuarios verifiquen su dirección de correo electrónico, y el servidor ni siquiera aprende su nombre de usuario o contraseña cuando se registra. En cambio, los formularios de registro e inicio de sesión generan un llavero único a partir de su entrada, y el servidor solo aprende su firma criptográfica. Utilizamos esta información para rastrear detalles como la cantidad de datos que está utilizando, lo que nos permite restringir a cada usuario a una cuota. <br> <br> Utilizamos nuestra funcionalidad <em> feedback </em> para informar al servidor que alguien Con su IP ha registrado una cuenta. Usamos esto para medir cuántas personas se registran para las cuentas de CryptPad y para ver en qué regiones se encuentran para poder adivinar en qué idiomas pueden necesitar un mejor soporte. <br> <br> Los usuarios registrados informan al servidor qué pads están en su CryptDrive para que dichos pads no se consideren abandonados y se eliminen del servidor debido a la inactividad."
},
"other": {
"q": "¿Qué pueden aprender otros colaboradores sobre mí?",
"a": "Cuando edita un bloc con otra persona, se comunica a través del servidor, por lo que solo nosotros conocemos su dirección IP. Otros usuarios pueden ver su nombre para mostrar, avatar, el enlace a su perfil (si tiene uno) y su <em> clave pública </em> (que se utiliza para cifrar las comunicaciones entre ellos)."
},
"anonymous": {
"q": "¿CryptPad me hace anónimo?",
"a": "Aunque CryptPad está diseñado para saber lo menos posible sobre usted, no proporciona un anonimato fuerte. Nuestros servidores tienen acceso a su dirección IP, sin embargo, puede ocultar esta información utilizando Tor para acceder a CryptPad. Usar Tor sin cambiar su comportamiento no le garantizará el anonimato, ya que el servidor también puede identificar a los usuarios mediante su identificador criptográfico único. Si usa la misma cuenta cuando no está usando Tor, será posible desanonimizar su sesión. <br> <br> Para los usuarios que requieren un menor grado de privacidad, CryptPad no requiere que los usuarios se identifiquen por su nombre, número de teléfono o dirección de correo electrónico como muchos otros servicios."
},
"policy": {
"q": "¿Tiene una política de privacidad de datos?",
"a": "¡Sí! Está disponible <a href='/privacy.html' target='_blank'> aquí </a>."
}
},
"security": {
"title": "Seguridad",
"proof": {
"q": "¿Cómo se utilizan las pruebas de conocimiento cero?",
"a": "Cuando usamos el término <em> Zero Knowledge </em>, no nos estamos refiriendo a <em> pruebas de Zero Knowledge </em>, sino a <em> Zero Knowledge Web Services </em>. <em> Zero Knowledge Web Services </em> encripta los datos del usuario en el navegador del usuario, sin que el servidor tenga acceso a los datos no encriptados o las claves de encriptación. <br> <br> Hemos compilado una breve lista de Zero Servicios de conocimiento <a href='https://blog.cryptpad.fr/2017/02/20/Time-to-Encrypt-the-Cloud/#Other-Zero-Knowledge-Services'> aquí </a>."
},
"why": {
"q": "¿Por qué debería usar CryptPad?",
"a": "Nuestra posición es que los servicios en la nube no deberían requerir acceso a sus datos para que pueda compartirlos con sus amigos y colegas. Si está utilizando otro servicio para colaborar, y no dicen explícitamente que no pueden acceder a su información, es muy probable que la estén aprovechando para obtener ganancias."
},
"compromised": {
"q": "¿CryptPad me protege si mi dispositivo se ve comprometido?",
"a": "En caso de que le roben su dispositivo, CryptPad le permite activar un cierre de sesión remoto de todos los dispositivos, excepto el que está utilizando actualmente. Para hacerlo, vaya a su <strong> página de configuración </strong> y haga clic en <strong> Cerrar sesión en todas partes </strong>. Todos los demás dispositivos que están actualmente conectados a la cuenta cerrarán sesión. Cualquier dispositivo conectado previamente que visite CryptPad cerrará sesión tan pronto como cargue la página. <br> <br> Actualmente, <em> cierre de sesión remoto </em> se implementa en el navegador, no en conjunto con el servidor. Como tal, es posible que no lo proteja de las agencias gubernamentales, pero debería ser suficiente si olvidó cerrar sesión después de usar CryptPad desde una computadora compartida."
},
"crypto": {
"q": "¿Qué criptografía usas?",
"a": "CryptPad se basa en dos bibliotecas de criptografía de código abierto: <a href='https://github.com/dchest/tweetnacl-js' target='_blank'> tweetnacl.js </a> y <a href = 'https : //github.com/dchest/scrypt-async-js 'target =' _ blank '> scrypt-async.js </a>. <br> <br> Scrypt es un <em> algoritmo de derivación de clave basado en contraseña < / em>. Lo usamos para convertir su nombre de usuario y contraseña en un llavero único que asegura el acceso a su CryptDrive de modo que solo usted pueda acceder a su lista de almohadillas. <br> <br> Utilizamos <em> xsalsa20-poly1305 </em> y <em> x25519-xsalsa20-poly1305 </em> cifrados proporcionados por tweetnacl para cifrar los pads y el historial de chat, respectivamente."
},
"pad_password": {
"q": "¿Qué pasa cuando protejo un Pad o carpeta con contraseña?",
"a": "Puedes proteger cualquier Pad o carpeta compartida con contraseña al crearlo. También puedes usar el menú de propiedades para establecer, cambiar o eliminar una contraseña en cualquier momento.<br><br>Las contraseñas de Pads y carpetas compartidas están pensadas para proteger el enlace cuando lo compartas por canales potencialmente inseguros, como un correo electrónico o un mensaje de texto. Si alguien intercepta el enlace pero no conoce la contraseña, no podrá leer el documento.<br><br>Al compartir en CryptPad con tus contactos o equipos, las comunicaciones se cifran y se asume que quieres que accedan al documento. Por tanto, la contraseña se guarda y se envía con el Pad. <b>No</b> se le pregunta ni al recipiente ni a ti mismo/a al abrirlo."
}
},
"usability": {
"title": "Usabilidad",
"register": {
"q": "¿Qué obtengo al registrarme?",
"a": "Los usuarios registrados tienen acceso a una serie de funciones que no están disponibles para usuarios no registrados. Hay un gráfico <a href='/features.html' target='_blank'> aquí </a>."
},
"share": {
"q": "¿Cómo puedo compartir mis notas cifradas con mis contactos?",
"a": "CryptPad coloca la clave de cifrado secreta en su teclado después del carácter <em> # </em> en la URL. Cualquier cosa después de este carácter no se envía al servidor, por lo que nunca tenemos acceso a sus claves de cifrado. Al compartir el enlace a un bloc, comparte la capacidad de leerlo y acceder a él."
},
"remove": {
"q": "Eliminé un Pad o archivo de mi CryptDrive, pero el contenido aún está disponible. ¿Como puedo quitarlo?",
"a": "Solo se pueden eliminar <em> Pad propias </em> (introducidas en febrero de 2018). Además, estos pads solo pueden ser eliminados por sus <em> propietarios </em> (la persona que originalmente creó el pad). Si no es el creador del pad, deberá pedirle a su propietario que lo elimine por usted. Para los pads que posee, puede <strong> hacer clic con el botón derecho en el pad en su CryptDrive </strong> y elegir <strong> Eliminar del servidor </strong>."
},
"forget": {
"q": "¿Qué pasa si olvido mi contraseña?",
"a": "Desafortunadamente, si pudiéramos recuperar el acceso a sus pads cifrados por usted, podríamos acceder a ellos nosotros mismos. Si no registró su nombre de usuario y contraseña en ninguna parte, y tampoco puede recordarlos, puede recuperar sus pads filtrando el historial de su navegador."
},
"change": {
"q": "¿Qué pasa si quiero cambiar mi contraseña?",
"a": "Puede cambiar su contraseña de CryptPad en la página de configuración de su cuenta."
},
"devices": {
"q": "He iniciado sesión en dos dispositivos y veo dos CryptDrives diferentes, ¿cómo es esto posible?",
"a": "Es probable que haya registrado el mismo nombre dos veces, utilizando contraseñas diferentes. Debido a que el servidor CryptPad lo identifica por su firma criptográfica y no por su nombre, no puede evitar que otros se registren con el mismo nombre. Como tal, cada cuenta de usuario tiene una combinación única de nombre de usuario y contraseña. Los usuarios registrados pueden ver su nombre de usuario en la parte superior de la página de configuración."
},
"folder": {
"q": "¿Puedo compartir carpetas completas de mi CryptDrive?",
"a": "Sí, puede crear una <em> carpeta compartida </em> desde su CryptDrive y compartir todos los pads que contiene a la vez."
},
"feature": {
"q": "¿Puedes agregar una característica muy especial que necesito?",
"a": "Muchas de las funciones de CryptPad existen porque los usuarios las solicitaron. Nuestra <a href='https://cryptpad.fr/contact.html' target='_blank'> página de contactos </a> enumera las formas en que puede contactarnos. <br> <br> Desafortunadamente, no podemos garantizar que implementaremos todo lo que la gente pide. Si una característica particular es crítica para su organización, puede patrocinar el tiempo de desarrollo para garantizar su finalización. Póngase en contacto con <a href='mailto:sales@cryptpad.fr' target='_blank'> sales@cryptpad.fr </a> para obtener más información. <br> <br> Incluso si no puede permitirse patrocinar el desarrollo, nosotros Le interesan los comentarios que pueden ayudarnos a mejorar CryptPad. No dude en contactarnos a través de los métodos anteriores en cualquier momento."
}
},
"other": {
"title": "Otras preguntas",
"pay": {
"q": "¿ Porque debería de pagar cuando hay características que son gratis ?",
"a": "Brindamos a los seguidores almacenamiento adicional y la capacidad de aumentar las cuotas de sus contactos (<a href='https://accounts.cryptpad.fr/#/faq' target='_blank'> obtener más información </a>). <Br > <br> Más allá de estos beneficios a corto plazo, al suscribirse con una cuenta premium, usted ayuda a financiar el desarrollo continuo y activo de CryptPad. Eso incluye corregir errores, agregar nuevas funciones y facilitar que otros ayuden a alojar CryptPad ellos mismos. Además, ayuda a demostrar a otros proveedores de servicios que las personas están dispuestas a apoyar las tecnologías que mejoran la privacidad. Esperamos que eventualmente los modelos de negocio basados en la venta de datos de usuarios se conviertan en cosa del pasado. <br> <br> Finalmente, ofrecemos la mayor parte de la funcionalidad de CryptPad de forma gratuita porque creemos que todos merecen privacidad personal, no solo aquellos con desechables. ingresos. Al apoyarnos, nos ayuda a continuar haciendo posible que las poblaciones desfavorecidas accedan a estas funciones básicas sin una etiqueta de precio adjunta."
},
"goal": {
"q": "¿Cuál es tu objetivo?",
"a": "Al desarrollar tecnología de colaboración respetuosa con la privacidad, deseamos aumentar las expectativas de privacidad de los usuarios de las plataformas de computación en la nube. Esperamos que nuestro trabajo impulse a otros proveedores de servicios en todos los dominios para igualar o superar nuestros esfuerzos. A pesar de nuestro optimismo, sabemos que gran parte de la web está financiada por los ingresos de la publicidad dirigida. Hay mucho más trabajo por hacer de lo que podemos gestionar nosotros mismos, y apreciamos la promoción, el apoyo y las contribuciones de nuestra comunidad para lograr este objetivo."
},
"jobs": {
"q": "¿Estas contratando?",
"a": "¡Sí! Preséntese con un correo electrónico a <a href='mailto:jobs@xwiki.com' target='_blank'> jobs@xwiki.com </a>."
},
"host": {
"q": "¿Me pueden ayudar a configurar mi propia instancia de CryptPad?",
"a": "Nos complace brindar asistencia para la instalación interna de CryptPad de su organización. Póngase en contacto con <a href='mailto:sales@cryptpad.fr' target='_blank'> sales@cryptpad.fr </a> para obtener más información."
},
"revenue": {
"q": "¿Cómo puedo participar en el reparto de ingresos?",
"a": "Si está ejecutando su propia instancia de CryptPad y desea habilitar cuentas pagas y dividir los ingresos con los desarrolladores, su servidor deberá configurarse como un servicio asociado. <br> <br> En su directorio de CryptPad, <em > config.example.js </em> debe contener una explicación de lo que necesita configurar en su servidor. Deberá ponerse en contacto con <a href='mailto:sales@cryptpad.fr'> sales@cryptpad.fr </a> para verificar que su servidor esté configurado para usar HTTPS correctamente y analizar los métodos de pago."
}
}
},
"four04_pageNotFound": "No pudimos encontrar la página que estabas buscando.",
"help": {
"title": "Empezando",

View file

@ -430,7 +430,6 @@
"register_mustRememberPass": "Emme voi nollata salasanaasi, jos unohdat sen. On erittäin tärkeää, että muistat sen! Ole hyvä ja laita rasti valintaruutuun vahvistaaksesi.",
"register_whyRegister": "Miksi rekisteröityminen kannattaa?",
"register_header": "Tervetuloa CryptPadiin",
"register_explanation": "<h3>Käydään läpi muutama perusasia:</h3><ul class='list-unstyled'><li><i class='fa fa-info-circle'></i>Salasanasi on myös salausavain, jolla kaikki luomasi padit salataan. Jos kadotat salasanasi, emme voi millään tavalla palauttaa tietojasi.</li><li><i class='fa fa-info-circle'></i>Voit tuoda viimeksi katselemasi padit selaimestasi käyttäjätilillesi.</li><li><i class='fa fa-info-circle'> </i> Jos käytät jaettua tietokonetta, täytyy sinun kirjautua ulos lopettaessasi työskentelyn - välilehden sulkeminen ei riitä.</li></ul>",
"register_writtenPassword": "Olen kirjoittanut ylös käyttäjätunnukseni ja salasanani, jatka",
"register_cancel": "Takaisin",
"register_warning": "Nollatietoperiaate tarkoittaa, ettemme voi palauttaa tietojasi, jos hävität salasanasi.",
@ -631,19 +630,8 @@
"topbar_whatIsCryptpad": "Mikä on CryptPad",
"whatis_title": "Mikä on CryptPad",
"whatis_collaboration": "Nopeaa ja helppoa yhteistyötä",
"whatis_collaboration_p1": "CryptPadin avulla voit nopeasti luoda kollaboratiivisia asiakirjoja muistiinpanoja ja yhteistä ideointia varten. Rekisteröitymällä ja kirjautumalla sisään saat mahdollisuuden ladata tiedostoja palvelimelle ja oman CryptDriven, jossa voit säilyttää kaikki padisi. Rekisteröityneet käyttäjät saavat ilmaiseksi 50 Mt tallennustilaa.",
"whatis_collaboration_p2": "Voit helposti antaa käyttöoikeuden CryptPad-dokumenttiin jakamalla sen linkin. Voit myös jakaa asiakirjan linkin <em>vain luku</em>-tilassa, jolloin voit julkistaa yhteistyön tulokset ja muokata niitä edelleen.",
"team_inviteLinkError": "Linkin luomisessa tapahtui virhe.",
"whatis_collaboration_p3": "<a href=\"http://ckeditor.com/\">CKEditor</a>:illa voit luoda yksinkertaisia muotoiltavia tekstitiedostoja sekä Markdown-tiedostoja, jotka muunnetaan tekstiä muokatessasi reaaliaikaisesti esitysmuotoon. Voit myös käyttää Kysely-sovellusta tapahtumien ajoittamiseen useiden osallistujien kanssa.",
"whatis_zeroknowledge": "Nollatietoperiaate",
"whatis_zeroknowledge_p1": "Emme halua tietää, mitä kirjoitat. Modernin kryptografian avulla voit olla varma, ettemme todellakaan tiedä siitä mitään. CryptPad käyttää <strong>100-prosenttisesti asiakasohjelmassa tapahtuvaa salausta</strong> suojatakseen tuottamaasi sisältöä meiltä palvelimen ylläpitäjiltä.",
"whatis_zeroknowledge_p2": "Rekisteröityessäsi ja kirjautuessasi sisään käyttäjätunnuksesi ja salasanasi lasketaan salaiseksi avaimeksi <a href=\"https://en.wikipedia.org/wiki/Scrypt\">scrypt-avaintenmuodostusfunktiolla</a>. Tätä avainta, käyttäjätunnustasi ja salasanaasi ei koskaan lähetetä palvelimelle. Sen sijaan niitä käytetään asiakasohjelmassa CryptDrivesi sisällön purkamiseen. CryptDrivesi puolestaan sisältää avaimet kaikkiin padeihin, joihin sinulla on käyttöoikeus.",
"whatis_zeroknowledge_p3": "Kun jaat linkin asiakirjaan, jaat itse asiassa asiakirjan käyttöön tarvittavan salausavaimen, mutta koska salausavain sisällytetään <a href=\"https://en.wikipedia.org/wiki/Fragment_identifier\">katkelmatunnisteeseen (fragment identifier)</a>, sitä ei koskaan lähetetä palvelimelle suoraan. Tutustu <a href=\"https://blog.cryptpad.fr/2017/07/07/cryptpad-analytics-what-we-cant-know-what-we-must-know-what-we-want-to-know/\">yksityisyydestä kertovaan blogikirjoitukseemme</a> saadaksesi selville, mihin metadataan meillä on pääsy ja mihin taas ei.",
"whatis_drive": "CryptDriven järjestely",
"whatis_drive_p1": "Kun käytät padia CryptPadissa, lisätään se automaattisesti CryptDrivesi pääkansioon. Voit halutessasi myöhemmin järjestellä padit kansioihin tai viedä ne roskakoriin. CryptDrive antaa sinun hakea padejasi ja järjestellä niitä milloin ja miten haluat.",
"whatis_drive_p2": "Intuitiivinen raahaa ja pudota-käyttöliittymä mahdollistaa padien siirtelemisen CryptDrivessa niin, etteivät niiden linkit muutu, eivätkä padien osallistujat siten koskaan menetä käyttöoikeuttaan niihin.",
"whatis_drive_p3": "Voit myös ladata CryptDriveesi tiedostoja ja jakaa niitä kollegoidesi kanssa. Ladattuja tiedostoja voidaan järjestellä samaan tapaan kuin kollaboratiivisia padeja.",
"whatis_business": "CryptPad yrityksille",
"admin_activeSessionsTitle": "Aktiiviset yhteydet",
"admin_activeSessionsHint": "Aktiivisten WebSocket-yhteyksien määrä (ja yhdistetyt uniikit IP-osoitteet)",
"admin_activePadsTitle": "Aktiiviset padit",
@ -806,8 +794,6 @@
"drive_quota": "Tallennustilakiintiösi",
"settings_codeBrackets": "Sulje sulkeet automaattisesti",
"team_viewers": "Katselijat",
"whatis_business_p1": "CryptPadin nollatietoperiaate-salaus moninkertaistaa olemassaolevien tietoturvaprotokollien tehokkuuden peilaamalla organisaation pääsynvalvontaa kryptografiassa. Arkaluonteisten tietojen purkamiseen tarvitaan aina käyttäjän kirjautumistiedot, joten CryptPad on potentiaaliselle hyökkääjälle perinteisiä pilvipalveluita vähempiarvoisempi kohde. Lue lisää hyödyistä yrityksille <a href='https://blog.cryptpad.fr/images/CryptPad-Whitepaper-v1.0.pdf'>CryptPad Whitepaper-julkaisusta</a>.",
"whatis_business_p2": "Cryptpad on saatavilla on-premises-ratkaisuna, ja XWiki SAS:n<a href=\"https://cryptpad.fr/about.html\">CryptPad-kehittäjät</a> tarjoavat kaupallista tukea sekä räätälöinti- ja kehityspalveluita. Ota yhteyttä osoitteeseen <a href=\"mailto:sales@cryptpad.fr\">sales@cryptpad.fr</a> saadaksesi lisätietoja.",
"policy_title": "CryptPad-tietosuojakäytäntö",
"policy_whatweknow": "Mitä tiedämme sinusta",
"policy_whatweknow_p1": "Web-sovelluksena CryptPad voi käyttää HTTP-protokollan paljastamia metatietoja. Nämä sisältävät IP-osoitteesi ja joitakin muita HTTP-otsikoita, joista selaimesi voidaan tunnistaa. Voit selvittää selaimesi jakamat tiedot <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.whatismybrowser.com/detect/what-http-headers-is-my-browser-sending\" title=\"what http headers is my browser sending\">WhatIsMyBrowser.com-palvelussa</a>.",
@ -853,7 +839,6 @@
"features_f_storage1": "Pysyvä tallennustila (50Mt)",
"features_f_storage1_note": "CryptDriveen tallennettuja padeja ei koskaan poisteta käyttämättömyyden takia",
"features_f_register": "Rekisteröidy ilmaiseksi",
"features_f_register_note": "Sähköpostiosoitetta tai henkilötietoja ei tarvita",
"features_f_reg": "Kaikki rekisteröityneiden käyttäjien ominaisuudet",
"features_f_reg_note": "Ja auta CryptPadin kehitystyötä",
"features_f_storage2": "Lisää tallennustilaa",
@ -864,146 +849,6 @@
"features_f_supporter_note": "Auta meitä näyttämään, että yksityisyyttä edistävien ohjelmistojen tulisi olla oletusarvo",
"features_f_subscribe": "Tilaa Premium",
"features_f_subscribe_note": "Kirjaudu ensin sisään CryptPadiin",
"faq_link": "UKK",
"faq_title": "Usein kysytyt kysymykset",
"faq_whatis": "Mikä on <span class='cp-brand-font'>CryptPad</span>?",
"faq": {
"keywords": {
"title": "Avainsanat",
"pad": {
"q": "Mikä on padi?",
"a": "<em>Padi</em> on <a href='http://etherpad.org/' target='_blank'>Etherpad-projektin</a> popularisoima termi reaaliaikaiselle kollaboratiiviselle editorille.\nSe tarkoittaa selaimessa muokattavaa asiakirjaa, jossa muiden käyttäjien tekemät muutokset näkyvät lähes välittömästi."
},
"owned": {
"q": "Mikä on omistettu padi?",
"a": "<em>Omistettu padi</em> on padi, jolla on erityisesti määritelty <em>omistaja</em>, jonka palvelin tunnistaa <em>julkisen salausavaimen</em> perusteella. Padin omistaja voi poistaa omistamansa padit palvelimelta, jolloin muut yhteiskäyttäjät eivät voi enää käyttää niitä riippumatta siitä, olivatko ne tallennettuna heidän henkilökohtaisiin CryptDriveihinsa."
},
"expiring": {
"q": "Mikä on vanheneva padi?",
"a": "<em>Vanheneva padi</em> on padi, jolle on määritelty vanhenemisajankohta, jolloin padi poistetaan automaattisesti palvelimelta. Vanhenevat padit voidaan määritellä säilymään minkä tahansa ajan yhdestä tunnista 100 kuukauteen. Vanheneva padi ja sen historia muuttuvat vanhenemishetkellä pysyvästi käyttökelvottomiksi, vaikka padia muokattaisiinkin silloin.<br><br>Jos padi on määritelty vanhenevaksi, voit tarkastaa sen vanhenemisajan padin <em>ominaisuuksista</em> joko CryptDrivessa padin kohdalla hiiren oikealla painikkeella aukeavasta valikosta tai käyttämällä <em>Ominaisuudet-valikkoa</em> sovelluksen työkalupalkista."
},
"tag": {
"q": "Miten voin käyttää tunnisteita?",
"a": "Voit lisätä padeihin ja ladattuihin tiedostoihin tunnisteita CryptDrivessa tai käyttää <em>Tunniste</em>-painiketta (<span class='fa fa-hashtag'></span>) minkä tahansa editorin työkalupalkista. Hae padeja ja tiedostoja CryptDriven hakupalkista käyttämällä ristikkomerkillä alkavaa hakusanaa (esimerkiksi <em>#crypto</em>)."
},
"template": {
"q": "Mikä on mallipohja?",
"a": "Mallipohja on padi, jolla voit määritellä luotavan padin oletussisällön luodessasi toista samantyyppistä padia. Voit muuttaa minkä tahansa olemassaolevan padin mallipohjaksi siirtämällä sen <em>Mallipohjat</em>-osastoon CryptDrivessasi. Voit myös tehdä padista mallipohjana käytettävän kopion napsauttamalla Mallipohja-painiketta (<span class='fa fa-bookmark'></span>) editorin työkalupalkista."
},
"abandoned": {
"q": "Mikä on hylätty padi?",
"a": "<em>Hylätty padi</em> on padi, jota ei ole kiinnitetty yhdenkään rekisteröityneen käyttäjän CryptDriveen ja jota ei ole muokattu kuuteen kuukauteen. Hylätyt asiakirjat poistetaan palvelimelta automaattisesti."
}
},
"privacy": {
"title": "Yksityisyys",
"different": {
"q": "Miten CryptPad eroaa muista padeja tarjoavista palveluista?",
"a": "CryptPad salaa padeihin tekemäsi muutokset ennen niiden lähettämistä palvelimelle, joten emme voi lukea, mitä kirjoitat."
},
"me": {
"q": "Mitä palvelin tietää minusta?",
"a": "Palvelimen ylläpitäjät näkevät CryptPadia käyttävien ihmisten IP-osoitteet. Emme pidä kirjaa siitä, mitkä osoitteet vierailevat missäkin padeissa. Tämä olisi kuitenkin teknisesti mahdollista, vaikka emme pääsekään tarkastelemaan padien salaamatonta sisältöä. Jos pelkäät meidän analysoivan näitä tietoja, on parasta olettaa meidän keräävän niitä, sillä emme voi todistaa, ettemme tee niin.<br><br>Keräämme käyttäjiltämme joitakin perustason telemetriatietoja, kuten käytetyn laitteen näytön koon ja tietoja useimmin käytetyistä painikkeista. Nämä auttavat meitä parantamaan CryptPadia, mutta jos et halua lähettää telemetriatietoja CryptPadille, voit <strong>jättäytyä pois tietojen keräämisestä ottamalla rastin pois <em>Salli käyttäjäpalaute</em>-ruudusta</strong>.<br><br>Pidämme kirjaa siitä, mitä padeja käyttäjät säilyttävät CryptDriveissaan pystyäksemme asettamaan tallennustilarajoituksia. Emme kuitenkaan tiedä näiden padien tyyppiä tai sisältöä. Tallennustilakiintiöt määritellään käyttäjien julkisten salausavainten perusteella, mutta emme yhdistä käyttäjien nimiä tai sähköpostiosoitteita näihin avaimiin.<br><br>Saadaksesi lisätietoja aiheesta voit tutustua kirjoittamaamme <a href='https://blog.cryptpad.fr/2017/07/07/cryptpad-analytics-what-we-cant-know-what-we-must-know-what-we-want-to-know/' target='_blank'>blogikirjoitukseen</a>."
},
"register": {
"q": "Jos rekisteröidyn, tietääkö palvelin minusta enemmän?",
"a": "Emme vaadi käyttäjiltä sähköpostiosoitteen vahvistusta, eikä palvelin saa tietää rekisteröitymisen yhteydessä edes käyttäjänimeäsi tai salasanaasi. Sen sijaan rekisteröitymis- ja sisäänkirjautumislomakkeet luovat antamastasi syötteestä uniikin avainrenkaan, ja palvelin saa tietoonsa ainoastaan kryptografisen allekirjoituksesi. Käytämme tätä tietoa yksityiskohtien, kuten tallennustilan käytön valvomiseen ja siten tallennustilakiintiöiden ylläpitämiseen.<br><br>Käytämme <em>palaute</em>-toimintoa kertoaksemme palvelimelle, että IP-osoitteestasi on luotu käyttäjätili. Tämä auttaa meitä pitämään kirjaa CryptPadiin rekisteröityneiden käyttäjien määrästä ja maantieteellisestä sijainnista, jotta voimme paremmin arvioida, mitä kieliä palvelumme kannattaisi tukea.<br><br>Rekisteröityneet käyttäjät kertovat palvelimelle, mitä padeja he säilyttävät CryptDriveissaan. Tämä on tarpeen, että kyseisiä padeja ei todeta hylätyiksi ja siten poisteta käyttämättömyyden takia."
},
"other": {
"q": "Mitä yhteistyökumppanit saavat tietää minusta?",
"a": "Muokatessasi padia jonkun toisen kanssa kaikki yhteydet kulkevat palvelimen kautta, joten vain me saamme tietää IP-osoitteesi. Muut käyttäjät näkevät näyttönimesi, avatar-kuvasi, linkin profiiliisi (jos olet luonut sellaisen) ja <em>julkisen salausavaimesi</em> (jota käytetään yhteyksien salaamiseen)."
},
"anonymous": {
"q": "Tekeekö CryptPad minusta anonyymin?",
"a": "Vaikka CryptPad on suunniteltu tietämään sinusta niin vähän kuin mahdollista, se ei tarjoa vahvaa anonymiteettisuojaa. Palvelimemme tietävät IP-osoitteesi, mutta voit halutessasi piilottaa sen käyttämällä CryptPadia Tor-verkosta. Pelkkä Tor-verkon käyttäminen ilman muutoksia verkkokäyttäytymiseesi ei takaa anonymiteettiä, sillä palvelin tunnistaa käyttäjät uniikkien salaustunnisteiden perusteella. Jos käytät samaa käyttäjätunnusta Tor-verkosta ja sen ulkopuolelta, istuntosi voidaan yhdistää sinuun.<br><br>Käyttäjille, joiden yksityisyysvaatimukset ovat matalammat - toisin kuin monet muut palvelut, CryptPad ei vaadi käyttäjiä tunnistautumaan nimellä, puhelinnumerolla tai sähköpostiosoitteella."
},
"policy": {
"q": "Onko teillä tietosuojakäytäntö?",
"a": "Kyllä! Se löytyy <a href='/privacy.html' target='_blank'>täältä</a>."
}
},
"security": {
"pad_password": {
"q": "Mitä tapahtuu, kun suojaan padin tai kansion salasanalla?",
"a": "Voit suojata minkä tahansa padin tai jaetun kansion salasanalla luodessasi sen. Voit myös käyttää Ominaisuudet-valikkoa asettaaksesi, vaihtaaksesi tai poistaaksesi salasanan milloin tahansa.<br><br>Padien ja jaettujen kansioiden salasanat on tarkoitettu suojaamaan linkkiä jakaessasi sitä mahdollisesti turvattomien kanavien, kuten sähköpostin tai tekstiviestin kautta. Jos joku onnistuu kaappaamaan linkkisi, mutta ei tiedä sen salasanaa, ei hän pääse lukemaan asiakirjaasi.<br><br>Kun jaat sisältöä CryptPadin sisällä yhteystietojesi tai tiimiesi kanssa, tiedonsiirto on salattua ja oletamme, että haluat heidän pääsevän käyttämään asiakirjaasi. Siksi salasana tallennetaan ja lähetetään padin mukana jakaessasi sitä CryptPadin sisällä. Vastaanottajalta tai sinulta itseltäsi <b>ei</b> pyydetä salasanaa asiakirjaa avatessa."
},
"title": "Turvallisuus",
"proof": {
"q": "Miten käytätte nollatietotodistuksia (Zero Knowledge Proofs)?",
"a": "Käyttäessämme termiä \"nollatieto\" (Zero Knowledge) emme viittaa <em>nollatietotodistuksiin</em> (Zero Knowledge Proofs) vaan <em>nollatieto-verkkopalveluihin</em> (Zero Knowledge Web Services). Nollatieto-verkkopalvelut salaavat käyttäjän datan tämän selaimessa niin, ettei palvelin pääse missään vaiheessa käsittelemään salaamatonta dataa tai salausavaimia.<br><br>Olemme keränneet listan muista nollatietopalveluista <a href='https://blog.cryptpad.fr/2017/02/20/Time-to-Encrypt-the-Cloud/#Other-Zero-Knowledge-Services'>tänne</a>."
},
"why": {
"q": "Miksi minun kannattaisi käyttää CryptPadia?",
"a": "Mielestämme pilvipalveluiden ei tarvitse päästä lukemaan dataasi, jotta voit jakaa sen ystäviesi ja kollegoidesi kanssa. Jos käytät yhteistyöhön jotakin muuta palvelua, eikä palvelu erikseen ilmoita, ettei se pääse käsiksi tietoihisi, on hyvin todennäköistä, että tietojasi käytetään kaupallisiin tarkoituksiin."
},
"compromised": {
"q": "Suojaako CryptPad minua, jos laitteeni tietoturva on vaarantunut?",
"a": "Jos laitteesi varastetaan, CryptPad voi kirjata sinut ulos kaikista muista laitteista, paitsi nykyisestä laitteestasi. Tehdäksesi niin mene <strong>Asetukset</strong>-sivulle ja valitse <strong>Kirjaudu ulos kaikkialta</strong>. Kaikki muut tilillesi kirjautuneet aktiiviset laitteet kirjautuvat välittömästi ulos. Ne laitteet, joilla CryptPadia on käytetty aiemmin kirjautuvat ulos seuraavan sivunlatauksen yhteydessä.<br><br>Tällä hetkellä <em>etäuloskirjautuminen</em> on toteutettu selainpohjaisesti palvelimen sijaan. Näin ollen se ei suojaa sinua valtiollisilta toimijoilta, mutta on riittävä, jos unohdit kirjautua ulos CryptPadista käytettyäsi jaettua tietokonetta."
},
"crypto": {
"q": "Mitä kryptografisia menetelmiä käytätte?",
"a": "CryptPad perustuu kahteen avoimen lähdekoodin kryptografiakirjastoon: <a href='https://github.com/dchest/tweetnacl-js' target='_blank'>tweetnacl.js:n</a> ja <a href='https://github.com/dchest/scrypt-async-js' target='_blank'>scrypt-async.js:n</a>. <br><br>Scrypt on <em>salasanapohjainen avaimenmuodostusalgoritmi</em>. Käytämme sitä muuntaaksemme käyttäjätunnuksesi ja salasanasi uniikiksi avainrenkaaksi, joka turvaa pääsyn CryptDriveesi niin, että ainoastaan sinä pääset käsiksi padilistaasi. <br><br>Käytämme vastaavasti tweetnacl:n tarjoamia <em>xsalsa20-poly1305</em>- ja <em>x25519-xsalsa20-poly1305</em>-salakirjoitusjärjestelmiä salaamaan padeja ja keskusteluhistoriaa."
}
},
"usability": {
"title": "Käytettävyys",
"register": {
"q": "Mitä hyötyä rekisteröitymisestä on minulle?",
"a": "Rekisteröityneille käyttäjille on tarjolla joitakin toimintoja, jotka eivät ole saatavilla rekisteröitymättömille käyttäjille. Löydät nämä toiminnot <a href='/features.html' target='_blank'>luomastamme kaaviosta</a>."
},
"share": {
"q": "Miten jaan salattuja padeja yhteystietojeni kanssa?",
"a": "CryptPad laittaa URL-osoitteessa padisi salaisen salausavaimen <em>#</em>-merkin jälkeen. Tämän merkin jälkeen laitettuja tietoja ei lähetetä palvelimelle, joten emme pääse koskaan käyttämään salausavaimiasi. Jakaessasi linkin padiin jaat oikeuden lukea ja käyttää sitä."
},
"remove": {
"q": "Poistin padin tai tiedoston CryptDrivestani, mutta sen sisältö on yhä käytettävissä. Miten voin poistaa sen?",
"a": "Ainoastaan <em>omistettuja padeja</em> (otettu käyttöön helmikuussa 2018) voi poistaa. Lisäksi nämä padit voi poistaa ainoastaan niiden <em>omistaja</em> eli henkilö, joka alun perin loi kyseisen padin. Jos et ole luonut kyseistä padia, joudut pyytämään sen omistajaa poistamaan sen puolestasi. Omistamiesi padien poistaminen onnistuu CryptDrivessa <strong>napsauttamalla padia hiiren oikealla painikkeella</strong> ja valitsemalla <strong>Poista palvelimelta</strong>."
},
"forget": {
"q": "Mitä tapahtuu, jos unohdan salasanani?",
"a": "Valitettavasti se, että pystyisimme palauttamaan käyttöoikeuden salattuihin padeihisi tarkoittaisi myös sitä, että pääsisimme itse käsiksi niiden sisältöön. Jos et kirjoittanut käyttäjätunnustasi ja salasanaasi ylös etkä muista kumpaakaan, voit mahdollisesti palauttaa padisi selaimesi historiaa suodattamalla."
},
"change": {
"q": "Entä jos haluan vaihtaa salasanani?",
"a": "Voit vaihtaa CryptPad-salasanasi Tilin asetukset-sivulta."
},
"devices": {
"q": "Olen kirjautunut sisään kahdella laitteella, ja näen kaksi eri CryptDrivea. Miten tämä on mahdollista?",
"a": "On todennäköistä, että olet rekisteröitynyt samalla käyttäjänimellä kahdesti eri salasanoja käyttäen. CryptPad-palvelin tunnistaa sinut kryptografisen allekirjoituksesi perusteella käyttäjänimen sijaan, joten se ei voi estää muita rekisteröitymästä samalla käyttäjänimellä. Tästä johtuen jokaisella käyttäjätilillä on ainutlaatuinen käyttäjänimen ja salasanan yhdistelmä. Sisäänkirjautuneet käyttäjät voivat nähdä käyttäjänimensä Asetukset-sivun ylälaidassa."
},
"folder": {
"q": "Voinko jakaa kokonaisia kansioita CryptDrivestani?",
"a": "Kyllä, voit luoda <em>jaetun kansion</em> CryptDrivestasi ja jakaa kerralla kaikki sen sisältämät padit."
},
"feature": {
"q": "Voitteko lisätä CryptPadiin tarvitsemani ominaisuuden?",
"a": "Monet CryptPadin ominaisuuksista ovat olemassa, koska käyttäjämme ovat toivoneet niitä. <a href='https://cryptpad.fr/contact.html' target='_blank'>Yhteystiedot-sivumme</a> kertoo, millä tavoin meihin saa yhteyden.<br><br>Valitettavasti emme voi taata, että pystymme toteuttamaan kaikki käyttäjiemme ehdotukset. Jos jokin tietty ominaisuus on kriittinen organisaatiosi kannalta, voit sponsoroida kehitystä varmistaaksesi sen toteutumisen. Ota yhteyttä osoitteeseen <a href='mailto:sales@cryptpad.fr' target='_blank'>sales@cryptpad.fr</a> saadaksesi lisätietoja.<br><br>Vaikka kehitystyön sponsorointi ei olisikaan mahdollista, olemme silti kiinnostuneita palautteesta, joka auttaa meitä parantamaan CryptPadia. Ota meihin milloin tahansa yhteyttä yllä luetelluilla tavoilla."
}
},
"other": {
"title": "Muita kysymyksiä",
"pay": {
"q": "Miksi minun täytyisi maksaa, kun niin monet toiminnot ovat ilmaisia?",
"a": "Annamme tukijoillemme lisätallennustilaa ja mahdollisuuden kasvattaa yhteystietojen tallennustilakiintiöitä (<a href='https://accounts.cryptpad.fr/#/faq' target='_blank'>lue lisää</a>).<br><br>Näiden lyhytaikaisten etujen lisäksi premium-tilaus auttaa rahoittamaan CryptPadin jatkuvaa, aktiivista kehitystyötä. Tähän kuuluu bugien korjaamista, uusien ominaisuuksien lisäämistä ja CryptPad-instanssien pystyttämisen ja ylläpidon helpottamista. Lisäksi autat näyttämään muille palveluntarjoajille, että ihmiset ovat valmiita tukemaan yksityisyyttä parantavia teknologioita. Toivomme, että käyttäjätietojen myymiseen perustuvat liiketoimintamallit jäävät lopulta menneeseen.<br><br>Lopuksi, tarjoamme suurimman osan CryptPadin toiminnallisuudesta ilmaiseksi, koska uskomme yksityisyyden kuuluvan kaikille - ei vain niille, joilla on varaa maksaa siitä. Tukemalla meitä autat tarjoamaan heikommassa asemassa oleville väestöille pääsyn näihin peruspalveluihin."
},
"goal": {
"q": "Mitkä ovat tavoitteenne?",
"a": "Kehittämällä yksityisyyttä kunnioittavaa kollaboraatioteknologiaa toivomme nostavamme käyttäjien odotuksia pilvipalveluiden yksityisyyden suhteen. Toivomme, että työmme rohkaisee muita palveluntarjoajia pyrkimään samaan tai parempaan lopputulokseen. Optimismistamme huolimatta tiedämme, että suuri osa webistä rahoitetaan kohdistetulla mainonnalla. Tehtävää on paljon enemmän, kuin mihin pystymme yksin - arvostamme yhteisömme tarjoamaa mainostusta, tukea ja panosta tavoitteidemme saavuttamisessa."
},
"jobs": {
"q": "Etsittekö työntekijöitä?",
"a": "Kyllä! Esittäydy meille sähköpostilla osoitteeseen <a href='mailto:jobs@xwiki.com' target='_blank'>jobs@xwiki.com</a>."
},
"host": {
"q": "Voitteko auttaa minua perustamaan oman CryptPad-instanssini?",
"a": "Tarjoamme mielellämme tukea organisaatiosi sisäiselle CryptPad-instanssille. Ota yhteyttä osoitteeseen <a href='mailto:sales@cryptpad.fr' target='_blank'>sales@cryptpad.fr</a> saadaksesi lisätietoja."
},
"revenue": {
"q": "Kuinka voin osallistua tulojen jakamiseen?",
"a": "Jos ylläpidät omaa CryptPad-instanssiasi, haluaisit ottaa käyttöön maksulliset käyttäjätilit ja jakaa tulot CryptPadin kehittäjien kanssa, palvelimesi täytyy määritellä kumppanipalveluksi.<br><br>CryptPad-asennushakemistosi <em>config.example.js</em>-tiedostosta pitäisi löytyä ohjeet tämän palvelun käyttöönottoon. Sinun tulee myös ottaa yhteyttä osoitteeseen <a href='mailto:sales@cryptpad.fr'>sales@cryptpad.fr</a> varmistaaksesi, että palvelimesi HTTPS-määritykset ovat kunnossa ja sopiaksesi käytettävistä maksutavoista."
}
}
},
"policy_howweuse_p1": "Käytämme näitä tietoja suunnitellaksemme CryptPadin mainostusta ja arvioidaksemme aiempien kampanjoiden onnistumista. Sijaintitietosi puolestaan kertovat meille, mitä kieliä CryptPadin tulisi mahdollisesti tukea englannin lisäksi.",
"tos_title": "CryptPad-käyttöehdot",
"tos_legal": "Älä ole pahantahtoinen, väärinkäyttäjä tai tee mitään laitonta.",

View file

@ -413,19 +413,18 @@
"login_invalUser": "Nom d'utilisateur requis",
"login_invalPass": "Mot de passe requis",
"login_unhandledError": "Une erreur inattendue s'est produite :(",
"register_importRecent": "Importer les pads de votre session anonyme",
"register_importRecent": "Importer les documents de votre session non-enregistrée",
"register_acceptTerms": "J'accepte <a href='/terms.html' tabindex='-1'>les conditions d'utilisation</a>",
"register_passwordsDontMatch": "Les mots de passe doivent être identiques !",
"register_passwordTooShort": "Les mots de passe doivent contenir au moins {0} caractères.",
"register_mustAcceptTerms": "Vous devez accepter les conditions d'utilisation.",
"register_mustRememberPass": "Nous ne pouvons pas réinitialiser votre mot de passe si vous l'oubliez. C'est important que vous vous en souveniez! Veuillez cocher la case pour confirmer.",
"register_writtenPassword": "J'ai bien noté mon nom d'utilisateur et mon mot de passe, continuer",
"register_cancel": "Retour",
"register_warning": "Zero Knowledge signifie que nous ne pouvons pas récupérer vos données si vous perdez vos identifiants.",
"register_cancel": "Annuler",
"register_warning": "<i class='fa fa-warning'></i> Attention",
"register_alreadyRegistered": "Cet utilisateur existe déjà, souhaitez-vous vous connecter ?",
"register_whyRegister": "Pourquoi s'inscrire ?",
"register_header": "Bienvenue dans CryptPad",
"register_explanation": "<h3>Faisons d'abord le point sur certaines choses</h3><ul class='list-unstyled'><li><i class='fa fa-info-circle'></i>Votre mot de passe est la clé secrète de tous vos pads. Si vous le perdez, il n'y a aucun moyen de récupérer vos données.</li><li><i class='fa fa-info-circle'></i>Vous pouvez importer les pads récents de ce navigateur pour les avoir dans votre compte utilisateur.</li><li><i class='fa fa-info-circle'></i>Si vous utilisez un ordinateur partagé, vous devez vous déconnecter avant de partir, fermer l'onglet n'est pas suffisant.</li></ul>",
"register_header": "Créer un compte",
"settings_cat_account": "Compte",
"settings_cat_drive": "CryptDrive",
"settings_cat_cursor": "Curseur",
@ -593,40 +592,27 @@
"mdToolbar_check": "Liste de tâches",
"mdToolbar_code": "Code",
"home_product": "CryptPad est une alternative respectant la vie privée aux outils office et aux services cloud populaires. Tout le contenu stocké dans CryptPad est chiffré avant d'être envoyé, ce qui signifie que personne ne peut accéder à vos données à moins que vous ne leur donniez les clés (même pas nous).",
"home_host": "Ceci est une instance communautaire et indépendante de CryptPad. Le code source du projet est disponible <a href=\"https://github.com/xwiki-labs/cryptpad\" target=\"_blank\" rel=\"noreferrer noopener\">sur GitHub</a>.",
"home_host": "Ceci est une instance communautaire et indépendante de CryptPad.",
"home_host_agpl": "CryptPad est distribué sous les termes de la licence logicielle AGPL3",
"home_ngi": "Gagnant d'un prix NGI Awards",
"about_intro": "CryptPad est développé au sein de l'équipe Recherche d'<a href=\"http://xwiki.com\">XWiki SAS</a>, une petite entreprise située à Paris en France et à Iasi en Roumanie. Il y a 3 développeurs principaux qui travaillent sur CryptPad, ainsi que quelques contributeurs à la fois dans et en dehors d'XWiki SAS.",
"about_core": "Développeurs principaux",
"about_contributors": "Contributeurs clés",
"main_info": "<h2>Collaborez avec confiance</h2>Développez vos idées en groupe avec des documents partagés; la technologie <strong>Zero Knowledge</strong> sécurise vos données.",
"main_catch_phrase": "Le Cloud Zero Knowledge",
"main_catch_phrase": "Outils collaboratifs,<br>chiffrés et open source",
"main_footerText": "Avec CryptPad, vous pouvez créer des documents collaboratifs rapidement pour prendre des notes à plusieurs.",
"footer_applications": "Applications",
"footer_contact": "Contact",
"footer_aboutUs": "À propos",
"about": "À propos",
"privacy": "Confidentialité",
"privacy": "Charte de confidentialité",
"contact": "Contact",
"terms": "Conditions",
"blog": "Blog",
"topbar_whatIsCryptpad": "Qu'est-ce que CryptPad",
"whatis_title": "Qu'est-ce que CryptPad",
"whatis_collaboration": "Collaboration rapide, facile",
"whatis_collaboration_p1": "Avec CryptPad, vous pouvez créer rapidement des documents collaboratifs pour prendre des notes à plusieurs. Quand vous vous enregistrez et vous vous connectez, vous obtenez la possibilité d'importer des fichiers dans un CryptDrive où vous pouvez organiser tous vos pads (documents). En tant qu'utilisateur enregistré, vous possédez 50 Mo de stockage gratuit.",
"whatis_collaboration_p2": "Vous pouvez partager l'accès à un document simplement en partageant le lien. Vous pouvez aussi partager un lien spécial fournissant un accès <em>en lecture seule</em> au pad, permettant de publier des travaux collaboratifs tout en restant maître de l'édition.",
"whatis_collaboration_p3": "Vous pouvez créer des documents de texte avec <a href=\"http://ckeditor.com/\">CKEditor</a> tout comme des documents Markdown qui sont rendus en temps-réel pendant que vous tapez. Vous pouvez aussi utiliser l'application de sondage pour planifier des évènements avec plusieurs participants.",
"whatis_zeroknowledge": "Zero Knowledge",
"whatis_zeroknowledge_p1": "Nous ne souhaitons pas connaître ce que vous tapez et grâce à la cryptographie moderne, vous pouvez être assuré que nous ne le <b>pouvons</b> pas. CryptPad utilise <b>un chiffrement à 100 % côté client</b> pour protéger le contenu que vous tapez de nous, les personnes contrôlant le serveur.",
"whatis_zeroknowledge_p2": "Quand vous vous enregistrez et vous vous connectez, votre nom d'utilisateur et votre mot de passe sont transformés en une clé secrète grâce à la <a href=\"https://fr.wikipedia.org/wiki/Scrypt\">fonction de dérivation de clé Scrypt</a>. Ni cette clé, ni le nom d'utilisateur ou le mot de passe, ne sont envoyés au serveur. À la place, elle est utilisée côté client pour chiffrer et déchiffrer le contenu de votre CryptDrive, qui contient toutes les clés permettant d'accéder à vos pads.",
"whatis_zeroknowledge_p3": "Quand vous partagez le lien vers un document, vous partagez la clé cryptographique permettant de déchiffrer le document, mais puisque cette clé se trouve dans l'<a href=\"https://en.wikipedia.org/wiki/Fragment_identifier\">identificateur de fragment</a>, elle n'est jamais envoyée au serveur. Venez lire notre <a href=\"https://blog.cryptpad.fr/2017/07/07/cryptpad-analytics-what-we-cant-know-what-we-must-know-what-we-want-to-know/\">article de blog sur la vie privée</a> pour en apprendre davantage sur le type de métadonnées auxquelles nous avons ou n'avons pas accès.",
"whatis_title": "Qu'est-ce que CryptPad ?",
"whatis_collaboration": "Collaboration Privée",
"whatis_drive": "Organisation avec CryptDrive",
"whatis_drive_p1": "Dès que vous accédez à un pad dans CryptPad, celui-ci est automatiquement ajouté à votre CryptDrive, dans le dossier principal. Vous pouvez alors ranger ce pad dans un dossier ou le déplacer vers la corbeille. CryptDrive vous permet de rechercher parmi vos pads et de les organiser quand vous le souhaitez, comme vous le souhaitez.",
"whatis_drive_p2": "Avec le glisser-déposer intuitif, vous pouvez déplacer vos pads dans votre drive tout en conservant les liens vers ces pads pour que vos collaborateurs n'en perdent pas l'accès.",
"whatis_drive_p3": "Vous pouvez également importer des fichiers dans votre CryptDrive et les partager avec des collègues. Les fichiers importés peuvent être rangés de la même manière que vos pads collaboratifs.",
"whatis_business": "CryptPad for Business",
"whatis_business_p1": "Le chiffrement Zero Knowledge de CryptPad excelle pour accroître l'efficacité des protocoles de sécurité existants en les recréant de manière cryptographique. Puisque les données sensibles ne peuvent être déchiffrées qu'en utilisant les identifiants d'un utilisateur, CryptPad empêche d'éventuels hackers ayant réussi à s'introduire dans le serveur d'avoir accès en clair à ces données. Découvrez-en plus sur la manière dont CryptPad peut aider votre entreprise en lisant le <a href=\"https://blog.cryptpad.fr/images/CryptPad-Whitepaper-v1.0.pdf\">CryptPad Whitepaper</a>.",
"whatis_business_p2": "CryptPad est déployable sur site et les <a href=\"https://cryptpad.fr/about.html\">développeurs CryptPad</a> chez XWiki SAS peuvent effectuer du développement, des personnalisations et du support commercial. Contactez-nous à <a href=\"mailto:sales@cryptpad.fr\">sales@cryptpad.fr</a> pour plus d'informations.",
"policy_title": "Politique de confidentialité de CryptPad",
"policy_whatweknow": "Ce que nous savons de vous",
"policy_whatweknow_p1": "En tant qu'application hébergée sur le web, CryptPad a accès aux meta-données exposées par le protocole HTTP. Ceci inclus votre adresse IP et d'autres en-têtes HTTP qui peuvent être utilisées pour identifier votre propre navigateur. Vous pouvez voir quelles informations votre navigateur partage en visitant <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.whatismybrowser.com/detect/what-http-headers-is-my-browser-sending\" title=\"what http headers is my browser sending\">WhatIsMyBrowser.com</a>.",
@ -645,185 +631,44 @@
"policy_choices_vpn": "Si vous souhaitez utiliser notre instance hébergée (cryptpad.fr) mais que vous ne souhaitez pas exposer votre adresse IP, vous pouvez la protéger en utilisant le <a href=\"https://www.torproject.org/projects/torbrowser.html.en\" title=\"téléchargements du projet Tor\" target=\"_blank\" rel=\"noopener noreferrer\">navigateur Tor</a>, ou un <a href=\"https://riseup.net/fr/vpn\" title=\"VPNs fournis par Riseup\" target=\"_blank\" rel=\"noopener noreferrer\">VPN</a>.",
"policy_choices_ads": "Si vous souhaitez uniquement bloquer notre plateforme d'analytique, vous pouvez utiliser un bloqueur de publicités tel que <a href=\"https://www.eff.org/fr/privacybadger\" title=\"télécharger privacy badger\" target=\"_blank\" rel=\"noopener noreferrer\">Privacy Badger</a>.",
"features": "Fonctionnalités",
"features_title": "Comparaison des fonctionnalités",
"features_title": "Fonctionnalités",
"features_feature": "Fonctionnalité",
"features_anon": "Utilisateur anonyme",
"features_registered": "Utilisateur enregistré",
"features_premium": "Utilisateur premium",
"features_anon": "Non-enregistré",
"features_registered": "Enregistré",
"features_premium": "Premium",
"features_notes": "Notes",
"features_f_apps": "Accès aux applications principales",
"features_f_core": "Fonctions communes des applications",
"features_f_apps": "Accès à toutes les applications",
"features_f_core": "Fonctions communes",
"features_f_core_note": "Édition, Export, Historique, Liste d'utilisateurs, Chat",
"features_f_file0": "Ouvrir des fichiers",
"features_f_file0_note": "Voir et télécharger des fichiers partagés par d'autres utilisateurs",
"features_f_file0": "Ouverture de documents",
"features_f_file0_note": "Consulter et télécharger les documents partagés par d'autres utilisateurs",
"features_f_cryptdrive0": "Accès limité à CryptDrive",
"features_f_cryptdrive0_note": "Stockage dans votre navigateur des pads visités afin de pouvoir les retrouver plus tard",
"features_f_storage0": "Durée de stockage limitée",
"features_f_storage0_note": "Les pads créés risquent d'être supprimés après trois mois d'inactivité",
"features_f_storage0_note": "Les documents sont supprimés après {0} jours d'inactivité",
"features_f_anon": "Avantages des utilisateurs anonymes",
"features_f_anon_note": "Avec une meilleure ergonomie et plus de contrôle sur vos pads",
"features_f_anon_note": "Avec des fonctionnalités supplémentaires",
"features_f_cryptdrive1": "Accès complet à CryptDrive",
"features_f_cryptdrive1_note": "Dossiers, dossiers partagés, modèles, tags",
"features_f_devices": "Vos pads sur tous vos appareils",
"features_f_devices_note": "Accéder à votre CryptDrive de partout grâce à votre compte utilisateur",
"features_f_social": "Applications sociales",
"features_f_social_note": "Créer un profil, utiliser un avatar, chat avec les contacts",
"features_f_social": "Fonctionalités collaboratives",
"features_f_social_note": "Ajout de contacts pour une collaboration sécurisée, création d'un profil, contrôles d'accès affinés",
"features_f_file1": "Importer et partager des fichiers",
"features_f_file1_note": "Partager des fichiers avec vos contacts ou les intégrer dans vos pads",
"features_f_storage1": "Stockage permanent (50Mo)",
"features_f_storage1_note": "Les pads stockés dans votre CryptDrive ne seront jamais supprimés pour cause d'inactivité",
"features_f_file1_note": "Stockez des fichiers dans votre CryptDrive : images, PDF, vidéos, etc. Partagez-les avec vos contacts ou intégrez-les dans vos documents. (jusqu'à {0}Mo)",
"features_f_storage1": "Stockage personnel ({0})",
"features_f_storage1_note": "Les documents stockés dans votre CryptDrive ne sont pas supprimés pour cause d'inactivité",
"features_f_register": "S'enregistrer gratuitement",
"features_f_register_note": "Pas d'email ou d'information personnelle requis",
"features_f_reg": "Avantages des utilisateurs enregistrés",
"features_f_reg_note": "Et aider au développement de CryptPad",
"features_f_reg_note": "Avec des avantages supplémentaires",
"features_f_storage2": "Espace de stockage supplémentaire",
"features_f_storage2_note": "De 5 Go à 50 Go en fonction du plan sélectionné",
"features_f_storage2_note": "De 5Go à 50Go selon le plan, augmentation de la limite à {0}Mo pour les téléchargements de fichiers",
"features_f_support": "Support plus rapide",
"features_f_support_note": "Support email professionnel avec le plan Équipe",
"features_f_supporter": "Devenir un défenseur de la vie privée",
"features_f_supporter_note": "Nous aider à montrer que les logiciels protégeant les données personnelles devraient être la norme",
"features_f_subscribe": "S'abonner à un compte premium",
"features_f_subscribe_note": "Vous devez d'abord vous connecter à un compte CryptPad",
"faq_link": "FAQ",
"faq_title": "Foire aux questions",
"faq_whatis": "Qu'est-ce que <span class='cp-brand-font'>CryptPad</span> ?",
"faq": {
"keywords": {
"title": "Termes spéciaux",
"pad": {
"q": "Qu'est-ce qu'un pad ?",
"a": "<em>Pad</em> est un terme popularisé par <a href=\"http://etherpad.org/\" target=\"_blank\">Etherpad</a> un éditeur collaboratif en temps-réel. Il désigne un document que vous pouvez modifier dans votre navigateur et, en général, vous pouvez voir les modifications effectuées par les autres utilisateurs de manière quasiment instantanée."
},
"owned": {
"q": "Qu'est-ce qu'un pad avec propriétaire ?",
"a": "Être <em>propriétaire</em> d'un pad signifie que vous êtes identifié comme tel par le serveur avec à votre <em>clé de signature publique</em>.<br>Le propriétaire d'un pad peut décider de supprimer ce pad du serveur de manière permanente, afin de le rendre inaccessible aux autres collaborateurs même s'ils possèdent le lien dans leur CryptDrive."
},
"expiring": {
"q": "Qu'est-ce qu'un pad à durée de vie ?",
"a": "Un <em>pad à durée de vie</em> est un pad créé avec une date définie à partir de laquelle il sera supprimé automatiquement du serveur. Ils peuvent être configurés pour avoir une durée de vie comprise entre une heure et cent mois. Le pad et tout son historique sera alors inaccessible, de manière permanente, même s'il est en cours d'édition à sa date d'expiration.<br>Si un pad possède une date d'expiration, vous pouvez la vérifier en regardant les <em>propriétés</em> du pad, soit avec un clic-droit sur le pad dans votre CryptDrive, ou soit en cliquant sur Propriétés dans le sous-menu de la barre d'outils de l'application."
},
"tag": {
"q": "Comment utiliser les mots-clés ?",
"a": "Vous pouvez ajouter des <em>mots-clés</em> aux pads ou aux fichiers depuis votre CryptDrive et depuis le document en utilisant le bouton <span class=\"fa fa-hashtag\"></span> (<em>Mots-clés</em>) de la barre d'outils des éditeurs.<br>Il est ensuite possible de rechercher des pads et des fichiers dans votre CryptDrive en tapant un mot-clé, précédé de <em>#</em>, dans la barre de recherche (exemple: #crypto)."
},
"template": {
"q": "Qu'est-ce qu'un modèle ?",
"a": "Un <em>modèle</em> est un pad qui peut être utilisé pour définir le contenu initial d'un nouveau pad du même type quand vous le créez.<br>Les pads existant dans votre CryptDrive peuvent être transformés en tant que modèle en les déplaçant dans la catégorie <em>Modèles</em> du CryptDrive.<br>Il est également possible de créer une copie d'un pad en tant que modèle en cliquant sur le bouton <span class=\"fa fa-bookmark\"></span> (<em>Sauver en tant que modèle</em>) dans la barre d'outils des éditeurs."
},
"abandoned": {
"q": "Qu'est-ce qu'un pad abandonné ?",
"a": "Un <em>pad abandonné</em> est un pad qui n'est stocké dans le CryptDrive d'aucun utilisateur enregistré et qui n'a pas été modifié depuis 6 mois. Les documents abandonnés sont automatiquement supprimés du serveur."
}
},
"privacy": {
"title": "Confidentialité",
"different": {
"q": "Comment CryptPad est-il différent des autres services de pads ?",
"a": "CryptPad chiffre les changements effectués dans vos pads avant de les envoyer au serveur pour qu'ils soient stockés, nous ne pouvons donc pas lire le contenu que vous avez tapé."
},
"me": {
"q": "Quelles informations le serveur possède-t-il sur moi ?",
"a": "Les administrateurs du serveur peuvent voir les <b>adresses IP</b> des utilisateurs de CryptPad.<br>Nous n'enregistrons pas les pads visités par chaque adresse IP, mais nous le pouvons, bien que nous n'aurions pas accès au contenu déchiffré de ces pads.<br>Si vous avez des inquiétudes à ce sujet, il est préférable de considérer que nous collectons ces informations puisque nous n'avons aucun moyen de prouver que ce n'est pas le cas.<br><br>Nous collectons toutefois certaines <b>données de télémétrie</b> concernant la façon dont les gens utilisent CryptPad, par exemple la résolution de l'écran utilisé ou l'utilisation des boutons de la barre d'outils. Ces données nous aident à améliorer le produit, mais il est possible de désactiver l'envoi de telles informations au serveur en décochant la case <em>Activer l'envoi de retours d'expérience</em> dans vos <em>Préférences</em>.<br><br>Enfin, nous gardons une trace des pads stockés dans le CryptDrive des utilisateurs afin de pouvoir imposer les limites de stockage, mais nous n'avons, encore une fois, pas accès au contenu ou au type de ces pads. Ces limites sont toutefois associées à la clé publique des utilisateurs, nous ne pouvons donc pas les relier à un nom ou une adresse email.<br><br>Nous avons écrit un <a href=\"https://blog.cryptpad.fr/2017/07/07/cryptpad-analytics-what-we-cant-know-what-we-must-know-what-we-want-to-know/\" target=\"_blank\">article de blog</a> (en anglais) à ce sujet si vous souhaitez en apprendre davantage."
},
"register": {
"q": "Qu'est-ce que le serveur apprend à mon sujet si je m'inscris ?",
"a": "Nous ne demandons pas aux utilisateurs d'entrer une adresse email pour s'enregistrer, et le serveur ne connaît pas votre nom d'utilisateur ni votre mot de passe.<br>Les formulaires d'inscription et de connexion génèrent à la place un ensemble de clés uniques, créées à partir de vos identifiants, et le serveur ne connaît donc que votre signature cryptographique.<br>Nous utilisons cette information principalement pour mesurer combien de données vous avez stocké sur nos serveurs, afin de pouvoir limiter chaque utilisateur à son quota.<br><br>Nous utilisons également notre fonctionnalité de <em>retour d'expérience</em> pour indiquer au serveur que quelqu'un avec votre adresse IP a créé un compte utilisateur, bien que nous ne sachions pas lequel. Cela nous permet de mesurer le nombre d'inscriptions sur CryptPad mais aussi de voir dans quelles régions du monde se trouvent les utilisateurs, afin de déterminer les langues dans lesquelles traduire CryptPad.<br><br>Enfin, les utilisateurs enregistrés indiquent au serveur quels pads sont dans leur CryptDrive, afin que ces pads ne soient pas considérés comme abandonnés et ne soient donc pas supprimés pour inactivité."
},
"other": {
"q": "Que peuvent apprendre les autres collaborateurs à mon sujet ?",
"a": "Quand vous éditez un pad avec quelqu'un d'autre, vous communiquez en passant par notre serveur, nous sommes donc les seuls à connaître votre adresse IP.<br>Les autres utilisateurs ont accès à votre pseudonyme, votre avatar, le lien vers votre profil (si vous en avez un) et votre <em>clé publique</em> (qui est utilisée pour le chiffrement des communications entre utilisateurs)."
},
"anonymous": {
"q": "CryptPad me rend-il anonyme ?",
"a": "Bien que CryptPad soit conçu pour en savoir le moins possible à votre sujet, il ne fournit pas un anonymat complet.<br>Nos serveurs ont accès à votre adresse IP, mais vous pouvez la cacher en utilisant, par exemple, Tor pour accéder à CryptPad.<br>Utiliser Tor sans changer votre comportement ne garantira toutefois pas votre anonymat, puisque notre serveur est en mesure d'identifier des utilisateurs avec leur identifiant cryptographique unique. Si vous utilisez le même compte utilisateur avec et sans Tor, il serait donc possible de désanonymiser votre session.<br><br>Pour les utilisateurs qui n'ont pas besoin d'un niveau de confidentialité aussi élevé, Tor n'est pas nécessaire puisque CryptPad ne nécessite pas la saisie d'un nom réel, d'un numéro de téléphone ou même d'une adresse email comme de nombreux autres services."
},
"policy": {
"q": "Avez-vous une politique de confidentialité des données ?",
"a": "Oui ! Elle est disponible <a href=\"/privacy.html\" target=\"_blank\">ici</a>."
}
},
"security": {
"title": "Sécurité",
"proof": {
"q": "Comment utilisez-vous les preuves à divulgation nulle de connaissance (Zero Knowledge proofs) ?",
"a": "Quand nous utilisons le terme <em>Zero Knowledge</em>, ce n'est pas une référence aux <em>Zero Knowledge proofs</em>, mais aux <em>Services Web Zero Knowledge</em>.<br>Les <em>Services Web Zero Knowledge</em> chiffrent les données des utilisateurs dans le navigateur, de manière à ce que le serveur n'aie pas accès au contenu déchiffré ni aux clés de chiffrement.<br><br>Nous avons établi une courte liste de Services Zero Knowledge <a href=\"https://blog.cryptpad.fr/2017/02/20/Time-to-Encrypt-the-Cloud/#Other-Zero-Knowledge-Services\" target=\"_blank\">sur notre blog</a>."
},
"why": {
"q": "Pourquoi devrais-je utiliser CryptPad ?",
"a": "Notre position est que les services cloud ne devraient pas nécessiter l'accès à vos données afin que vous puissiez les partager avec vos amis ou vos collègues. Si vous utilisez un autre service pour le travail collaboratif et qu'il n'indique pas clairement que le serveur n'a pas accès aux informations, il est très probable que vos données soient utilisées pour faire du profit."
},
"compromised": {
"q": "CryptPad me protège-t-il si mon ordinateur est compromis ?",
"a": "Dans le cas où votre ordinateur ou téléphone serait volé, CryptPad vous permet de déclencher une déconnexion à distance de votre compte CryptPad sur tous les appareils, excepté celui sur lequel vous vous trouvez. Pour ce faire, vous pouvez cliquer sur <b>Se déconnecter partout</b> dans votre page de <b>Préférences</b>.<br>Tous les appareils qui sont actuellement connectés sur CryptPad à votre compte seront déconnectés. Tous les appareils qui se sont connectés au compte et ne vous demandent plus vos identifiants vous forceront à vous identifier de nouveau lorsque vous visiterez CryptPad.<br>Actuellement, la <em>déconnexion à distance</em> est implémentée dans votre navigateur et non avec le serveur. Cela signifie que cette fonction devrait être suffisante pour protéger vos données si vous oubliez de vous déconnecter après l'utilisation sur un ordinateur partagé, mais elle ne vous protègera pas des agences gouvernementales."
},
"crypto": {
"q": "Quelle cryptographie utilisez-vous ?",
"a": "CryptPad est basé sur deux librairies open-source de cryptographie : <a href=\"https://github.com/dchest/tweetnacl-js\" target=\"_blank\">tweetnacl.js</a> et <a href=\"https://github.com/dchest/scrypt-async-js\" target=\"_blank\">scrypt-async.js</a>.<br><b>Scrypt</b> est une <em>fonction de dérivation de clé</em> basée sur un mot de passe. Nous l'utilisons pour transformer votre nom d'utilisateur et votre mot de passe en un unique ensemble de clés qui sécurise l'accès à votre CryptDrive afin que vous seul puissiez accéder à votre liste de pads.<br>Nous utilisons les outils de chiffrement <em>xsalsa20-poly1305</em> et <em>x25519-xsalsa20-poly1305</em> fournis par <b>tweetnacl</b> pour chiffrer vos pads et l'historique du chat respectivement."
},
"pad_password": {
"q": "Que se passe t'il quand je protège un pad/dossier avec un mot de passe ?",
"a": "Vous pouvez protéger tout nouveau pad ou dossier avec un mot de passe. Vous pouvez aussi utiliser le menu <em>propriétés</em> pour ajouter/changer/supprimer un mot de passe par la suite. <br><br>Les mots de passe sur les pads et dossiers partagés sont faits pour protéger les liens quand ils sont envoyés de manière non sécurisée (par exemple par email ou SMS). Si quelqu'un intercepte le lien sans avoir le mot de passe, ils n'auront pas accès à votre document.<br><br>Quand vous partagez avec vos contacts ou équipes sur CryptPad, les communications sont chiffrées et nous partons du principe que vous voulez donner l'accès. C'est pourquoi le mot de passe est alors stocké et envoyé avec le pad quand vous l'envoyez. Les destinataires, ou vous même, n'ont <b>pas</b> a le donner pour ouvrir le document."
}
},
"usability": {
"title": "Utilisation",
"register": {
"q": "Qu'est-ce que je gagne en créant un compte utilisateur ?",
"a": "Les utilisateurs enregistrés ont accès à un certain nombre de nouvelles fonctionnalités inaccessibles aux utilisateurs non connectés. Un tableau récapitulatif est disponible <a href=\"/features.html\">ici</a>."
},
"share": {
"q": "Comment partager des pads chiffrés avec mes contacts ?",
"a": "CryptPad stocke la clé secrète de chiffrement des pads après le symbole <em>#</em> dans l'URL. Tout ce qui se trouve après ce symbole n'est jamais envoyé au serveur, ainsi nous n'avons pas accès à vos clés de chiffrement. Partager le lien d'un pad revient donc à permettre la lecture ou la modification du contenu."
},
"remove": {
"q": "J'ai supprimé un pad ou un fichier de mon CryptDrive, mais le contenu est encore disponible. Comment le supprimer ?",
"a": "Seuls les <em>pads avec propriétaire</em> (introduits en février 2018) peuvent être supprimés du serveur. Ils ne peuvent d'ailleurs être supprimés du serveur que par leur <em>propriétaire</em> (l'utilisateur ayant créé le pad).<br>Si vous n'êtes pas le créateur du pad, vous devrez demander au propriétaire de le supprimer pour vous.<br>Pour les pads dont vous êtes le propriétaire, vous pouvez effectuer un <b>clic-droit sur le pad dans votre CryptDrive</b>, et sélectionner <b>Supprimer du serveur</b>."
},
"forget": {
"q": "Que faire si j'oublie mon mot de passe ?",
"a": "Malheureusement, si nous avions la possibilité de retrouver ou de modifier votre mot de passe, cela signifierait que nous avons accès à vos pads, ce n'est donc pas le cas.<br>Si vous n'avez pas noté votre nom d'utilisateur et votre mot de passe, et que vous ne vous en souvenez pas, il est peut-être possible de retrouver l'accès à certains pads grâce à l'historique de votre navigateur."
},
"change": {
"q": "Que faire si je souhaite changer de mot de passe ?",
"a": "Il n'est actuellement pas possible de changer votre mot de passe sur CryptPad, mais nous comptons développer cette fonctionnalité très bientôt."
},
"devices": {
"q": "Je suis connecté sur deux appareils mais avec deux CryptDrive différents, comment est-ce possible ?",
"a": "Il est possible que vous ayez enregistré le même nom d'utilisateur 2 fois, mais avec des mots de passe différents.<br>Puisque le serveur de CryptPad vous identifie avec une clé cryptographique et non avec votre nom d'utilisateur, il ne peut pas empêcher la création d'autres comptes avec le même nom. Ainsi, chaque utilisateur possède une combinaison nom d'utilisateur / mot de passe unique.<br>Les utilisateurs enregistrés peuvent voir leur nom de compte en haut de la page de préférences."
},
"folder": {
"q": "Puis-je partager des dossiers complets de mon CryptDrive ?",
"a": "Oui, vous pouvez créer un <em>dossier partagé</em> à partir de votre CryptDrive et partager tous les pads qu'il contient."
},
"feature": {
"q": "Pouvez-vous ajouter une fonctionnalité particulière dont j'ai besoin ?",
"a": "Beaucoup de fonctionnalités de CryptPad existent parce que des utilisateurs les ont demandées.<br>Notre <a href=\"https://cryptpad.fr/contact.html\" target=\"_blank\">page de contact</a> liste les différentes manières de nous joindre.<br><br>Malheureusement, nous ne pouvons pas garantir que nous allons implémenter toutes les fonctionnalités demandées.<br>Si une fonctionnalité particulière est nécessaire pour votre organisation, vous pouvez sponsoriser son développement pour s'assurer de sa réalisation. Veuillez contacter <a href=\"mailto:sales@cryptpad.fr\" target=\"_blank\">sales@cryptpad.fr</a> pour plus d'informations.<br><br>Si vous n'avez pas la possibilité de sponsoriser du développement, nous sommes toujours intéressés par de nouvelles idées et des retours d'expérience qui peuvent nous aider à améliorer CryptPad. N'hésitez pas à nous contacter, avec les méthodes données précédemment, à n'importe quel moment."
}
},
"other": {
"title": "Autres questions",
"pay": {
"q": "Pourquoi payer alors que toutes les fonctionnalités sont gratuites ?",
"a": "Un compte premium permet d'<b>augmenter la limite de stockage</b> dans le CryptDrive, ainsi que celle de ses contacts (<a href=\"https://accounts.cryptpad.fr/#/faq\" target=\"_blank\">en savoir plus</a>).<br>En plus de ces avantages directs, l'abonnement premium permet aussi de <b>financer le développement</b> actif et de manière continue de CryptPad. Cela comprend la correction de bugs, l'ajout de nouvelles fonctionnalités et rendre plus facile l'hébergement de CryptPad par d'autres personnes.<br>Avec un abonnement, vous aidez aussi à prouver aux autres fournisseurs de services que les gens sont prêts à supporter les technologies améliorant le respect de leur vie privée. Nous espérons qu'un jour, les entreprises ayant pour revenu principal la revente de données des utilisateurs soient de l'histoire ancienne.<br>Enfin, nous offrons la plupart des fonctionnalités gratuitement parce que nous croyons que tout le monde mérite le respect de la vie privée. En souscrivant à un compte premium, vous nous aider à maintenir ces fonctionnalités basiques accessibles aux populations défavorisées."
},
"goal": {
"q": "Quel est votre objectif ?",
"a": "En développant une technologie de collaboration qui respecte la vie privée, nous espérons augmenter les attentes des utilisateurs en ce qui concerne les plateformes de services \"cloud\" et leur politique de confidentialité. Nous souhaitons que notre travail conduise les autres fournisseurs de services, quel que soit leur domaine, à égaler voire dépasser nos efforts.<br>Malgré notre optimisme, nous savons que la plupart du Web est financé par les publicités ciblées. Il y a encore beaucoup de travail à effectuer que l'on peut faire de nous-mêmes, et nous apprécions le support, la promotion et les contributions de notre communauté envers cet objectif."
},
"jobs": {
"q": "Est-ce que vous embauchez ?",
"a": "Oui ! Vous pouvez envoyer un email à <a href=\"mailto:jobs@xwiki.com\">jobs@xwiki.com</a>."
},
"host": {
"q": "Pouvez-vous m'aider à installer ma propre instance de CryptPad ?",
"a": "Nous serions heureux de fournir du support pour l'installation de CryptPad au sein de votre organisation. Veuillez contacter <a href=\"mailto:sales@cryptpad.fr\">sales@cryptpad.fr</a> pour plus d'informations."
},
"revenue": {
"q": "Comment participer au système de partage des revenus ?",
"a": "Si vous possédez votre propre instance de CryptPad et que vous souhaitez activer les comptes payant et partager les revenus avec les développeurs, votre serveur devra être configuré comme un service partenaire.<br>Dans votre répertoire CryptPad, le fichier <code>config.example.js</code> devrait contenir des explications concernant les étapes à suivre pour configurer votre serveur. Vous devrez aussi contacter <a href=\"mailto:sales@cryptpad.fr\">sales@cryptpad.fr</a> pour vérifier que votre serveur est configuré correctement et pour discuter des méthodes de paiement."
}
}
},
"features_f_support_note": "Réponse prioritaire de l'équipe d'administration par e-mail et système de tickets de support intégré",
"features_f_supporter": "Soutenez la défense de la vie privée",
"features_f_supporter_note": "Aidez CryptPad à être financièrement viable et montrer que les logiciels peuvent respecter la vie privée et être volontairement financés par les utilisateurs",
"features_f_subscribe": "S'abonner",
"features_f_subscribe_note": "Un compte enregistré est nécessaire pour s'abonner",
"tos_title": "Conditions d'utilisation de CryptPad",
"tos_legal": "Veuillez ne pas être malveillant, abusif, ou faire quoi que ce soit d'illégal.",
"tos_availability": "Nous espérons que vous trouvez ce service utile, mais nous ne pouvons garantir ses performances et disponibilités. Nous vous recommandons d'exporter vos données régulièrement.",
@ -837,7 +682,7 @@
"help": {
"title": "Pour bien démarrer",
"generic": {
"more": "Apprenez-en davantage sur le fonctionnement de CryptPad en lisant notre <a href=\"/faq.html\" target=\"_blank\">FAQ</a>.",
"more": "Découvrez toutes les fonctionalités de CryptPad en lisant la <a href=\"https://docs.cryptpad.fr\" target=\"_blank\" rel=\"noopener noreferrer\">Documentation</a>.",
"share": "Partagez ce document avec le bouton <i class=\"fa fa-shhare-alt\"></i> <b>Partager</b> et gérez les droits d'accès avec le bouton <i class=\"fa fa-unlock-alt\"></i> <b>Accès</b>.",
"save": "Tous les changements effectués sont enregistrés automatiquement"
},
@ -921,7 +766,7 @@
"creation_owned": "Être propriétaire de ce pad",
"creation_ownedTrue": "Être propriétaire",
"creation_ownedFalse": "Pas de propriétaire",
"creation_owned1": "Être <b>propriétaire</b> d'un pad signifie que vous pouvez le supprimer du serveur à tout moment. Une fois supprimé, il disparaît du CryptDrive des autres utilisateurs.",
"creation_owned1": "Être <b>propriétaire</b> d'un élément signifie que vous pouvez le détruire à tout moment. Une fois détruit, un élément devient inaccessible dans CryptDrive de tous les utilisateurs.",
"creation_owned2": "Un pad <b>sans propriétaire</b> ne peut pas être supprimé du serveur à moins d'avoir dépassé son éventuelle date d'expiration.",
"creation_expireTitle": "Durée de vie",
"creation_expire": "Ajouter une durée de vie",
@ -932,7 +777,7 @@
"creation_expireMonths": "Mois",
"creation_expire1": "Un pad <b>illimité</b> ne sera pas supprimé du serveur à moins que son propriétaire ne le décide.",
"creation_expire2": "Un pad <b>à durée de vie</b> sera supprimé automatiquement du serveur et du CryptDrive des utilisateurs lorsque cette durée sera dépassée.",
"creation_password": "Ajouter un mot de passe",
"creation_password": "Mot de passe\n",
"creation_noTemplate": "Pas de modèle",
"creation_newTemplate": "Nouveau modèle",
"creation_create": "Créer",
@ -1030,12 +875,12 @@
"admin_flushCacheButton": "Vider le cache",
"admin_flushCacheDone": "Opération réalisée avec succès",
"footer_product": "Produit",
"footer_team": "L'équipe",
"footer_team": "Contributeurs",
"footer_donate": "Faire un don",
"footer_legal": "Questions légales",
"footer_tos": "Conditions",
"footer_tos": "Conditions d'utilisation",
"contact_admin": "Contacter les administrateurs",
"contact_adminHint": "Pour tout problème lié à votre compte, votre limite de stockage ou la disponibilité du service.",
"contact_adminHint": "Pour toute question relative à votre compte, à la limite de stockage ou à la disponibilité du service.\n",
"contact_dev": "Contacter les développeurs",
"contact_devHint": "Pour les demandes de fonctionnalités, les améliorations d'ergonomie ou pour dire merci.",
"contact_bug": "Rapport de bug",
@ -1135,7 +980,7 @@
"pricing": "Tarification",
"homePage": "Page d'accueil",
"features_noData": "Aucune donnée personnelle requise",
"features_pricing": "Entre {0} et {2}€ par mois",
"features_pricing": "de {0} à {2}€ par mois",
"features_emailRequired": "Adresse email requise",
"register_emailWarning0": "Il semble que vous ayez entré votre adresse email à la place du nom d'utilisateur.",
"register_emailWarning1": "Vous pouvez continuer, mais ces données ne sont pas nécessaires et ne seront pas envoyées à notre serveur.",
@ -1496,5 +1341,41 @@
"admin_archiveTitle": "Archiver les documents",
"mediatag_loadButton": "Charger la pièce jointe",
"history_trimPrompt": "Ce document a accumulé {0} d'historique qui peut ralentir le temps de chargement. Envisagez de supprimer l'historique s'il n'est pas nécessaire.",
"contacts_confirmCancel": "Êtes-vous sûr de vouloir annuler votre demande de contact avec <b>{0}</b> ?"
"contacts_confirmCancel": "Êtes-vous sûr de vouloir annuler votre demande de contact avec <b>{0}</b> ?",
"share_noContactsOffline": "Vous êtes déconnecté. Les contacts ne sont pas disponibles.",
"access_offline": "Vous êtes déconnecté. La gestion de l'accès n'est pas disponible.",
"admin_support_last": "Mis à jour le : ",
"admin_support_collapse": "Réduire",
"admin_support_first": "Créé le : ",
"admin_support_open": "Montrer",
"admin_support_closed": "Tickets fermé :",
"admin_support_answered": "Tickets traité :",
"admin_support_normal": "Tickets sans réponse :",
"admin_support_premium": "Tickets premium :",
"offlineError": "Impossible de synchroniser les données les plus récentes, cette page ne peut pas être affichée pour le moment. Le chargement continuera au retour de votre connexion au service.",
"creation_helperText": "Ouvrir la documentation",
"creation_expiresIn": "Expirera dans",
"whatis_xwiki_info": "<p>CryptPad est fabriqué à <a rel=\"noopener noreferrer\" target=\"_blank\" href=\"https://xwiki.com\">XWiki</a>, une société basée à Paris, France, qui fabrique des logiciels open-source depuis plus de 15 ans. Nous avons une grande expérience dans la réalisation de logiciels collaboratifs pour organiser l'information. Notre histoire montre que nous sommes engagés dans le développement et la maintenance à long terme de CryptPad.</p>",
"whatis_xwiki": "Fabriqué à XWiki",
"whatis_model_info": "<p>Depuis 2016, CryptPad est soutenu par des bourses de recherche françaises et européennes telles que BPI France, NLNet Foundation, NGI Trust, Mozilla Open Source Support, ainsi que par des dons et des abonnements à cryptpad.fr. Nous pensons que l'argent public doit financer du code public, c'est pourquoi le service est entièrement open source. Cela signifie que tout le monde peut utiliser, héberger et modifier le logiciel.</p><p>CryptPad ne profite pas des données des utilisateurs. Cela fait partie d'une vision des services en ligne qui respectent la vie privée. Contrairement aux grandes plateformes qui prétendent être \"gratuites\" tout en tirant profit des informations personnelles, CryptPad vise à construire un modèle durable financé volontairement par les utilisateurs.</p><p>Nous offrons les fonctionnalités de CryptPad gratuitement parce que nous pensons que chacun a droit à la protection de sa vie privée, et pas seulement les personnes ayant un revenu suffisant. Si vous êtes en mesure de soutenir le projet, vous contribuerez aux nouvelles fonctionnalités, aux améliorations et à la maintenance qui profiteront à tous les utilisateurs.</p><p>Maintenant que la faisabilité du projet a été établie, le prochain objectif est de le rendre financièrement viable grâce au financement des utilisateurs. Si vous souhaitez soutenir CryptPad et contribuer à en faire une alternative durable aux grandes plateformes, veuillez envisager de faire un don unique ou récurrent.</p>",
"whatis_model": "Modèle économique",
"whatis_drive_info": "<p>Stockez et gérez les documents avec CryptDrive. Créez des dossiers, des dossiers partagés et des mots-clés pour organiser les documents. Téléchargez et partagez des fichiers (PDF, photos, vidéo, audio, etc.). Les drives d'équipe sont partagés entre les utilisateurs et permettent une organisation collaborative et un contrôle précis de l'accès.</p>",
"whatis_apps_info": "<p>CryptPad fournit une suite bureautique complète avec tous les outils nécessaires à une collaboration productive. Les applications comprennent : texte, feuilles de calcul, code/markdown, kanban, présentations, dessin et sondage.</p><p>Les applications sont complétées par un ensemble de fonctions de collaboration telles que le chat, les contacts, la couleur par auteur (code/markdown) et les commentaires avec mentions (texte).</p>",
"whatis_apps": "Une suite complète d'applications",
"whatis_collaboration_info": "<p>CryptPad est construit pour permettre la collaboration. Les modifications apportées aux documents sont synchronisées en temps réel. Comme toutes les données sont chiffrées, le service et ses administrateurs n'ont aucun moyen de voir le contenu en cours d'édition et de stockage.</p>",
"register_warning_note": "En raison de la nature chiffrée de CrytpPad, les administrateurs du service ne seront pas en mesure de récupérer les données au cas où vous oublieriez votre nom d'utilisateur et/ou votre mot de passe. Veuillez les sauvegarder dans un endroit sûr.",
"register_notes": "<ul class=\"cp-notes-list\"><li>Votre mot de passe est la clé secrète utilisée pour chiffrer tous vos documents. <span class=\"red\">Si vous le perdez, nous ne pourrons pas récupérer vos données.</span></li><li>Si vous utilisez un ordinateur partagé, <span class=\"red\">n'oubliez pas de vous déconnecter</span> après avoir terminé. La simple fermeture de la fenêtre du navigateur laisse votre compte exposé.</li><li>Pour conserver les documents que vous avez créés et/ou stockés sans être connecté, cochez \"Importer les documents de votre session anonyme\". </li></ul>",
"register_notes_title": "Notes importantes",
"home_support": "<p>L'équipe de développement ne tire aucun profit des données personnelles des utilisateurs. Cela s'inscrit dans une vision pour des services en ligne qui respectent la vie privée. Contrairement aux grandes plateformes qui prétendent être \"gratuites\" tout en tirant profit des informations personnelles, CryptPad vise à construire un modèle durable financé volontairement par les utilisateurs.</p><p>Vous pouvez soutenir le projet en faisant un don unique ou récurrent par le biais de notre Open Collective. Notre budget est transparent et des mises à jour sont publiées régulièrement. Il existe également un certain nombre de <a href=\"https://docs.cryptpad.fr/en/how_to_contribute.html\" rel=\"noopener noreferrer\" target=\"_blank\">moyens non financiers de contribuer</a>.</p>",
"home_support_title": "Soutenez CryptPad",
"home_opensource": "CryptPad est un logiciel libre. Il peut être installé par qui veut proposer ce service dans un cadre personnel ou professionnel. Le code source est disponible sur <a rel=\"noopener noreferrer\" target=\"_blank\" href=\"https://github.com/xwiki-labs/cryptpad\">Github</a>.",
"home_opensource_title": "Open Source",
"home_host_title": "À propos de cette instance",
"home_privacy_text": "CryptPad est conçu pour permettre la collaboration tout en préservant la confidentialité des données. Tout le contenu est chiffré et déchiffré par votre navigateur. Cela signifie que les documents, les chats et les fichiers sont illisibles en dehors de la session à laquelle vous êtes connecté. Même les administrateurs du service n'ont pas accès à vos informations.",
"home_privacy_title": "Protège votre vie privée",
"docs_link": "Documentation",
"settings_cacheButton": "Vider la mémoire cache",
"settings_cacheCheckbox": "Activer la mémoire cache sur cet appareil",
"settings_cacheHint": "CryptPad stocke des parties de vos documents dans la mémoire de votre navigateur afin d'économiser de la bande passante et d'améliorer les temps de chargement. Vous pouvez désactiver la mémoire cache si votre appareil a peu d'espace de stockage disponible. Pour des raisons de sécurité, la mémoire cache est toujours vidée lorsque vous vous déconnectez, mais vous pouvez la vider manuellement si vous souhaitez récupérer de l'espace de stockage sur votre appareil.",
"settings_cacheTitle": "Mémoire Cache"
}

View file

@ -501,7 +501,6 @@
"pad_base64": "Questo pad contiene immagini conservate in maniera inefficiente. Queste immagini aumenteranno significativamente le dimensioni del pad nel tuo CryptDrive, e lo renderanno più lento da caricare. Puoi convertire questi file in un nuovo formato che verrà conservato separatamente nel tuo CryptDrive. Vuoi convertire queste immagini ora?",
"mdToolbar_code": "Codice",
"home_host": "Questa è un'istanza di CryptPad gestita indipendentemente dalla community. Il suo codice sorgente è disponibile <a href=\"https://github.com/xwiki-labs/cryptpad\" target=\"_blank\" rel=\"noreferrer noopener\">su GitHub</a>.",
"whatis_drive_p3": "Puoi anche caricare file nel tuo CryptDrive e condividerli con i colleghi. I file caricati possono essere organizzati proprio come i pad collaborativi.",
"policy_choices_open": "Il nostro codice sorgente è open source, così hai sempre la possibilità di ospitare la tua personale istanza di CryptPad.",
"features_f_file0": "Apri i file",
"help": {
@ -558,147 +557,6 @@
"register_emailWarning2": "Non sarai in grado di resettare la tua password usando la tua email, a differenza di come puoi fare con molti altri servizi.",
"register_emailWarning3": "Se hai capito, ma intendi comunque usare la tua email come nome utente, clicca OK.",
"oo_sheetMigration_anonymousEditor": "Le modifiche da parte di utenti anonimi a questo foglio di calcolo sono disabilitate finché un utente registrato non lo aggiorna all'ultima versione.",
"faq": {
"usability": {
"devices": {
"a": "È probabile che tu abbia registrato lo stesso nome due volte, usando password diverse. Poiché il server di CryptPad ti identifica usando la tua firma crittografica e non il tuo nome, non può impedire ad altre persone di registrarsi con lo stesso nome. Questo significa che ogni account utente ha una combinazione univoca di nome utente e password. Gli utenti connessi possono vedere il loro nome utente nella parte superiore della pagina delle impostazioni.",
"q": "Sono connesso su due dispositivi e vedo due diversi CryptDrive, com'è possibile?"
},
"forget": {
"a": "Purtroppo, se fossimo in grado di aiutarti a recuperare l'accesso ai tuoi pad criptati, saremmo noi stessi in grado di accedere ai tuoi pad. Se non hai salvato il tuo nome utente e la password da nessuna parte e non riesci a ricordarli, potresti essere in grado di recuperare i tuoi pad controllando la cronologia del browser.",
"q": "Cosa succede se dimentico la mia password?"
},
"change": {
"a": "Puoi modificare la tua password di CryptPad nella tua pagina di impostazioni dell'account.",
"q": "E se voglio modificare la mia password?"
},
"register": {
"q": "Cosa ottengo registrandomi?",
"a": "Gli utenti registrati hanno accesso ad alcune funzionalità non disponibili a chi non è registrato. C'è uno schema <a href='/features.html' target='_blank'>qui</a>."
},
"title": "Usabilità",
"feature": {
"a": "Molte delle funzionalità in CryptPad esistono perché gli utenti le hanno richieste. La nostra <a href='https://cryptpad.fr/contact.html' target='_blank'>pagina di contatto</a> elenca i modi che puoi usare per raggiungerci.<br><br>Sfortunatamente, non possiamo garantire che aggiungeremo tutto quello che la gente chiede. Se una particolare funzionalità è essenziale per la tua organizzazione, puoi sponsorizzare il tempo di sviluppo per garantire il suo completamento. Contatta <a href='mailto:sales@cryptpad.fr' target='_blank'>sales@cryptpad.fr</a> per ulteriori informazioni.<br><br>Anche se non puoi permetterti di sponsorizzare lo sviluppo, siamo interessati ai feedback che possono aiutarci a migliorare CryptPad. Sentiti libero di contattarci tramite uno dei modi indicati in qualsiasi momento.",
"q": "Potete aggiungere una funzionalità particolare di cui ho bisogno?"
},
"folder": {
"a": "Si, puoi creare una <em>cartella condivisa</em> nel tuo CryptDrive e così condividere tutti i pad che contiene.",
"q": "Posso condividere intere cartelle dal mio CryptDrive?"
},
"remove": {
"a": "Solo i <em>pad di proprietà</em> (introdotti nel febbraio 2018) possono essere cancellati. In aggiunta, questi pad possono essere cancellati solo dal loro <em>proprietario</em> (la persona che inizialmente ha creato il pad). Se non sei il creatore del pad, dovrai chiedere al suo proprietario di cancellarlo. Per i pads di cui sei titolare, puoi <strong>cliccare con il tasto destro il pad nel tuo CryptDrive</strong>, e scegliere <strong>Cancella dal server</strong>.",
"q": "Ho rimosso un pad o un file dal mio CryptDrive, ma il contenuto è ancora disponibile. Come posso rimuoverlo?"
},
"share": {
"a": "CryptPad mette la chiave di crittografia segreta nel tuo pad dopo il carattere <em>#</em> nell'URL. Tutto quello che segue questo carattere non viene inviato al server, quindi non abbiamo accesso alla tua chiave di crittografia. Condividendo il link a un pad condividi anche la possibilità di accedervi e leggerlo.",
"q": "Come posso condividere i pad crittografati con i miei contatti?"
}
},
"security": {
"crypto": {
"a": "CryptPad è basato su due librerie open-source di crittografia: <a href='https://github.com/dchest/tweetnacl-js' target='_blank'>tweetnacl.js</a> e <a href='https://github.com/dchest/scrypt-async-js' target='_blank'>scrypt-async.js</a>.<br><br>Scrypt è un <em>algoritmo di derivazione delle chiavi basato su password</em>. Lo utilizziamo per trasformare i tuoi nome utente e password in una chiave unica che assicura l'accesso al tuo CryptDrive così che solo tu possa accedere ai tuoi pad.<br><br>Utilizziamo i cifrari <em>xsalsa20-poly1305</em> e <em>x25519-xsalsa20-poly1305</em> forniti da tweetnacl rispettivamente per criptare i pad e la cronologia della chat.",
"q": "Quale crittografia utilizzate?"
},
"pad_password": {
"q": "Cosa succede quando proteggo un pad/cartella con una password?",
"a": "Puoi proteggere qualsiasi pad o cartella condivisa con una password quando li crei. Puoi anche usare il menu Proprietà in qualsiasi momento per impostare/cambiare/rimuovere una password.<br><br>Le password dei pad e delle cartelle condivise sono finalizzate a proteggere i link quando li condividi su canali potenzialmente non sicuri come la mail o i messaggi di testo. Se qualcuno intercettasse il tuo link ma non disponesse della password non sarebbe comunque in grado di leggere il tuo documento.<br><br>Quando condividi all'interno di CryptPad con i tuoi contatti o il tuo gruppo, le comunicazioni sono crittografate e noi presumiamo che tu voglia che questi accedano al tuo documento. Pertanto la password è memorizzata ed inviata con il documento quando lo condividi. Al destinatario, o a te, <b>non</b> verrà richiesta quando si apre il documento."
},
"compromised": {
"q": "CryptPad mi protegge se il mio dispositivo è compromesso?",
"a": "Nel caso in cui un tuo dispositivo sia stato rubato, CryptPad ti permette di avviare la disconnessione forzata da remoto di tutti i dispositivi escluso quello che stai utilizzando. Per farlo, vai sulla tua <strong>pagina delle impostazioni</strong> e clicca <strong>Disconnetti ovunque</strong>. Tutti gli altri dispositivi che sono attualmente connessi al tuo account saranno disconnessi. Tutti i dispositivi che si sono connessi in precedenza al tuo CryptPad saranno disconnessi appena si collegheranno alla pagina.<br><br>Attualmente, la <em>disconnessione da remoto</em> è implemetata nel browser, non in connessione con il server. Quindi non può proteggerti da agenzie governative, ma può essere sufficiente se dimentichi di disconnetterti dopo aver usato CryptPad su un computer condiviso."
},
"why": {
"q": "Perché dovrei usare CryptPad?",
"a": "La nostra opinione è che i servizi cloud non debbano richiedere accesso ai tuoi dati perché tu possa condividerli con amici e colleghi. Se stai usando un altro servizio per collaborare e questo non dichiara esplicitamente che non può accedere ai tuoi dati, è verosimile che li stia gestendo per profitto."
},
"title": "Sicurezza",
"proof": {
"q": "Come utilizzate le Zero Knowledge Proofs?",
"a": "Quando utilizziamo l'espressione <em>Zero Knowledge</em>, non intendiamo <em>Zero Knowledge proofs</em>, ma <em>Zero Knowledge Web Services</em>. <em>Zero Knowledge Web Services</em> cripta i dati utente nel browser dell'utente, senza che il server abbia accesso a dati in chiaro, o alle chiavi di cifratura.<br><br>Abbiamo compilato una breve lista di servizi Zero Knowledge <a href='https://blog.cryptpad.fr/2017/02/20/Time-to-Encrypt-the-Cloud/#Other-Zero-Knowledge-Services'>qui</a>."
}
},
"privacy": {
"register": {
"a": "Non richiediamo agli utenti la verifica del loro indirizzo email, e il server non registra il vostro nome utente o la password quando vi registrate. Invece il modulo di registrazione e quello di accesso generano una chiave univoca basata su ciò che scrivete, ed il server registra esclusivamente la vostra firma crittografata. Utilizziamo questa informazione per tenere traccia dei dettagli su quanto spazio utilizzate, cosa che ci permette di restringere ciascun utente ad una specifica quota.<br><br>Utilizziamo la nostra funzionalità di <em>feedback</em> per registrare sul server che qualcuno con il vostro indirizzo IP ha registrato un account. Utilizziamo questo dato per conteggiare quante persone abbiano attivato un account CryptPad, e vedere da quale area geografica provengano in modo da capire quali lingue richiedano maggiore impegno.<br><br>Gli utenti registrati sono associati nel server ai loro pad nel loro CryptDrive in modo tale che questi non vengano considerati abbandonati e rimossi dal server in seguito a mancata attività.",
"q": "Il server avrà maggiori informazioni su di me se mi registro?"
},
"policy": {
"a": "Sì! È disponibile <a href='/privacy.html' target='_blank'>qui</a>.",
"q": "Avete una politica per la privacy dei dati?"
},
"title": "Privacy",
"anonymous": {
"q": "CryptPad mi rende anonimo?",
"a": "Sebbene CryptPad sia progettato per raccogliere il minor numero di informazioni possibili, non garantisce il totale anonimato. I nostri server hanno accesso al tuo indirizzo IP, anche se puoi nascondere questa informazione utilizzando Tor per accedere a CryptPad. Utilizzare Tor senza cambiare il tuo comportamento non garantirà l'anonimato, visto che il server riconosce l'utente anche dalla sua firma crittografata. Se utilizzi lo stesso account quando usi Tor e quando non lo usi, è possibile collegare la sessione con IP a quella senza.<br><br>Per utenti che richiedano un livello di privacy meno ferreo basti sapere che CryptPad non richiede all'utente di identificarsi con nome, numero di telefono o indirizzo email come la maggior parte degli altri servizi."
},
"other": {
"q": "Cosa possono conoscere di me gli altri collaboratori?",
"a": "Quando modifichi su un pad insieme ad altri comunichi attraverso il server, così conosciamo il tuo indirizzo IP. Gli altri utenti possono vedere il tuo nome utente, l'avatar, un link al tuo profilo (se ne hai uno), e la tua <em>chiave pubblica</em> (che è utilizzata per criptare le informazioni dall'uno all'altro)."
},
"me": {
"q": "Che informazioni ha il server su di me?",
"a": "Gli amministratori del server sono in grado di vedere gli indirizzi IP degli utenti che accedono a CryptPad. Non registriamo quali siano i pad visitati da un indirizzo IP, ma potremmo, sebbene senza la possibilità di leggere il contenuto dei pad criptati. Se ti preoccupa il fatto che noi possiamo analizzare queste informazioni, è più sicuro che tu presuma che noi lo facciamo, dato che non possiamo dimostrarti il contrario.<br><br>Raccogliamo alcune misurazioni di base su come le persone usano CryptPad, come la risoluzione dello schermo o quali pulsanti usino più frequentemente. Questo ci aiuta a migliorare il software, ma se preferisci non inviare queste informazioni al server, puoi <strong>cessare l'invio togliendo la spunta alla casella di controllo <em>Abilita il feedback utente</em></strong>.<br><br>Teniamo traccia di quali pad sono nel CryptDrive di ciascun utente così da poter definire limiti all'uso di spazio, ma non conosciamo il contenuto o il tipo di questi pad. Lo spazio di archiviazione è collegato alle chiavi pubbliche degli utenti, ma non associamo nomi o indirizzi email a queste chiavi pubbliche.<br><br>Per maggiori informazioni puoi leggere questo <a href='https://blog.cryptpad.fr/2017/07/07/cryptpad-analytics-what-we-cant-know-what-we-must-know-what-we-want-to-know/' target='_blank'>articolo nel blog</a> che abbiamo scritto sull'argomento."
},
"different": {
"q": "In cosa è diverso CryptPad dagli altri servizi Pad?",
"a": "CryptPad cripta i cambiamenti ai tuoi documenti prima di inviare queste informazioni al server per l'archiviazione, quindi noi non possiamo leggere ciò che tu scrivi."
}
},
"other": {
"jobs": {
"a": "Sì! Candidati inviando un'email a <a href='mailto:jobs@xwiki.com' target='_blank'>jobs@xwiki.com</a>.",
"q": "State assumendo?"
},
"goal": {
"q": "Qual è il vostro obiettivo?",
"a": "Sviluppando una tecnologia rispettosa della privacy, vogliamo anche incrementare le aspettative degli utenti relativamente al rapporto tra privacy e cloud computing. Speriamo che il nostro lavoro spinga altri fornitori di servizi in tutti gli ambiti ad eguagliare il nostro sforzo o superarlo. Nonostante il nostro ottimismo, sappiamo che la gran parte del web basa il suo gettito sulla pubblicità targettizzata. C'è molto più lavoro da fare di quanto possiamo pensare di gestire noi stessi, e dunque apprezziamo l'incoraggiamento, il sostegno ed il contributo della nostra community per il raggiungimento di questo obiettivo."
},
"pay": {
"q": "Perché dovrei pagare quando così tante funzionalità sono gratuite?",
"a": "Diamo ai supporter spazio di archiviazione aggiuntivo e la possibilità di incrementare la loro quota di contatti (<a href='https://accounts.cryptpad.fr/#/faq' target='_blank'>approfondisci</a>).<br><br>Oltre a questi benefici a breve termine, sottoscrivendo un account premium aiuti a finanziare in maniera continuativa lo sviluppo attivo di CryptPad. Questo include l'eliminazione di bug, l'aggiunta di nuove funzionalità e semplificare per altri l'installazione di CryptPad. Inoltre, aiuti a mostrare agli altri fornitori di servizi che le persone sono disposte a supportare le tecnologie per il miglioramento della privacy. Noi speriamo che i modelli di business basati sulla vendita dei dati degli utenti diventeranno cosa del passato.<br><br>Infine, offriamo la maggior parte delle funzionalità di CryptPad gratuitamente perché crediamo che chiunque meriti la privacy, non solo chi può permettersela. Supportandoci, ci aiuti a continuare a rendere possibile alla popolazione con meno privilegi di accedere a funzionalità fondamentali senza un cartellino del prezzo attaccato."
},
"title": "Altre domande",
"revenue": {
"a": "Se hai implementato la tua personale istanza di CryptPad, e vuoi abilitare gli account a pagamento e dividere i ricavi con la community degli sviluppatori, il tuo server dovrà essere configurato come partner service.<br><br>Nella directory del tuo CryptPad, il file <em>config.example.js</em> dovrebbe contenere una spiegazione di cosa devi configurare sul tuo server. Avrai anche bisogno di contattare <a href='mailto:sales@cryptpad.fr'>sales@cryptpad.fr</a> per verificare che il tuo server sia configurato per usare correttamente HTTPS e per concordare i metodi di pagamento.",
"q": "Come posso partecipare alla condivisione dei profitti?"
},
"host": {
"a": "Saremo lieti di fornire supporto per un'installazione di CryptPad interna alla tua organizzazione. Contatta <a href='mailto:sales@cryptpad.fr' target='_blank'>sales@cryptpad.fr</a> per maggiori informazioni.",
"q": "Potete aiutarmi a configurare la mia istanza di CryptPad?"
}
},
"keywords": {
"tag": {
"q": "Come utilizzo i tag?",
"a": "Puoi taggare i pad e i file caricati con il tuo CryptDrive, oppure utilizzando il pulsante <em>tag</em> (<span class='fa fa-hashtag'></span>) nella barra degli strumenti di qualsiasi editor. Cerca i pad ed i file nel tuo CryptDrive utilizzando la barra di ricerca con una parola preceduta da un cancelletto, ad esempio <em>#crypto</em>."
},
"pad": {
"q": "Cos'è un pad?",
"a": "<em>Pad</em> è un termine reso popolare da <a href='http://etherpad.org/' target='_blank'>Etherpad</a>, un editor collaborativo in tempo reale.\nSi riferisce ad un documento che puoi modificare nel tuo browser, generalmente con le modifiche di altri utenti visibili in modo quasi istantaneo."
},
"expiring": {
"q": "Cos'è un pad effimero?",
"a": "Un <em>pad effimero</em> è un pad creato con una scadenza, raggiunta la quale il pad verrà automaticamente cancellato dal server. I pad effimeri possono essere configurati per durare da un minimo di un'ora ad un massimo di 100 mesi. Il pad e tutta la sua cronologia diventeranno permanentemente non disponibili anche se vengono modificati nel momento in cui scadono.<br><br>Se un pad è impostato con una scadenza, puoi controllare il suo tempo di durata sia visualizzando le sue <em>proprietà</em>, sia facendo clic con il tasto destro del mouse sul pad nel tuo CryptDrive, sia usando il sottomenu <em>proprietà</em> dalla barra degli strumenti di un'applicazione."
},
"owned": {
"a": "Un <em>pad di proprietà</em> è un pad creato da un preciso <em>proprietario</em>, identificato dal server dalla sua <em>chiave di crittografia pubblica</em>. Il proprietario di un pad può scegliere di eliminare i suoi pad dal server, rendendoli non disponibili per gli altri collaboratori in futuro, che li avessero oppure no nei loro Cryptdrive.",
"q": "Cos'è un pad di proprietà?"
},
"title": "Parole chiave",
"abandoned": {
"q": "Cos'è un pad abbandonato?",
"a": "Un <em>pad abbandonato</em> è un pad che non è collegato al CryptDrive di nessun utente registrato e non è stato modificato da sei mesi. I documenti abbandonati vengono rimossi automaticamente dal server."
},
"template": {
"q": "Cos'è un modello?",
"a": "Un modello è un pad che può essere usato per definire il contenuto iniziale per un altro pad dello stesso tipo quando lo crei. Qualsiasi pad esistente può essere trasformato in un modello spostandolo nella sezione <em>Modelli</em> del tuo CryptDrive. Puoi anche creare una copia di un pad da utilizzare come modello cliccando il pulsante template (<span class='fa fa-bookmark'></span>) nella barra degli strumenti dell'editor."
}
}
},
"whatis_zeroknowledge_p2": "Quando ti registri e accedi, il tuo nome utente e la tua password vengono computati in una chiave segreta utilizzando la <a href=\"https://en.wikipedia.org/wiki/Scrypt\">funzione di derivazione scrypt</a>. Né questa chiave, né il tuo nome utente o la tua password vengono inviati al server. Infatti sono usati soltanto dal lato client per decriptare il contenuto del tuo CryptDrive, che contiene le chiavi per tutti i pad a cui hai accesso.",
"faq_title": "Domande frequenti",
"whatis_business": "CryptPad per le aziende",
"whatis_drive_p2": "Con l'intuitiva funzione trascina e rilascia puoi spostare i tuoi pad all'interno del tuo CryptDrive e il collegamento a questi ultimi rimarrà lo stesso, in modo che le persone con le quali collabori non perdano mai l'accesso.",
"policy_howweuse": "Come usiamo i dati che raccogliamo",
"policy_whatweknow": "Cosa sappiamo di te",
"policy_title": "Informativa sulla privacy di CryptPad",
@ -710,8 +568,6 @@
"policy_whatwetell_p1": "Non forniamo a terzi le informazioni che raccogliamo o che ci fornite, a meno che non siamo legalmente obbligati a farlo.",
"policy_whatwetell": "Cosa comunichiamo a terzi riguardo a te",
"policy_howweuse_p2": "Le informazioni relative al tuo browser (sia che si tratti di un sistema operativo desktop che di uno mobile) ci aiutano a prendere decisioni quando si tratta di dare priorità ai miglioramenti delle funzionalità. Il nostro gruppo di sviluppo è piccolo e cerchiamo di fare scelte che migliorino l'esperienza del maggior numero di utenti possibile.",
"faq_whatis": "Cos'è <span class='cp-brand-font'>CryptPad</span>?",
"faq_link": "FAQ",
"features_f_support": "Supporto più rapido",
"features_f_register": "Registrati gratuitamente",
"features_f_file1_note": "Condividi file con i tuoi contatti o incorporali nei tuoi pad",
@ -775,7 +631,6 @@
"settings_logoutEverywhereTitle": "Chiudi le sessioni remote",
"settings_logoutEverywhereButton": "Esci",
"settings_importDone": "Importazione completata",
"register_explanation": "<h3>Puntualizziamo un paio di cose:</h3><ul class='list-unstyled'><li><i class='fa fa-info-circle'> </i> La tua password è la chiave segreta di tutti i tuoi pad. Se la perdi non c'è alcun modo di recuperare i tuoi dati.</li><li><i class='fa fa-info-circle'> </i> Puoi importare i pad recenti di questo browser per averli nel tuo account.</li><li><i class='fa fa-info-circle'> </i> Se usi un computer condiviso, devi uscire quando hai finito, non è sufficiente chiudere la scheda.</li></ul>",
"features_f_subscribe_note": "Devi prima accedere a CryptPad",
"features_f_subscribe": "Abbonati alla versione Premium",
"features_f_supporter_note": "Aiutaci a dimostrare che i software che proteggono la privacy devono essere la norma",
@ -785,7 +640,6 @@
"features_f_storage2": "Spazio d'archiviazione supplementare",
"features_f_reg_note": "Ed aiutare lo sviluppo di CryptPad",
"features_f_reg": "Tutte le funzionalità degli utenti registrati",
"features_f_register_note": "Nessuna email o informazione personale richieste",
"features_f_storage1_note": "I pad conservati nel tuo CryptDrive non saranno mai eliminati per inattività",
"features_f_storage1": "Archivio permanente (50MB)",
"features_f_social_note": "Crea un profilo, usa un avatar, chatta con i contatti",
@ -806,21 +660,12 @@
"policy_choices_vpn": "Se vuoi utilizzare la nostra istanza ma non vuoi esporre il tuo indirizzo IP puoi proteggerlo usando il <a href=\"https://www.torproject.org/projects/torbrowser.html.en\" title=\"downloads from the Tor project\" target=\"_blank\" rel=\"noopener noreferrer\">browser Tor</a>, oppure una <a href=\"https://riseup.net/en/vpn\" title=\"VPNs provided by Riseup\" target=\"_blank\" rel=\"noopener noreferrer\">VPN</a>.",
"policy_whatweknow_p2": "Utilizziamo <a href=\"https://www.elastic.co/products/kibana\" target=\"_blank\" rel=\"noopener noreferrer\" title=\"open source analytics platform\">Kibana</a>, una piattaforma di analisi open source, per conoscere meglio i nostri utenti. Kibana ci dice come hai trovato CryptPad, entrando direttamente, attraverso un motore di ricerca o provenendo da un altro sito web come Reddit o Twitter.",
"policy_whatweknow_p1": "Come applicazione ospitata sul web, CryptPad ha accesso ai metadati esposti dal protocollo HTTP. Questo include il tuo indirizzo IP e altre intestazioni HTTP che possono essere usati per identificare il tuo browser. Puoi vedere quali informazioni condivide il tuo browser visitando <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.whatismybrowser.com/detect/what-http-headers-is-my-browser-sending\" title=\"what http headers is my browser sending\">WhatIsMyBrowser.com</a>.",
"whatis_business_p2": "CryptPad può essere installato liberamente e gli <a href=\"https://cryptpad.fr/about.html\">sviluppatori CryptPad</a> di XWiki SAS possono offrire supporto commerciale, personalizzazione e sviluppo. Contattaci all'indirizzo <a href=\"mailto:sales@cryptpad.fr\">sales@cryptpad.fr</a> per maggiori informazioni.",
"whatis_business_p1": "La crittografia Zero Knowledge di CryptPad moltiplica l'efficacia dei protocolli di sicurezza esistenti ricreandoli in maniera crittografica. Dato che i dati sensibili possono essere decriptati solo utilizzando le credenziali di accesso dell'utente, CryptPad è meno preso di mira dei servizi cloud tradizionali. Consulta il <a href='https://blog.cryptpad.fr/images/CryptPad-Whitepaper-v1.0.pdf'>CryptPad Whitepaper</a> per sapere come questo possa aiutare la tua impresa.",
"whatis_drive_p1": "Quando accedi a un pad in CryptPad il pad è automaticamente aggiunto al tuo CryptDrive nella cartella principale. In seguito potrai organizzare questi pad in cartelle o cestinarli. CryptPad ti permette di fare una ricerca tra i tuoi pad e di organizzarli quando e come vuoi.",
"whatis_zeroknowledge": "Zero Knowledge",
"whatis_zeroknowledge_p3": "Quando condividi il link di un documento, stai condividendo la chiave crittografica per accedere a quel documento, ma dato che la chiave è nell'<a href=\"https://en.wikipedia.org/wiki/Fragment_identifier\">identificatore di frammenti</a>, non è mai inviata direttamente al server. Consulta il nostro <a href=\"https://blog.cryptpad.fr/2017/07/07/cryptpad-analytics-what-we-cant-know-what-we-must-know-what-we-want-to-know/\"> post nel blog sulla privacy</a> per capire a quali tipi di metadati abbiamo accesso e a quali no.",
"features_f_core": "Funzioni comuni delle applicazioni",
"features_f_apps": "Accesso alle applicazioni principali",
"features_feature": "Funzionalità",
"features": "Funzionalità",
"policy_choices": "Le tue scelte",
"whatis_drive": "Organizzazione con CryptDrive",
"whatis_zeroknowledge_p1": "Non vogliamo sapere cosa stai scrivendo e, grazie alla moderna crittografia, puoi essere certo che non possiamo farlo. CryptPad utilizza <strong>crittografia 100% lato client</strong>per proteggere il contenuto che stai scrivendo da noi, che ospitiamo il server.",
"whatis_collaboration_p3": "Puoi creare dei documenti di testo con <a href=\"http://ckeditor.com/\">CKEditor</a> così come documenti Markdown in tempo reale mentre scrivi. Puoi anche usare l'applicazione di sondaggio per pianificare eventi con più partecipanti.",
"whatis_collaboration_p2": "Puoi condividere l'accesso ad un documento CryptPad semplicemente condividendo il link. Puoi anche condividere un link che fornisce un accesso <em>di sola lettura</em> al pad, permettendoti di pubblicare i tuoi lavori collaborativi potendo ancora modificarli.",
"whatis_collaboration_p1": "Con CryptPad, puoi creare velocemente documenti collaborativi per prendere appunti e scrivere idee insieme. Quando ti registri e accedi ottieni la possibilità di caricare file in un CryptDrive dove puoi organizzare tutti i tuoi pad. Come utente registrato hai 50 MB di spazio gratuito.",
"whatis_collaboration": "Collaborazione veloce, facile",
"terms": "Condizioni del servizio",
"main_footerText": "Con CryptPad, puoi creare velocemente documenti collaborativi per prendere appunti e scrivere idee insieme.",

View file

@ -141,8 +141,6 @@
"tos_title": "CryptPad サービス利用規約",
"whatis_title": "CryptPad とは何か",
"topbar_whatIsCryptpad": "CryptPad とは何か",
"faq_title": "よくある質問",
"faq_link": "よくある質問",
"footer_tos": "利用規約",
"footer_donate": "寄付",
"footer_legal": "法的情報",
@ -333,7 +331,6 @@
"features_f_reg": "登録ユーザーの全機能",
"homePage": "ホームページ",
"features_noData": "登録に個人情報は必要ありません",
"features_f_register_note": "登録にメールアドレスや個人情報は必要ありません",
"features_f_register": "無料登録",
"features_f_storage1_note": "CryptDrive に保存されたパッドが有効期限切れで削除されることはありません",
"features_f_storage1": "永続的ストレージ (50MB)",

View file

@ -422,18 +422,17 @@
"login_invalUser": "Username required",
"login_invalPass": "Password required",
"login_unhandledError": "An unexpected error occurred :(",
"register_importRecent": "Import pads from your anonymous session",
"register_importRecent": "Import documents from your unregistered session",
"register_acceptTerms": "I accept <a href='/terms.html' tabindex='-1'>the terms of service</a>",
"register_passwordsDontMatch": "Passwords do not match!",
"register_passwordTooShort": "Passwords must be at least {0} characters long.",
"register_mustAcceptTerms": "You must accept the terms of service.",
"register_mustRememberPass": "We cannot reset your password if you forget it. It's very important that you remember it! Please check the checkbox to confirm.",
"register_whyRegister": "Why sign up?",
"register_header": "Welcome to CryptPad",
"register_explanation": "<h3>Lets go over a couple things first:</h3><ul class='list-unstyled'><li><i class='fa fa-info-circle'> </i> Your password is your secret key which encrypts all of your pads. If you lose it there is no way we can recover your data.</li><li><i class='fa fa-info-circle'> </i> You can import pads which were recently viewed in your browser so you have them in your account.</li><li><i class='fa fa-info-circle'> </i> If you are using a shared computer, you need to log out when you are done, closing the tab is not enough.</li></ul>",
"register_header": "Register",
"register_writtenPassword": "I have written down my username and password, proceed",
"register_cancel": "Go back",
"register_warning": "Zero Knowledge means that we can't recover your data if you lose your password.",
"register_cancel": "Cancel",
"register_warning": "<i class='fa fa-warning'></i> Warning",
"register_alreadyRegistered": "This user already exists, do you want to log in?",
"register_emailWarning0": "It looks like you submitted your email as your username.",
"register_emailWarning1": "You can do that if you want, but it won't be sent to our server.",
@ -611,40 +610,27 @@
"mdToolbar_code": "Code",
"mdToolbar_toc": "Table of Contents",
"home_product": "CryptPad is a private-by-design alternative to popular office tools and cloud services. All the content stored on CryptPad is encrypted before being sent, which means nobody can access your data unless you give them the keys (not even us).",
"home_host": "This is an independent community instance of CryptPad. Its source code is available <a href=\"https://github.com/xwiki-labs/cryptpad\" target=\"_blank\" rel=\"noreferrer noopener\">on GitHub</a>.",
"home_host": "This is an independent community instance of CryptPad.",
"home_host_agpl": "CryptPad is distributed under the terms of the AGPL3 software license",
"home_ngi": "NGI Award winner",
"about_intro": "CryptPad is created inside of the Research Team at <a href=\"http://xwiki.com\">XWiki SAS</a>, a small business located in Paris France and Iasi Romania. There are 3 core team members working on CryptPad plus a number of contributors both inside and outside of XWiki SAS.",
"about_core": "Core Developers",
"about_contributors": "Key Contributors",
"main_info": "<h2>Collaborate in Confidence</h2> Grow your ideas together with shared documents while <strong>Zero Knowledge</strong> technology secures your privacy; <strong>even from us</strong>.",
"main_catch_phrase": "The Zero Knowledge Cloud",
"main_catch_phrase": "Collaboration suite,<br>encrypted and open-source",
"main_footerText": "With CryptPad, you can make quick collaborative documents for taking notes and writing down ideas together.",
"footer_applications": "Applications",
"footer_contact": "Contact",
"footer_aboutUs": "About us",
"about": "About",
"privacy": "Privacy",
"privacy": "Privacy Policy",
"contact": "Contact",
"terms": "ToS",
"blog": "Blog",
"topbar_whatIsCryptpad": "What is CryptPad",
"whatis_title": "What is CryptPad",
"whatis_collaboration": "Fast, Easy Collaboration",
"whatis_collaboration_p1": "With CryptPad, you can make quick collaborative documents for taking notes and writing down ideas together. When you sign up and log in, you get file upload capability and a CryptDrive where you can organize all of your pads. As a registered user you get 50MB of space for free.",
"whatis_collaboration_p2": "You can share access to a CryptPad document simply by sharing the link. You can also share a link which provides <em>read only</em> access to a pad, allowing you to publicise your collaborative work while still being able to edit it.",
"whatis_collaboration_p3": "You can make simple rich text documents with <a href=\"http://ckeditor.com/\">CKEditor</a> as well as Markdown documents which are rendered in realtime while you type. You can also use the poll app for scheduling events with multiple participants.",
"whatis_zeroknowledge": "Zero Knowledge",
"whatis_zeroknowledge_p1": "We don't want to know what you're typing and with modern cryptography, you can be sure that we can't know. CryptPad uses <strong>100% client side encryption</strong> to protect the content that you type from us, the people who host the server.",
"whatis_zeroknowledge_p2": "When you sign up and log in, your username and password are computed into a secret key using <a href=\"https://en.wikipedia.org/wiki/Scrypt\">scrypt key derivation function</a>. Neither this key, nor the username and password are ever sent to the server. Instead they are used on the client side to decrypt the content of your CryptDrive, which contains the keys to all pads that you are able to access.",
"whatis_zeroknowledge_p3": "When you share the link to a document, you're sharing the cryptographic key for accessing that document but since the key is in the <a href=\"https://en.wikipedia.org/wiki/Fragment_identifier\">fragment identifier</a>, it is never directly sent to the server. Check out our <a href=\"https://blog.cryptpad.fr/2017/07/07/cryptpad-analytics-what-we-cant-know-what-we-must-know-what-we-want-to-know/\">privacy blog post</a> to learn more about what types of metadata we do and do not have access to.",
"whatis_title": "What is CryptPad?",
"whatis_collaboration": "Private Collaboration",
"whatis_drive": "Organization with CryptDrive",
"whatis_drive_p1": "Whenever you access a pad in CryptPad, the pad is automatically added to your CryptDrive in the main folder. Later on, you can organize these pads into folders or you can put them in the trash bin. CryptDrive allows you to search through your pads and to organize them whenever you want, however you want.",
"whatis_drive_p2": "With intuitive drag-and-drop, you can move pads around in your drive and the link to these pads will stay the same so your collaborators will never lose access.",
"whatis_drive_p3": "You can also upload files in your CryptDrive and share them with colleagues. Uploaded files can be organized just like collaborative pads.",
"whatis_business": "CryptPad for Business",
"whatis_business_p1": "CryptPad's Zero Knowledge encryption multiplies the effectiveness of existing security protocols by mirroring organizational access controls in cryptography. Because sensitive assets can only be decrypted using user access credentials, CryptPad is less valuable as a target when compared to traditional cloud services. Read the <a href='https://blog.cryptpad.fr/images/CryptPad-Whitepaper-v1.0.pdf'>CryptPad Whitepaper</a> to learn more about how it can help your business.",
"whatis_business_p2": "CryptPad is deployable on premises and the <a href=\"https://cryptpad.fr/about.html\">CryptPad developers</a> at XWiki SAS are able to offer commercial support, customization and development. Reach out to <a href=\"mailto:sales@cryptpad.fr\">sales@cryptpad.fr</a> for more information.",
"policy_title": "CryptPad Privacy Policy",
"policy_whatweknow": "What we know about you",
"policy_whatweknow_p1": "As an application that is hosted on the web, CryptPad has access to metadata exposed by the HTTP protocol. This includes your IP address, and various other HTTP headers that can be used to identify your particular browser. You can see what information your browser is sharing by visiting <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.whatismybrowser.com/detect/what-http-headers-is-my-browser-sending\" title=\"what http headers is my browser sending\">WhatIsMyBrowser.com</a>.",
@ -663,185 +649,44 @@
"policy_choices_vpn": "If you want to use our hosted instance, but don't want to expose your IP address, you can protect your IP using the <a href=\"https://www.torproject.org/projects/torbrowser.html.en\" title=\"downloads from the Tor project\" target=\"_blank\" rel=\"noopener noreferrer\">Tor browser bundle</a>, or a <a href=\"https://riseup.net/en/vpn\" title=\"VPNs provided by Riseup\" target=\"_blank\" rel=\"noopener noreferrer\">VPN</a>.",
"policy_choices_ads": "If you just want to block our analytics platform, you can use adblocking tools like <a href=\"https://www.eff.org/privacybadger\" title=\"download privacy badger\" target=\"_blank\" rel=\"noopener noreferrer\">Privacy Badger</a>.",
"features": "Features",
"features_title": "Feature comparison",
"features_title": "Features",
"features_feature": "Feature",
"features_anon": "Anonymous user",
"features_registered": "Registered user",
"features_premium": "Premium user",
"features_anon": "Non-registered",
"features_registered": "Registered",
"features_premium": "Premium",
"features_notes": "Notes",
"features_f_apps": "Access to the main applications",
"features_f_core": "Common features for the applications",
"features_f_apps": "Access to all the applications",
"features_f_core": "Common features",
"features_f_core_note": "Edit, Import & Export, History, Userlist, Chat",
"features_f_file0": "Open files",
"features_f_file0_note": "View and download files shared by other users",
"features_f_file0": "Open documents",
"features_f_file0_note": "View and download documents shared by other users",
"features_f_cryptdrive0": "Limited access to CryptDrive",
"features_f_cryptdrive0_note": "Ability to store visited pads in your browser to be able to open them later",
"features_f_storage0": "Limited storage time",
"features_f_storage0_note": "Created pads risk deletion after 3 months of inactivity",
"features_f_storage0_note": "Documents are deleted after {0} days of inactivity",
"features_f_anon": "All anonymous user features",
"features_f_anon_note": "With better usability and more power over your pads",
"features_f_anon_note": "With additional functionality",
"features_f_cryptdrive1": "Complete CryptDrive functionality",
"features_f_cryptdrive1_note": "Folders, shared folders, templates, tags",
"features_f_devices": "Your pads on all your devices",
"features_f_devices_note": "Access your CryptDrive everywhere with your user account",
"features_f_social": "Social applications",
"features_f_social_note": "Create a profile, use an avatar, chat with contacts",
"features_f_social": "Social features",
"features_f_social_note": "Add contacts for secure collaboration, create a profile, fine-grained access controls",
"features_f_file1": "Upload and share files",
"features_f_file1_note": "Share files with your contacts or embed them in your pads",
"features_f_storage1": "Permanent storage (50MB)",
"features_f_storage1_note": "Pads stored in your CryptDrive are never deleted for inactivity",
"features_f_file1_note": "Store files in your CryptDrive: images, PDFs, videos, and more. Share them with your contacts or embed them in your documents. (up to {0}MB)",
"features_f_storage1": "Personal storage ({0})",
"features_f_storage1_note": "Documents stored in your CryptDrive are not deleted for inactivity",
"features_f_register": "Register for free",
"features_f_register_note": "No email or personal information required",
"features_f_reg": "All registered user features",
"features_f_reg_note": "And help CryptPad's development",
"features_f_reg_note": "With additional benefits",
"features_f_storage2": "Extra storage space",
"features_f_storage2_note": "From 5GB to 50GB depending on the selected plan",
"features_f_storage2_note": "From 5GB to 50GB depending on the plan, increased limit of {0}MB for file uploads",
"features_f_support": "Faster support",
"features_f_support_note": "Professional email support with the Team plan",
"features_f_supporter": "Become a privacy supporter",
"features_f_supporter_note": "Help us show that privacy-enhancing software should be the norm",
"features_f_subscribe": "Subscribe to premium",
"features_f_subscribe_note": "You need to be logged in to CryptPad first",
"faq_link": "FAQ",
"faq_title": "Frequently Asked Questions",
"faq_whatis": "What is <span class='cp-brand-font'>CryptPad</span>?",
"faq": {
"keywords": {
"title": "Keywords",
"pad": {
"q": "What is a pad?",
"a": "<em>Pad</em> is a term popularized by <a href='http://etherpad.org/' target='_blank'>Etherpad</a>, a real-time collaborative editor.\nIt refers to a document that you can edit in your browser, generally with other people's changes visible nearly instantly."
},
"owned": {
"q": "What is an owned Pad?",
"a": "An <em>owned pad</em> is a pad created with an explicit <em>owner</em>, identified to the server by their <em>public signing key</em>. A pad's owner may choose to delete their pads from the server, making it unavailable to other collaborators in the future, whether they had it in their CryptDrive or not."
},
"expiring": {
"q": "What is an expiring Pad?",
"a": "An <em>expiring pad</em> is a pad created with a set time at which it will be automatically removed from the server. Expiring pads can be configured to last anywhere from one hour to one hundred months. The pad and all of its history will become permanently unavailable even if it is being edited at the time that it expires.<br><br>If a pad is set to expire, you can check its expiration time by viewing its <em>properties</em>, either by right-clicking the pad in your CryptDrive, or by using the <em>properties</em> sub-menu from an application's toolbar."
},
"tag": {
"q": "How can I use tags?",
"a": "You can tag pads and uploaded files via your CryptDrive, or using the <em>tag</em> button (<span class='fa fa-hashtag'></span>) in any editor's toolbar. Search for pads and files in your CryptDrive using the search bar with a term beginning with hashtag, like <em>#crypto</em>."
},
"template": {
"q": "What is a template?",
"a": "A template is a pad which can be used to define to initial content for another pad of the same type when you create it. Any existing pad can be turned into a template by moving it into the <em>Templates</em> section in your CryptDrive. You can also create a copy of a pad to be used as a template by clicking the template button (<span class='fa fa-bookmark'></span>) in the editor's toolbar."
},
"abandoned": {
"q": "What is an abandoned pad?",
"a": "An <em>abandoned pad</em> is a pad that is not pinned in any registered user's CryptDrive and that hasn't been changed for six months. Abandoned documents will be automatically removed from the server."
}
},
"privacy": {
"title": "Privacy",
"different": {
"q": "How is CryptPad different from other Pad services?",
"a": "CryptPad encrypts changes to your pads before sending that information to be stored on the server, so we can't read what you're typing."
},
"me": {
"q": "What information does the server know about me?",
"a": "Server administrators are able to see the IP addresses of people who visit the CryptPad. We don't record which addresses visit which pads, but we could, even though we don't have access to the decrypted content of those pads. If you are worried about us analyzing that information, it's safest to assume that we do collect it, since we can't prove that we don't.<br><br>We collect some basic telemetry about how people use CryptPad, such as the size of the screen on their device, and which buttons they click the most.This helps us improve the software, but if you'd prefer not to send such information to the server, you can <strong>opt out by unchecking the <em>Enable user feedback</em> checkbox</strong>.<br><br>We do keep track of which pads are in a user's CryptDrive so that we can impose storage limits, but we don't know the content or type of those pads. Storage quotas are associated with a user's public key, but we don't associate names or emails with those public keys.<br><br> For more information, you can read this <a href='https://blog.cryptpad.fr/2017/07/07/cryptpad-analytics-what-we-cant-know-what-we-must-know-what-we-want-to-know/' target='_blank'>blog post</a> which we wrote about the topic."
},
"register": {
"q": "Does the server know more about me if I register?",
"a": "We don't require users to verify their email address, and the server does not even learn your username or password when you register. Instead, the register and login forms generate a unique keyring from your input, and the server only learns your cryptographic signature. We use this information to track details like how much data you are using, which allows us to restrict each user to a quota.<br><br>We use our <em>feedback</em> functionality to inform the server that someone with your IP has registered an account. We use this to measure how many people register for CryptPad accounts, and to see what regions they are in so that we can guess which languages may need better support.<br><br>Registered users inform the server which pads are in their CryptDrive so that such pads are not considered abandoned, and are removed from the server due to inactivity."
},
"other": {
"q": "What can other collaborators learn about me?",
"a": "When you edit a pad with someone else, you communicate through the server, so only we learn your IP address. Other users can see your display name, avatar, the link to your profile (if you have one), and your <em>public key</em> (which is used for encrypting communications between each other)."
},
"anonymous": {
"q": "Does CryptPad make me anonymous?",
"a": "Even though CryptPad is designed to know as little about you as possible, it does not provide strong anonymity. Our servers have access to your IP address, however, you can hide this information by using Tor to access CryptPad. Using Tor without changing your behaviour will not guarantee you anonymity, as the server is also able to identify users by their unique cryptographic identifier. If you use the same account when you're not using Tor, it will be possible to deanonymize your session.<br><br>For users who require a lesser degree of privacy, CryptPad does not require users to identify themselves by name, phone number, or email address like many other services."
},
"policy": {
"q": "Do you have a data privacy policy?",
"a": "Yes! It is available <a href='/privacy.html' target='_blank'>here</a>."
}
},
"security": {
"title": "Security",
"proof": {
"q": "How do you use Zero Knowledge Proofs?",
"a": "When we use the term <em>Zero Knowledge</em>, we are not referring to <em>Zero Knowledge proofs</em>, but to <em>Zero Knowledge Web Services</em>. <em>Zero Knowledge Web Services</em> encrypt user data in the user's browser, without the server ever having access to the unencrypted data, or the encryption keys.<br><br>We've compiled a short list of Zero Knowledge services <a href='https://blog.cryptpad.fr/2017/02/20/Time-to-Encrypt-the-Cloud/#Other-Zero-Knowledge-Services'>here</a>."
},
"why": {
"q": "Why should I use CryptPad?",
"a": "Our position is that cloud services should not require access to your data in order for you to share it with your friends and colleagues. If you are using another service to collaborate, and they do not explicitly say that they can't access your information, it is very likely that they are leveraging it for profit."
},
"compromised": {
"q": "Does CryptPad protect me if my device is compromised?",
"a": "In the event that your device is stolen, CryptPad allows you to trigger a remote logout of all devices except the one you are currently using. To do so, go to your <strong>settings page</strong> and click <strong>Log out everywhere</strong>. All other devices which are currently connected to the account will log out. Any previously connected devices which visit CryptPad will log out as soon as they load the page.<br><br>Currently, <em>remote logout</em> is implemented in the browser, not in conjunction with the server. As such, it may not protect you from government agencies, but it should be sufficient if you forgot to log out after using CryptPad from a shared computer."
},
"crypto": {
"q": "What cryptography do you use?",
"a": "CryptPad is based upon two open-source cryptography libraries: <a href='https://github.com/dchest/tweetnacl-js' target='_blank'>tweetnacl.js</a> and <a href='https://github.com/dchest/scrypt-async-js' target='_blank'>scrypt-async.js</a>.<br><br>Scrypt is a <em>password-based key derivation algorithm</em>. We use it to turn your username and password into a unique keyring which secures access to your CryptDrive such that only you can access your list of pads.<br><br>We use the <em>xsalsa20-poly1305</em> and <em>x25519-xsalsa20-poly1305</em> cyphers provided by tweetnacl to encrypt pads and chat history, respectively."
},
"pad_password": {
"q": "What happens when I protect a pad/folder with a password?",
"a": "You can protect any pad or shared folder with a password when you create it. You can also use the properties menu to set/change/remove a password at any time.<br><br>Pad and shared folder passwords are intended to protect the link when you share it over potentially insecure channels such as email or text message. If someone intercepts your link but does not have the password they will not be able to read your document.<br><br>When sharing within CryptPad with your contacts or teams, communications are encrypted and we assume you want them to access your document. Therefore the password is remembered and sent with the pad when you share it. The recipient, or yourself, are <b>not</b> asked for it when they open the document."
}
},
"usability": {
"title": "Usability",
"register": {
"q": "What do I get by registering?",
"a": "Registered users have access to a number of features unavailable to unregistered users. There's a chart <a href='/features.html' target='_blank'>here</a>."
},
"share": {
"q": "How can I share encrypted pads with my contacts?",
"a": "CryptPad puts the secret encryption key to your pad after the <em>#</em> character in the URL. Anything after this character is not sent to the server, so we never have access to your encryption keys. By sharing the link to a pad, you share the ability to read and access it."
},
"remove": {
"q": "I removed a pad or file from my CryptDrive, but the content is still available. How can I remove it?",
"a": "Only <em>owned pads</em> (introduced in February 2018) can be deleted. Additionally, these pads can only be deleted by their <em>owners</em> (the person that originally created the pad). If you are not the creator of the pad, you will have to ask its owner to delete it for you. For pads you do own, you can <strong>right-click the pad in your CryptDrive</strong>, and choose <strong>Delete from the server</strong>."
},
"forget": {
"q": "What if I forget my password?",
"a": "Unfortunately, if we could recover access to your encrypted pads for you, we'd be able to access them ourselves. If you did not record your username and password anywhere, and cannot remember either, you may be able to recover your pads by filtering your browser's history."
},
"change": {
"q": "What if I want to change my password?",
"a": "You can change your CryptPad password in your account settings page."
},
"devices": {
"q": "I am logged in on two devices, and see two different CryptDrives, how is this possible?",
"a": "It's probable that you registered the same name twice, using different passwords. Because the CryptPad server identifies you by your cryptographic signature and not your name, it cannot prevent others from registering with the same name. As such, each user account has a unique username and password combination. Logged in users can see their username at the top of the settings page."
},
"folder": {
"q": "Can I share entire folders from my CryptDrive?",
"a": "Yes, you can create a <em>shared folder</em> from your CryptDrive and share all the pads it contains at once."
},
"feature": {
"q": "Can you add a very special feature which I need?",
"a": "Many of the features in CryptPad exist because users asked for them. Our <a href='https://cryptpad.fr/contact.html' target='_blank'>contacts page</a> lists the ways that you can reach us.<br><br>Unfortunately, we cannot guarantee that we will implement everything that people ask for. If a particular feature is critical for your organization, you can sponsor development time to ensure its completion. Please contact <a href='mailto:sales@cryptpad.fr' target='_blank'>sales@cryptpad.fr</a> for more information.<br><br>Even if you cannot afford to sponsor development, we're interested in feedback that can help us improve CryptPad. Feel free to contact us with via the above methods any time."
}
},
"other": {
"title": "Other questions",
"pay": {
"q": "Why should I pay when so many features are free?",
"a": "We give supporters additional storage and the ability to increase their contacts' quotas (<a href='https://accounts.cryptpad.fr/#/faq' target='_blank'>learn more</a>).<br><br>Beyond these short term benefits, by subscribing with a premium account you help to fund continued, active development of CryptPad. That includes fixing bugs, adding new features, and making it easier for others to help host CryptPad themselves. Additionally, you help to prove to other service providers that people are willing to support privacy enhancing technologies. It is our hope that eventually business models based on selling user data will become a thing of the past.<br><br>Finally, we offer most of CryptPad's functionality for free because we believe everyone deserves personal privacy, not just those with disposable income. By supporting us, you help us continue to make it possible for underprivileged populations to access these basic features without a price tag attached."
},
"goal": {
"q": "What is your goal?",
"a": "By developing privacy-respecting collaboration technology, we wish to raise users' expectations of privacy from cloud-computing platforms. We hope that our work drives other service providers in all domains to match or exceed our efforts. Despite our optimism, we know that much of the web is funded by revenue from targeted advertising. There is much more work to be done than we can manage ourselves, and we appreciate the promotion, support, and contributions of our community towards this goal."
},
"jobs": {
"q": "Are you hiring?",
"a": "Yes! Please introduce yourself with an email to <a href='mailto:jobs@xwiki.com' target='_blank'>jobs@xwiki.com</a>."
},
"host": {
"q": "Can you help me set up my own instance of CryptPad?",
"a": "We are happy to provide support for your organization's internal CryptPad installation. Please contact <a href='mailto:sales@cryptpad.fr' target='_blank'>sales@cryptpad.fr</a> for more information."
},
"revenue": {
"q": "How can I participate in the revenue sharing?",
"a": "If you are running your own instance of CryptPad, and would like to enable paid accounts and split the revenue with the developers, your server will need to be configured as a partner service.<br><br>In your CryptPad directory, <em>config.example.js</em> should contain an explanation of what you need to configure on your server. You will need to contact <a href='mailto:sales@cryptpad.fr'>sales@cryptpad.fr</a> to verify that your server is configured to use HTTPS correctly, and discuss payment methods."
}
}
},
"features_f_support_note": "Priority response from the administration team via email and built in ticket system",
"features_f_supporter": "Support privacy",
"features_f_supporter_note": "Help CryptPad to become financially sustainable and show that privacy-enhancing software willingly funded by users should be the norm",
"features_f_subscribe": "Subscribe",
"features_f_subscribe_note": "Registered account needed to subscribe",
"tos_title": "CryptPad Terms of Service",
"tos_legal": "Please don't be malicious, abusive, or do anything illegal.",
"tos_availability": "We hope you find this service useful, but availability or performance cannot be guaranteed. Please export your data regularly.",
@ -855,7 +700,7 @@
"help": {
"title": "Getting started",
"generic": {
"more": "Learn more about how CryptPad can work for you by reading our <a href=\"/faq.html\" target=\"_blank\">FAQ</a>.",
"more": "Learn more about how CryptPad can work for you by reading our <a href=\"https://docs.cryptpad.fr\" target=\"_blank\" rel=\"noopener noreferrer\">Documentation</a>.",
"share": "Share this document with the <i class=\"fa fa-shhare-alt\"></i> <b>Share</b> button, and manage access rights with <i class=\"fa fa-unlock-alt\"></i> <b>Access</b>.",
"save": "All your changes are synced automatically so you never need to save"
},
@ -939,7 +784,7 @@
"creation_owned": "Owned pad",
"creation_ownedTrue": "Owned pad",
"creation_ownedFalse": "Open pad",
"creation_owned1": "An <b>owned</b> pad can be deleted from the server whenever the owner wants. Deleting an owned pad removes it from other users' CryptDrives.",
"creation_owned1": "An <b>owned</b> item can be destroyed whenever the owner wants. Destroying an owned item makes it unavailable from other users' CryptDrives.",
"creation_owned2": "An <b>open</b> pad doesn't have any owner and thus, it can't be deleted from the server unless it has reached its expiration time.",
"creation_expireTitle": "Life time",
"creation_expire": "Expiring pad",
@ -950,7 +795,7 @@
"creation_expireMonths": "Month(s)",
"creation_expire1": "An <b>unlimited</b> pad will not be removed from the server until its owner deletes it.",
"creation_expire2": "An <b>expiring</b> pad has a set lifetime, after which it will be automatically removed from the server and other users' CryptDrives.",
"creation_password": "Add a password",
"creation_password": "Password\n",
"creation_noTemplate": "No template",
"creation_newTemplate": "New template",
"creation_create": "Create",
@ -959,7 +804,7 @@
"creation_owners": "Owners",
"creation_ownedByOther": "Owned by another user",
"creation_noOwner": "No owner",
"creation_expiration": "Expiration time",
"creation_expiration": "Expiration date",
"creation_passwordValue": "Password",
"creation_propertiesTitle": "Availability",
"creation_appMenuName": "New pad (Ctrl + E)",
@ -1047,12 +892,12 @@
"admin_flushCacheButton": "Flush cache",
"admin_flushCacheDone": "Cache flushed successfully",
"footer_product": "Product",
"footer_team": "The team",
"footer_team": "Contributors",
"footer_donate": "Donate",
"footer_legal": "Legal",
"footer_tos": "Terms",
"footer_tos": "Terms of Service",
"contact_admin": "Contact the administrators",
"contact_adminHint": "For any issues related to your account, storage limit, or availability of their service.",
"contact_adminHint": "For any issues related to your account, storage limit, or availability of the service.\n",
"contact_dev": "Contact the developers",
"contact_devHint": "For feature requests, usability improvements, or to say thank you.",
"contact_bug": "Bug report",
@ -1144,7 +989,7 @@
"pricing": "Pricing",
"homePage": "Home page",
"features_noData": "No personal information required",
"features_pricing": "Between {0} and {2}€ per month",
"features_pricing": "{0} to {2}€ per month",
"features_emailRequired": "Email address required",
"owner_removeText": "Owners",
"owner_removePendingText": "Pending",
@ -1504,5 +1349,33 @@
"admin_support_open": "Show",
"admin_support_collapse": "Collapse",
"admin_support_first": "Created on: ",
"admin_support_last": "Updated on: "
"admin_support_last": "Updated on: ",
"access_offline": "You are currently offline. Access management is not available.",
"share_noContactsOffline": "You are currently offline. Contacts are not available.",
"offlineError": "Unable to synchronize the most recent data, this page cannot be displayed at this time. Loading will continue when your connection to the service is restored.",
"home_privacy_title": "Private by design",
"home_privacy_text": "CryptPad is built to enable collaboration while keeping data private. All content is encrypted and decrypted by your browser. This means documents, chats, and files are unreadable outside of the session where you are logged in. Even the service administrators do not have access to your information.",
"home_host_title": "About this instance",
"home_opensource_title": "Open Source",
"home_opensource": "Anyone can host CryptPad and offer the service in a personal or professional capacity. The source code is available on <a rel=\"noopener noreferrer\" target=\"_blank\" href=\"https://github.com/xwiki-labs/cryptpad\">Github</a>.",
"home_support_title": "Support CryptPad",
"home_support": "<p>The development team does not profit from user data in any way. This is part of a vision for online services that respect privacy. Unlike the big platforms that pretend to be \"free\" while making profits from personal information, we aim to build a sustainable model funded willingly by users.</p><p>You can support the project by making a one-time or recurring donation through our Open Collective. Our budget is transparent and updates are published regularly. There are also a number of <a href=\"https://docs.cryptpad.fr/en/how_to_contribute.html\" rel=\"noopener noreferrer\" target=\"_blank\">non-financial ways to contribute</a>.</p>",
"register_notes_title": "Important notes",
"register_notes": "<ul class=\"cp-notes-list\"><li>Your password is the secret key that encrypts all of your documents. <span class=\"red\">If you lose it there is no way we can recover your data.</span></li><li>If you are using a shared computer, <span class=\"red\">remember to log out</span> when you are done. Only closing the browser window leaves your account exposed. </li><li>To keep the documents you created and/or stored without being logged in, tick \"Import documents from your anonymous session\". </li></ul>",
"register_warning_note": "Due to the encrypted nature of CrytpPad, the service administrators will not be able to recover data in case you forget your username and/or password. Please save them in a safe place.",
"whatis_collaboration_info": "<p>CryptPad is built to enable collaboration. It synchronizes changes to documents in real time. Because all data is encrypted, the service and its administrators have no way of seeing the content being edited and stored.</p>",
"whatis_apps": "A full suite of applications",
"whatis_apps_info": "<p>CryptPad provides a full-fledged office suite with all the tools necessary for productive collaboration. Applications include: Rich Text, Spreadsheets, Code/Markdown, Kanban, Slides, Whiteboard and Polls.</p><p>The applications are complemented by a set of collaboration features such as chat, contacts, color by author (code/markdown), and comments with mentions (rich text).</p>",
"whatis_drive_info": "<p>Store and manage documents with CryptDrive. Create folders, shared folders, and tags to organize documents. Upload and share files (PDFs, photos, video, audio, etc.). Team drives are shared between users and allow for collaborative organization and fine-grained access controls.</p>",
"whatis_model": "Business model",
"whatis_model_info": "<p>CryptPad has been supported since 2016 by French and European research grants such as BPI France, NLNet Foundation, NGI Trust, Mozilla Open Source Support, as well as donations and subscriptions to cryptpad.fr. We believe that public money should fund public code, so the service is fully open source. This means anyone can use, host, and modify the software.</p><p>CryptPad does not profit from user data. This is part of a vision for online services that respect privacy. Unlike the big platforms that pretend to be \"free\" while making profits from personal information, CryptPad aims to build a sustainable model funded willingly by users.</p><p>We offer CryptPad's functionality for free because we believe everyone deserves personal privacy, not just people with disposable income. If you are in a position to support the project, you will contribute new features, improvements and maintenance that benefit all users.</p><p>Now that the feasibility of the project has been established, the next goal is to make it financially sustainable through user funding. If you would like to support CryptPad and help make it a sustainable alternative to the big platforms, please consider making a one-time or recurring donation.</p>",
"whatis_xwiki": "Made at XWiki",
"whatis_xwiki_info": "<p>CryptPad is made at <a rel=\"noopener noreferrer\" target=\"_blank\" href=\"https://xwiki.com\">XWiki</a>, a company based in Paris, France that has been making open-source software for over 15 years. We have extensive experience making collaborative software to organise information. Our track record shows we are committed to the long-term development and maintenance of CryptPad.</p>",
"creation_expiresIn": "Expires in",
"creation_helperText": "Open in documentation",
"docs_link": "Documentation",
"settings_cacheTitle": "Cache",
"settings_cacheHint": "CryptPad stores parts of your documents in your browser's memory in order to save network usage and improve loading times. You can disable the cache if your device doesn't have a lot of free storage space. For security reasons, the cache is always cleared when you log out, but you can clear it manually if you want to reclaim storage space on your machine.",
"settings_cacheCheckbox": "Enable cache on this device",
"settings_cacheButton": "Clear existing cache"
}

View file

@ -230,7 +230,6 @@
"register_mustAcceptTerms": "Você precisa aceitar os termos de serviço.",
"register_mustRememberPass": "Nós não podemos restaurar sua senha caso você a esqueça. É muito importante que você lembre-se dela! Clique nesta caixa de seleção para confirmar que você compreendeu isto.",
"register_header": "Bem vindo ao CryptPad",
"register_explanation": "<p>Lets go over a couple things first</p><ul><li>Your password is your secret key which encrypts all of your pads. If you lose it there is no way we can recover your data.</li><li>You can import pads which were recently viewed in your browser so you have them in your account.</li><li>If you are using a shared computer, you need to log out when you are done, closing the tab is not enough.</li></ul>",
"register_writtenPassword": "I have written down my username and password, proceed",
"register_cancel": "Go back",
"register_warning": "Zero Knowledge means that we can't recover your data if you lose your password.",

View file

@ -209,7 +209,6 @@
"register_mustAcceptTerms": "Trebuie să accepți termenii serviciului",
"register_mustRememberPass": "Nu putem să îți resetăm parola dacă o uiți. Este foarte important să o ții minte! Bifează căsuța pentru a confirma.",
"register_header": "Bine ai venit în CryptPad",
"register_explanation": "<p>Hai să stabilim câteva lucruri, mai întâi</p><ul><li>Parola ta este cheia secretă care criptează toate pad-urile tale. Dacă pierzi/uiți parola nu există nici-o metodă prin care îți putem recupera datele.</li><li>Poți importa pad-uri care au fost vizionate recent în browser pentru a le avea în cont.</li><li>Dacă folosești un computer împărțit, trebuie să te deloghezi, închiderea taburilor nu este de ajuns.</li></ul>",
"register_writtenPassword": "Mi-am notat numele de utilizator și parola, înaintează.",
"register_cancel": "Întoarce-te",
"register_warning": "Zero Knowledge înseamnă că noi nu îți putem recupera datele dacă îți pierzi parola.",

View file

@ -551,17 +551,6 @@
"creation_expireFalse": "Неограниченно",
"view": "показать",
"edit": "редактировать",
"faq": {
"usability": {
"title": "Удобство использования"
},
"security": {
"title": "Безопасность"
},
"privacy": {
"title": "Конфиденциальность"
}
},
"settings_ownDriveTitle": "Обновить аккаунт",
"settings_templateSkipHint": "При создании нового документа, если для этого типа документов были сохранены шаблоны, вам будет предложено их использовать. Вы можете выбрать никогда не показывать окно с этим предложением, а значит никогда не использовать шаблоны.",
"settings_templateSkip": "Пропускать экран выбора шаблонов",
@ -579,7 +568,6 @@
"register_emailWarning2": "Восстановить ваш пароль с помощью почты, как на других сайтах, не получится.",
"register_emailWarning1": "Вы можете сделать это, если хочется, но на наш сервер это отправлено не будет.",
"register_emailWarning0": "Похоже, что ваша почта и имя пользователя совпадают.",
"register_explanation": "<h3>Проясним несколько вещей:</h3><ul class='list-unstyled'><li><i class='fa fa-info-circle'> </i>Ваш пароль - это ваш секретный ключ, шифрующий всеваши документы. Если вы его забудете, восстановить ваши данные будет невозможно.</li><li><i class='fa fa-info-circle'> </i> Вы можете импортировать недавно просмотренные в браузере документы в ваш аккаунт.</li><li><i class='fa fa-info-circle'> </i> Если вы пользуетесь общим компьютером: по завершении работы необходимо выйти из системы, закрытия вкладки в браузере недостаточно.</li></ul>",
"password_submit": "Отправить",
"team_pendingOwner": "(ожидание)",
"team_deleteButton": "Удалить",

View file

@ -110,11 +110,11 @@
"cancel": "取消",
"cancelButton": "取消 (esc)",
"historyButton": "顯示文件歷史",
"history_next": "到下一個版本",
"history_prev": "到之前的版本",
"history_next": "下个版本",
"history_prev": "先前版本",
"history_closeTitle": "關閉歷史記錄",
"history_restoreTitle": "將此文件重建到所挑選的版本",
"history_restorePrompt": "確定要將這個展現的版本來取代現有版本嗎?",
"history_restorePrompt": "您确定要用显示的版本替换文档的当前版本吗?",
"history_restoreDone": "文件已重建",
"history_version": "版本:",
"poll_title": "零知識日期挑選",
@ -173,8 +173,8 @@
"fm_openParent": "顯示在目錄夾中",
"fm_noname": "無標題文件",
"fm_emptyTrashDialog": "確定要清理垃圾筒嗎?",
"fm_removeSeveralPermanentlyDialog": "確定要將這些 {0} 東西永自垃圾筒移除嗎?",
"fm_removePermanentlyDialog": "你確定要永久地移除這些項目嗎?",
"fm_removeSeveralPermanentlyDialog": "您确定要从您的驱动器中删除这些{0}项目吗? 它们将留在已存储它们的其他用户的驱动器中。",
"fm_removePermanentlyDialog": "您确定要从驱动器中删除此项目吗?它将保留在已存储它的其他用户的驱动器中。",
"fm_removeSeveralDialog": "確定要將這些 {0} 東西移至垃圾筒嗎?",
"fm_removeDialog": "確定要將移動 {0} 至垃圾筒嗎?",
"fm_restoreDialog": "確定要重置 {0} 到它之前的位置嗎?",
@ -187,7 +187,7 @@
"fm_info_template": "包含所有工作檔案已存成模版,便於讓你在建立新工作檔案時套用。",
"fm_info_trash": "清空垃圾筒好讓 CryptDrive 多出一些空間",
"fm_info_allFiles": "包含在 \"根目錄\", \"未整理的\" 和 \"垃圾筒\" 裏的所有檔案。這裏你無法移動或移除檔案。",
"fm_info_anonymous": "你尚未登入,因此這些工作檔案可能會被刪除。 (<a href=\"https://blog.cryptpad.fr/2017/05/17/You-gotta-log-in/\" target=\"_blank\">了解原因</a>). <a href=\"/register/\">註冊</a>或<a href=\"/login/\">登入</a>以便保留它們。",
"fm_info_anonymous": "您没有登录,所以您的文档将在{0}天后过期。清除你的浏览器历史记录可能会使它们消失。<br><a href=\"/register/\">注册</a> (无需个人信息) 或<a href=\"/login/\">登录</a>以无限期地把它们储存在你的硬盘里。 <a href=\"https://docs.cryptpad.fr/en/user_guide/user_account.html#account-types\" target=\"_blank\">阅读更多关于注册帐户</a>。",
"fm_alert_backupUrl": "這個雲端硬碟的備份連結<br><strong>高度建議</strong>把自己的 IP 資訊保留成只有自己知道<br>萬一瀏覽器記憶被消除,你可以用它來接收所有的檔案。<br>任何知道此連結的人可以編輯或移除你檔案管理底下的所有檔案。<br>",
"fm_alert_anonymous": "嗨你好, 你目前正以匿名方式在使用 CryptPad , 這也沒問題,不過你的東西過一段時間沒動靜後,就會自動被刪除。 匿名的用戶我們也取消其進階功能,因為我們要明確地讓用戶知道,這裏 不是一個安全存放東西的地方。你可以 <a href=\"https://blog.cryptpad.fr/2017/05/17/You-gotta-log-in/\" target=\"_blank\">進一步了解 </a> 關於 為何我們這樣作,以及為何你最好能夠<a href=\"/register/\">註冊</a> 以及 <a href=\"/login/\">登錄</a>使用。",
"fm_backup_title": "備份連結",
@ -199,7 +199,7 @@
"fc_open_ro": "打開 (唯讀)",
"fc_delete": "刪除",
"fc_restore": "重置",
"fc_remove": "永久刪除",
"fc_remove": "刪除",
"fc_empty": "清理垃圾筒",
"fc_prop": "Properties",
"fc_sizeInKilobytes": "容量大小 (Kilobytes)",
@ -233,7 +233,6 @@
"register_mustAcceptTerms": "你必須同意我們的服務條款。",
"register_mustRememberPass": "如果你忘了密碼,我們也無法為你重置。因此務必自行好好記住! 請在勾選處勾選確認。",
"register_header": "歡迎來到 CryptPad",
"register_explanation": "<p>首先讓我們先了解幾件事</p><ul><li>你的密碼是你用來加密所有工作檔案的密鑰。一旦遺失它,我們也沒辦法幫你恢復你的資料。</li><li>你可以滙入近期在瀏覽器下檢視的工作檔案到你的雲端硬碟裏。</li><li>如果你使用的是公用分享電腦,你需要在完成工作後進行登出,只是關閉分頁是不夠的。</li></ul>",
"register_writtenPassword": "我已記下了我的用戶名和密碼,請繼續",
"register_cancel": "回去",
"register_warning": "零知識表示如果你遺失了密碼,我們也無法還原你的資料",
@ -263,14 +262,14 @@
"settings_pinningNotAvailable": "工作檔案置頂功能只開放給已註冊用戶",
"settings_pinningError": "有點不對勁",
"settings_usageAmount": "你置頂的工作檔案佔了 {0}MB",
"settings_logoutEverywhereTitle": "自所有地點登出",
"settings_logoutEverywhereTitle": "关闭远程会话",
"settings_logoutEverywhere": "自所有其它的網頁期間登出",
"settings_logoutEverywhereConfirm": "你確定嗎?你將需要登入到所有用到設置。",
"upload_serverError": "伺服器出錯:本次無法上傳你的檔案",
"upload_uploadPending": "你欲上傳檔案正在傳輸中,要取消並上傳新檔案嗎?",
"upload_success": "你的檔案 ({0}) 已成功地上傳並放入到你的網路磁碟中。",
"upload_notEnoughSpace": "你的 CryptDrive 無足夠空間來存放這個檔案。",
"upload_tooLarge": "此檔案超過了上傳單一檔案可允許的容量上限。",
"upload_tooLarge": "该文件超过了您的帐户允许的最大上传大小。",
"upload_choose": "選擇一個檔案",
"upload_pending": "待處理",
"upload_cancelled": "已取消的",
@ -313,7 +312,7 @@
"header_logoTitle": "回到主頁",
"driveReadmeTitle": "什麼是 CryptPad?",
"readme_welcome": "歡迎來到 CryptPad !",
"readme_p1": "歡迎來到 CryptPad, 這裏你可以獨自作個人筆記或是和別人共享協作。",
"readme_p1": "欢迎来到 CryptPad在这里你可以单独或和联系人一起记录事情。",
"readme_p2": "這個工作檔案可以讓你快速地了解如何使用 CryptPad 作筆記,有效地整理管理文件工作檔案。",
"readme_cat1": "認識如何使用 CryptDrive",
"readme_cat1_l1": "建立一個工作檔案: 在 CryptDrive 底下, 點擊 {0} 然後 {1} 這樣就可以建立一個新的工作檔案。",
@ -353,7 +352,7 @@
"exportButton": "导出",
"importButton": "导入",
"forgotten": "移到垃圾箱",
"initializing": "初始化中",
"initializing": "初始化中",
"typing": "编辑中",
"profile_editDescription": "编辑描述",
"profile_addDescription": "添加描述",

View file

@ -310,7 +310,6 @@ define([
onDisconnect();
});
sframeChan.on('EV_NETWORK_RECONNECT', function () {
console.log('here');
onReconnect();
});
common.onLogout(function () { setEditable(false); });

View file

@ -729,6 +729,11 @@ define([
cursor.offsetUpdate();
var oldText = inner.outerHTML;
// Get scroll position
var sTop = $iframe.scrollTop();
var sTopMax = $iframe.innerHeight() - $('iframe').innerHeight();
var scrollMax = Math.abs(sTop - sTopMax) < 1;
// Apply the changes
var patch = (DD).diff(inner, userDocStateDom);
(DD).apply(inner, patch);
@ -765,6 +770,10 @@ define([
comments.onContentUpdate();
updateTOC();
if (scrollMax) {
$iframe.scrollTop($iframe.innerHeight());
}
});
framework.setTextContentGetter(function() {

View file

@ -99,11 +99,6 @@ define([
return void UI.alert(Messages.register_mustAcceptTerms);
}
// XXX translations
Messages.register_warning = "<i class='fa fa-warning'></i> Warning"; // existing key
Messages.register_warning_note = "Due to the encrypted nature of CrytpPad even the the service administrators will not be able to recover data in case the username and/or password are forgotten. Please save them in a safe place.";
Messages.register_cancel = "Cancel"; // existing key
setTimeout(function () {
UI.confirm("<h2 class='msg'>" + Messages.register_warning + "</h2>" + Messages.register_warning_note,
function (yes) {

View file

@ -102,6 +102,7 @@ define([
password: config.data.password,
isTemplate: isTemplate,
file: config.data.file,
secureIframe: true,
};
for (var k in additionalPriv) { metaObj.priv[k] = additionalPriv[k]; }

View file

@ -60,6 +60,7 @@ define([
'cp-settings-autostore',
'cp-settings-safe-links',
'cp-settings-userfeedback',
'cp-settings-cache',
],
'drive': [
'cp-settings-resettips',
@ -359,6 +360,54 @@ define([
return $div;
};
makeBlock('cache', function (cb) {
var store = window.cryptpadStore;
var $cbox = $(UI.createCheckbox('cp-settings-cache',
Messages.settings_cacheCheckbox,
false, { label: { class: 'noTitle' } }));
var spinner = UI.makeSpinner($cbox);
// Checkbox: "Enable safe links"
var $checkbox = $cbox.find('input').on('change', function() {
spinner.spin();
var val = !$checkbox.is(':checked') ? '1' : undefined;
store.put('disableCache', val, function () {
sframeChan.query('Q_CACHE_DISABLE', {
disabled: Boolean(val)
}, function () {
spinner.done();
});
});
});
store.get('disableCache', function (val) {
if (!val) {
$checkbox.attr('checked', 'checked');
}
});
var button = h('button.btn.btn-danger', [
h('i.fa.fa-trash-o'),
h('span', Messages.settings_cacheButton)
]);
var buttonContainer = h('div.cp-settings-clear-cache', button);
var spinner2 = UI.makeSpinner($(buttonContainer));
UI.confirmButton(button, {
classes: 'btn-danger'
}, function () {
spinner2.spin();
sframeChan.query('Q_CLEAR_CACHE', null, function() {
spinner2.done();
});
});
cb([
$cbox[0],
buttonContainer
]);
}, true);
create['delete'] = function() {
if (!common.isLoggedIn()) { return; }
var $div = $('<div>', { 'class': 'cp-settings-delete cp-sidebarlayout-element' });

View file

@ -357,9 +357,10 @@ define([
};
var updateLocalColors = function (text, back) {
updateColors(text, back);
var metadata = JSON.parse(JSON.stringify(metadataMgr.getMetadata()));
var metadata = JSON.parse(JSON.stringify(metadataMgr.getMetadataLazy()));
if (backColor) { metadata.backColor = backColor; }
if (textColor) { metadata.color = textColor; }
if (!metadata.title) { metadata.title = metadata.defaultTitle; }
metadataMgr.updateMetadata(metadata);
framework.localChange();
};
@ -527,8 +528,6 @@ define([
if (newPad) {
colors.updateLocalColors('#000', '#FFF');
} else {
colors.updateLocalColors('#FFF', '#000');
}
CodeMirror.setMode('markdown', function () { });

View file

@ -22,6 +22,7 @@ define([
data.sender = {
name: user.name,
drive: privateData.driveChannel,
channel: privateData.support,
curvePublic: user.curvePublic,
edPublic: privateData.edPublic,

View file

@ -328,6 +328,7 @@ define([
}, true);
}
driveAPP.online = !teamData.offline;
var drive = DriveUI.create(common, {
proxy: proxy,
folders: folders,