diff --git a/.github/ISSUE_TEMPLATE/bug_resolution.yml b/.github/ISSUE_TEMPLATE/bug_resolution.yml index 9016f70eb..02e34b47e 100644 --- a/.github/ISSUE_TEMPLATE/bug_resolution.yml +++ b/.github/ISSUE_TEMPLATE/bug_resolution.yml @@ -89,6 +89,7 @@ body: label: Version description: What version of CryptPad are you running? options: + - 2024.3.1 - 2024.3.0 - 5.7.0 - 5.6.0 diff --git a/CHANGELOG.md b/CHANGELOG.md index 5bf5d7b6b..11d6e2045 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,48 @@ SPDX-FileCopyrightText: 2023 XWiki CryptPad Team and cont SPDX-License-Identifier: AGPL-3.0-or-later --> +# 2024.3.1 + +## Goals +This minor release introduces a workaround to recover corrupted OnlyOffice documents alongside other fixes, with some improvements. + +## Fixes +- Workarounds for missing OnlyOffice methods: [#1492](https://github.com/cryptpad/cryptpad/pull/1492) +- Fix HTTP server issue with NodeJs >= v20.13.0: [4483b84](https://github.com/cryptpad/cryptpad/commit/4483b848ff2ba23176cb05dacf073f3e0581ba7b) +- Fix merge issues with `package.json`: [7f45d59](https://github.com/cryptpad/cryptpad/commit/7f45d598cbf230002863bbd84004c38252b97031) +- Fix Docker ports: [#1485](https://github.com/cryptpad/cryptpad/pull/1485) +- Change _inactive_ to _archived_ in `config.example.js` file: [#1474](https://github.com/cryptpad/cryptpad/pull/1474) + +## Improvements +- New translations from our Weblate contributors: [#1491](https://github.com/cryptpad/cryptpad/pull/1491) + - Polish + - French + - Bulgarian + - Hungarian + - Basque +- Optimize default Nginx example config: [#1486](https://github.com/cryptpad/cryptpad/pull/1486) +- Add `.mjs` support in HTTPd example config: [#1471](https://github.com/cryptpad/cryptpad/pull/1471) + +## Upgrade notes +If you are upgrading from a version older than `2024.3.0` please read the upgrade notes of all versions between yours and `2024.3.1` to avoid configuration issues. + +To upgrade: + +1. Stop your server +2. Get the latest code with git + +```bash +git fetch origin --tags +git checkout 2024.3.1 +npm ci +npm run install:components +./install-onlyoffice.sh +``` + +3. Restart your server +4. Review your instance's checkup page to ensure that you are passing all tests + + # 2024.3.0 ## Goals diff --git a/Dockerfile b/Dockerfile index 4a4e69ff2..e2be11805 100644 --- a/Dockerfile +++ b/Dockerfile @@ -60,7 +60,7 @@ ENTRYPOINT ["/bin/bash", "/cryptpad/docker-entrypoint.sh"] HEALTHCHECK --interval=1m CMD curl -f http://localhost:3000/ || exit 1 # Ports -EXPOSE 3000 3001 3003 +EXPOSE 3000 3003 # Run cryptpad on startup CMD ["npm", "start"] diff --git a/config/config.example.js b/config/config.example.js index 63a75f059..7c8184c6c 100644 --- a/config/config.example.js +++ b/config/config.example.js @@ -191,7 +191,7 @@ module.exports = { * This archived data still takes up space and so you'll probably still want to * remove these files after a brief period. * - * cryptpad/scripts/evict-inactive.js is intended to be run daily + * cryptpad/scripts/evict-archived.js is intended to be run daily * from a crontab or similar scheduling service. * * The intent with this feature is to provide a safety net in case of accidental diff --git a/docker-compose.yml b/docker-compose.yml index f959124ea..d1b040cba 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -7,7 +7,7 @@ version: '3.8' services: cryptpad: - image: "cryptpad/cryptpad:version-2024.3.0" + image: "cryptpad/cryptpad:version-2024.3.1" hostname: cryptpad environment: @@ -30,7 +30,6 @@ services: ports: - "3000:3000" - - "3001:3001" - "3003:3003" ulimits: diff --git a/docs/example.httpd.conf b/docs/example.httpd.conf index 67127424c..d22648181 100644 --- a/docs/example.httpd.conf +++ b/docs/example.httpd.conf @@ -33,8 +33,14 @@ SSLStaplingCache "shmcb:logs/ssl_stapling(32768)" nokeepalive ssl-unclean-shutdown \ downgrade-1.0 force-response-1.0 Protocols h2 http/1.1 - LimitRequestBody 157286400 AddType application/javascript mjs - ProxyPass / http://localhost:3000/ upgrade=websocket - ProxyPassReverse / http://localhost:3000/ + + LimitRequestBody 157286400 + ProxyPass http://localhost:3000/ upgrade=websocket + ProxyPassReverse http://localhost:3000/ + + + ProxyPassMatch http://localhost:3003/ upgrade=websocket + ProxyPassReverse http://localhost:3003/ + diff --git a/docs/example.nginx.conf b/docs/example.nginx.conf index dee2cbbc4..dd61615a1 100644 --- a/docs/example.nginx.conf +++ b/docs/example.nginx.conf @@ -71,4 +71,15 @@ server { proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection upgrade; } + + location ^~ /cryptpad_websocket { + proxy_pass http://localhost:3003; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header Host $host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection upgrade; + } } diff --git a/lib/api.js b/lib/api.js index 220e954d8..91ae1598b 100644 --- a/lib/api.js +++ b/lib/api.js @@ -61,7 +61,7 @@ nThen(function (w) { }; // spawn ws server and attach netflux event handlers - NetfluxSrv.create(new WebSocketServer({ server: Env.httpServer})) + let Server = NetfluxSrv.create(new WebSocketServer({ server: Env.httpServer})) .on('channelClose', historyKeeper.channelClose) .on('channelMessage', historyKeeper.channelMessage) .on('channelOpen', historyKeeper.channelOpen) @@ -90,6 +90,65 @@ nThen(function (w) { }); }) .register(historyKeeper.id, historyKeeper.directMessage); + // Store max active WS during the last day (reset when sending ping if enabled) + setInterval(() => { + try { + // Concurrent usage data + let oldWs = Env.maxConcurrentWs || 0; + let oldUniqueWs = Env.maxConcurrentUniqueWs || 0; + let oldChans = Env.maxActiveChannels || 0; + let oldUsers = Env.maxConcurrentRegUsers || 0; + let stats = Server.getSessionStats(); + let chans = Server.getActiveChannelCount(); + let reg = 0; + let regKeys = []; + Object.keys(Env.netfluxUsers).forEach(id => { + let keys = Env.netfluxUsers[id]; + let key = Object.keys(keys || {})[0]; + if (!key) { return; } + if (regKeys.includes(key)) { return; } + reg++; + regKeys.push(key); + }); + Env.maxConcurrentWs = Math.max(oldWs, stats.total); + Env.maxConcurrentUniqueWs = Math.max(oldUniqueWs, stats.unique); + Env.maxConcurrentRegUsers = Math.max(oldUsers, reg); + Env.maxActiveChannels = Math.max(oldChans, chans); + } catch (e) {} + }, 10000); + // Clean up active registered users and channels (possible memory leak) + setInterval(() => { + try { + let users = Env.netfluxUsers || {}; + let online = Server.getOnlineUsers() || []; + let removed = 0; + Object.keys(users).forEach(id => { + if (!online.includes(id)) { + delete users[id]; + removed++; + } + }); + if (removed) { + Env.Log.info("CLEANED_ACTIVE_USERS_MAP", {removed}); + } + } catch (e) {} + try { + let HK = require('./hk-utils'); + let chans = Env.channel_cache || {}; + let active = Server.getActiveChannels() || []; + let removed = 0; + Object.keys(chans).forEach(id => { + if (!active.includes(id)) { + HK.dropChannel(Env, id); + removed++; + } + }); + if (removed) { + Env.Log.info("CLEANED_ACTIVE_CHANNELS_MAP", {removed}); + } + } catch (e) {} + }, 30000); + }); }); diff --git a/lib/commands/admin-rpc.js b/lib/commands/admin-rpc.js index bce956147..9054c9d04 100644 --- a/lib/commands/admin-rpc.js +++ b/lib/commands/admin-rpc.js @@ -101,11 +101,13 @@ var shutdown = function (Env, Server, cb) { // and allow system functionality to restart the server }; -var getRegisteredUsers = function (Env, Server, cb) { +var getRegisteredUsers = Admin.getRegisteredUsers = function (Env, Server, cb) { Env.batchRegisteredUsers('', cb, function (done) { var dir = Env.paths.pin; - var folders; + var dirB = Env.paths.block; + var folders, foldersB; var users = 0; + var blocks = 0; nThen(function (waitFor) { Fs.readdir(dir, waitFor(function (err, list) { if (err) { @@ -114,16 +116,39 @@ var getRegisteredUsers = function (Env, Server, cb) { } folders = list; })); + Fs.readdir(dirB, waitFor(function (err, list) { + if (err) { + waitFor.abort(); + return void done(err); + } + foldersB = list; + })); }).nThen(function (waitFor) { folders.forEach(function (f) { var dir = Env.paths.pin + '/' + f; Fs.readdir(dir, waitFor(function (err, list) { if (err) { return; } + // Don't count placeholders + list = list.filter(name => { + return !/\.placeholder$/.test(name); + }); users += list.length; })); }); + }).nThen(function (waitFor) { + foldersB.forEach(function (f) { + var dir = Env.paths.block + '/' + f; + Fs.readdir(dir, waitFor(function (err, list) { + if (err) { return; } + // Don't count placeholders + list = list.filter(name => { + return !/\.placeholder$/.test(name); + }); + blocks += list.length; + })); + }); }).nThen(function () { - done(void 0, users); + done(void 0, {users, blocks}); }); }); }; diff --git a/lib/commands/quota.js b/lib/commands/quota.js index 4c068fad0..2397b7680 100644 --- a/lib/commands/quota.js +++ b/lib/commands/quota.js @@ -10,6 +10,8 @@ const Https = require("https"); const Http = require("http"); const Util = require("../common-util"); const Stats = require("../stats"); +const Admin = require("./admin-rpc.js"); +const nThen = require('nthen'); var validLimitFields = ['limit', 'plan', 'note', 'users', 'origin']; @@ -111,45 +113,85 @@ var queryAccountServer = function (Env, cb) { var done = Util.once(Util.mkAsync(cb)); var rawBody = Stats.instanceData(Env); - Env.Log.info("SERVER_TELEMETRY", rawBody); - var body = JSON.stringify(rawBody); - var options = { - host: 'accounts.cryptpad.fr', - path: '/api/getauthorized', - method: 'POST', - headers: { - "Content-Type": "application/json", - "Content-Length": Buffer.byteLength(body) - } + let send = () => { + Env.Log.info("SERVER_TELEMETRY", rawBody); + var body = JSON.stringify(rawBody); + + var options = { + host: 'accounts.cryptpad.fr', + path: '/api/getauthorized', + method: 'POST', + headers: { + "Content-Type": "application/json", + "Content-Length": Buffer.byteLength(body) + } + }; + + var req = Https.request(options, function (response) { + if (!('' + response.statusCode).match(/^2\d\d$/)) { + return void cb('SERVER ERROR ' + response.statusCode); + } + var str = ''; + + response.on('data', function (chunk) { + str += chunk; + }); + + response.on('end', function () { + try { + var json = JSON.parse(str); + checkUpdateAvailability(Env, json); + done(void 0, json); + } catch (e) { + done(e); + } + }); + }); + + req.on('error', function () { + done(); + }); + + req.end(body); }; - var req = Https.request(options, function (response) { - if (!('' + response.statusCode).match(/^2\d\d$/)) { - return void cb('SERVER ERROR ' + response.statusCode); - } - var str = ''; - - response.on('data', function (chunk) { - str += chunk; - }); - - response.on('end', function () { - try { - var json = JSON.parse(str); - checkUpdateAvailability(Env, json); - done(void 0, json); - } catch (e) { - done(e); + if (Env.provideAggregateStatistics) { + let stats = {}; + nThen(waitFor => { + Admin.getRegisteredUsers(Env, null, waitFor((err, data) => { + if (err) { return; } + stats.registered = data.blocks; + if (Env.lastPingRegisteredUsers) { + stats.usersDiff = stats.registered - Env.lastPingRegisteredUsers; + } + Env.lastPingRegisteredUsers = stats.registered; + let teams = (data.users - data.blocks); + if (teams > 0) { stats.teams = teams; } + })); + }).nThen(() => { + if (Env.maxConcurrentWs) { + stats.maxConcurrentWs = Env.maxConcurrentWs; + Env.maxConcurrentWs = 0; } + if (Env.maxConcurrentUniqueWs) { + stats.maxConcurrentUniqueIPs = Env.maxConcurrentUniqueWs; + Env.maxConcurrentUniqueWs = 0; + } + if (Env.maxConcurrentRegUsers) { + stats.maxConcurrentRegUsers = Env.maxConcurrentRegUsers; + Env.maxConcurrentRegUsers = 0; + } + if (Env.maxActiveChannels) { + stats.maxConcurrentChannels = Env.maxActiveChannels; + Env.maxActiveChannels = 0; + } + rawBody.statistics = stats; + send(); }); - }); - - req.on('error', function () { - done(); - }); - - req.end(body); + return; + } + send(); }; Quota.shouldContactServer = function (Env) { return !(Env.blockDailyCheck === true || diff --git a/lib/stats.js b/lib/stats.js index d67a2ee71..d8d1d00ba 100644 --- a/lib/stats.js +++ b/lib/stats.js @@ -81,6 +81,7 @@ Stats.instanceData = function (Env) { if (Env.provideAggregateStatistics) { // check how many instances provide stats before we put more work into it data.providesAggregateStatistics = true; + data.statistics = {}; // Filled in lib/commands/quota.js because of async calls } return data; diff --git a/package-lock.json b/package-lock.json index 4c466b047..116ee1826 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "cryptpad", - "version": "2024.3.0", + "version": "2024.3.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "cryptpad", - "version": "2024.3.0", + "version": "2024.3.1", "license": "AGPL-3.0+", "dependencies": { "@mcrowe/minibloom": "^0.2.0", diff --git a/package.json b/package.json index 9317b2602..888af3227 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "cryptpad", "description": "realtime collaborative visual editor with zero knowledge server", - "version": "2024.3.0", + "version": "2024.3.1", "license": "AGPL-3.0+", "repository": { "type": "git", diff --git a/readme.md b/readme.md index e290cbb82..5707b4d71 100644 --- a/readme.md +++ b/readme.md @@ -6,7 +6,7 @@ SPDX-License-Identifier: AGPL-3.0-or-later # CryptPad -CryptPad is a collaboration suite that is end-to-end-encrypted and open-source. It is built to enable collaboration, synchronizing 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. +CryptPad is a collaboration suite that is end-to-end-encrypted and open-source. It is built to enable collaboration, synchronizing changes to documents in real time. Because all data are encrypted, in the eventuality of a breach, attackers have no way of seeing the stored content. Moreover, if the administators don’t alter the code, they and the service also cannot infer any piece of information about the users' content. ![Drive screenshot](screenshot.png "preview of the CryptDrive") @@ -24,7 +24,7 @@ Configuring CryptPad for production requires a little more work, but the process ## Current version -The most recent version and all past release notes can be found [here](https://github.com/cryptpad/cryptpad/releases/). +The most recent version and all past release notes can be found on the [releases page on GitHub](https://github.com/cryptpad/cryptpad/releases/). ## Setup using Docker @@ -36,7 +36,7 @@ Previously, Docker images were community maintained, had their own repository an CryptPad offers a variety of collaborative tools that encrypt your data in your browser before it is sent to the server and your collaborators. In the event that the server is -compromized the database holds encrypted data that is not of much value to attackers. +compromized, the database holds encrypted data that is not of much value to attackers. The code which performs the encryption is still loaded from the host server like any other web page, so you still need to trust the administrator to keep their server secure @@ -44,23 +44,29 @@ and to send you the right code. An expert can download code from the server and that it isn't doing anything malicious like leaking your encryption keys, which is why this is considered an [active attack]. -The platform is designed to minimize what data is exposed to its operators. User registration -and account access is based on a cryptographic key that is derived from your username -and password so the server never needs to see either and you don't need to worry about -whether they are being stored securely. It is impossible to verify whether a server's -operators are logging your IP or other activity, so if you consider this information -sensitive it is safest to assume it is being recorded and access your preferred instance -via [Tor browser]. +The platform is designed to minimize what data is exposed to its operators. User +registration and account access are based on cryptographic keys that are derived from your +username and password. Hence, the server never needs to see either, and you don't need to +worry about whether they are being stored securely. It is impossible to verify whether a +server's operators are logging your IP or other activity, so if you consider this +information sensitive it is safest to assume it is being recorded and access your +preferred instance via [Tor browser]. A correctly configured instance has safeguards to prevent collaborators from doing some nasty things like injecting scripts into collaborative documents or uploads. The project is actively maintained and bugs that our safeguards don't catch tend to get fixed quickly. For this reason it is best to only use instances that are running the most recent version, -which is currently on a three-week release cycle. It is difficult for a non-expert to +which is currently on a three-month release cycle. It is difficult for a non-expert to determine whether an instance is otherwise configured correctly, so we are actively -working on allowing administrators to opt in to a public directory of servers that +working on allowing administrators to opt in to a [public directory of +servers](https://cryptpad.org/instances/) that meet our strict criteria for safety. +For end users, a [guide](https://blog.cryptpad.org/2024/03/14/Most-Secure-CryptPad-Usage/) +is provided in our blog to help understanding the security of CryptPad. This blog post +also explains and show the best practices when using CryptPad and clarify what end-to-end +encryption entails and not. + # Translations CryptPad can be translated with nothing more than a web browser via our diff --git a/www/admin/inner.js b/www/admin/inner.js index cd1360d9c..bb930e247 100644 --- a/www/admin/inner.js +++ b/www/admin/inner.js @@ -2647,9 +2647,11 @@ define([ var onRefresh = function () { sFrameChan.query('Q_ADMIN_RPC', { cmd: 'REGISTERED_USERS', - }, function (e, data) { + }, function (e, arr) { pre.innerText = ''; - pre.append(String(data)); + let data = arr[0]; + pre.append(String(data.blocks)); + pre.append(' (old value including teams: ' + String(data.users) + ')'); // XXX }); }; onRefresh(); diff --git a/www/common/translations/messages.bg.json b/www/common/translations/messages.bg.json index 09a74f589..5216cce93 100644 --- a/www/common/translations/messages.bg.json +++ b/www/common/translations/messages.bg.json @@ -366,5 +366,46 @@ "login_invalUser": "Изисква се потребителско име", "login_confirm": "Потвърдете паролата", "login_unhandledError": "Възникна неочаквана грешка :(", - "settings_exportWarning": "Забележка: този инструмент все още е в бета версия и може да има проблеми с мащабируемостта. За по-добра производителност се препоръчва да оставите този раздел на фокус - без превключване на друг раздел." + "settings_exportWarning": "Забележка: този инструмент все още е в бета версия и може да има проблеми с мащабируемостта. За по-добра производителност се препоръчва да оставите този раздел на фокус - без превключване на друг раздел.", + "settings_export_reading": "Четене от вашият CryptDrive...", + "settings_export_download": "Изтегляне и декриптиране на вашите документи...", + "settings_export_compressing": "Данните се компресират...", + "settings_exportError": "Вижте грешките", + "settings_exportErrorEmpty": "Този документ не може да бъде експортиран (липсващо или невалидно съдържание).", + "settings_exportErrorOther": "Възникна грешка при опит за експортиране на този документ: {0}", + "settings_resetNewTitle": "Почистване на CryptDrive", + "settings_resetButton": "Премахване", + "settings_resetDone": "Вашият диск вече е празен!", + "settings_resetError": "Неправилен текст за потвърждение. Вашият CryptDrive не е променен.", + "settings_resetTipsAction": "Нулиране", + "settings_resetTips": "Съвети", + "settings_resetTipsButton": "Нулиране на наличните съвети в CryptDrive", + "settings_resetTipsDone": "Всички съвети вече са видими отново.", + "settings_thumbnails": "Миниатюри", + "settings_disableThumbnailsAction": "Деактивиране на създаването на миниатюри във вашия CryptDrive", + "settings_resetThumbnailsAction": "Почистване", + "settings_resetThumbnailsDescription": "Почистване на всички миниатюри на документи, съхранени във вашия браузър.", + "settings_resetThumbnailsDone": "Всички миниатюри са изтрити.", + "settings_importTitle": "Импортиране на последните документи в браузъра във вашия CryptDrive", + "settings_export_done": "Вашето сваляне приключи!", + "settings_exportErrorDescription": "Не успяхме да добавим следните документи в експортирания файл:", + "settings_exportErrorMissing": "Този документ липсва на нашите сървъри (изтекъл му е срокът на съхранение или е изтрит от собственика му)", + "settings_reset": "Премахване на всички файлове и папки от вашия CryptDrive", + "settings_resetPrompt": "С това действие ще премахне всички документи от вашето устройство.
Сигурни ли сте, че искате да продължите?
Напишете “Обичам CryptPad”, за да потвърдите.", + "settings_disableThumbnailsDescription": "Миниатюрите се създават автоматично и се съхраняват във вашия браузър, когато влезете в нов документ. Можете да деактивирате тази функция тук.", + "settings_autostoreTitle": "Съхранение на документи в CryptDrive", + "settings_import": "Импортиране", + "settings_importConfirm": "Сигурни ли сте, че искате да импортирате последните документи от този браузър в CryptDrive във потребителския ви акаунт?", + "settings_importDone": "Импортирането завърши", + "settings_autostoreHint": "Автоматично Всички документи, които ползвате, се съхраняват във вашия CryptDrive.
Ръчно (винаги се иска потвърждаване) Ако все още не сте съхранили документ, ще бъдете попитани дали искате, да ги съхранявате във вашия CryptDrive.
Ръчно (никога не се иска потвърждаване) Документите не се съхраняват автоматично във вашия CryptDrive. Опцията за съхраняването им ще бъде скрита.", + "settings_autostoreYes": "Автоматично", + "settings_autostoreNo": "Ръчно (никога не се иска потвърждаване)", + "settings_autostoreMaybe": "Ръчно (вининаги се иска потвърждаване)", + "settings_userFeedbackTitle": "Обратна връзка", + "settings_userFeedbackHint1": "CryptPad предоставя обратна връзка на сървъра, за да ни уведоми как да подобрим вашия опит. ", + "settings_userFeedbackHint2": "Съдържанието на вашите документи никога няма да бъде споделено със сървъра.", + "settings_userFeedback": "Активиране на обратната връзка с потребителя", + "settings_deleteTitle": "Изтриване на акаунта", + "settings_deleteHint": "Изтриването на акаунта е окончателно. Вашият CryptDrive и вашият списък с документи ще бъдат изтрити от сървъра. Останалите ви документи ще бъдат изтрити след 90 дни, ако никой друг не ги е съхранил в своя CryptDrive.", + "settings_deleteButton": "Изтриване на акаунта си" } diff --git a/www/common/translations/messages.eu.json b/www/common/translations/messages.eu.json index d2506ccbd..a1d0b0af1 100644 --- a/www/common/translations/messages.eu.json +++ b/www/common/translations/messages.eu.json @@ -1717,5 +1717,21 @@ "admin_supportEnabled": "Laguntza-sistema gaituta dago.", "admin_supportDisabled": "Laguntza-sistema desgaituta dago.", "admin_supportDelete": "Desgaitu laguntza", - "admin_colorHint": "Aldatu zure CryptPad instantziaren nabarmentze kolorea. Ziurtatu testua eta botoiak kontraste nahikoarekin irakur daitezkeela gai argietan zein ilunetan." + "admin_colorHint": "Aldatu zure CryptPad instantziaren nabarmentze kolorea. Ziurtatu testua eta botoiak kontraste nahikoarekin irakur daitezkeela gai argietan zein ilunetan.", + "admin_supportAdd": "Gehitu kontaktu bat laguntza-taldeari", + "admin_supportConfirm": "Ziur zaude? Honek lehendik dauden sarrera guztiak ezabatuko ditu eta moderatzaile guztien sarbidea blokeatuko da.", + "admin_supportMembers": "Laguntza taldea", + "admin_supportRotateNotify": "Abisua: gako berriak sortu dira baina ustekabeko errore batek sistemak moderatzaileei bidaltzea eragotzi du. Mesedez, kendu eta gehitu berriro laguntza-taldeko kide guztiak", + "support_cat_settings": "Ezarpenak", + "support_cat_search": "Bilatu", + "support_cat_closed": "Itxita", + "support_cat_open": "Sarrera-ontzia", + "support_cat_legacy": "Zaharra", + "support_pending": "Artxibatutako sarrerak:", + "support_pending_tag": "Artxibatuta", + "support_active_tag": "Sarrera-ontzia", + "support_closed_tag": "Itxita", + "support_privacyTitle": "Erantzun anonimoki", + "moderationPage": "Laguntza mahaia", + "admin_supportInit": "Hasieratu laguntza mahaia instantzia honetan" } diff --git a/www/common/translations/messages.fr.json b/www/common/translations/messages.fr.json index 58d4a3f96..3e36950f8 100644 --- a/www/common/translations/messages.fr.json +++ b/www/common/translations/messages.fr.json @@ -1249,8 +1249,8 @@ "form_makePublic": "Publier les réponses", "form_invalidQuestion": "Questions {0}", "form_invalidWarning": "Certaines réponses contiennent des erreurs :", - "form_input_ph_url": "https://exemple.fr", - "form_input_ph_email": "courriel@exemple.fr", + "form_input_ph_url": "https://example.net/exemple", + "form_input_ph_email": "courriel_exemple@example.net", "form_notAnswered": "{0} réponses vides", "form_answerWarning": "Identité non confirmée", "form_answerName": "Réponse de {0} le {1}", diff --git a/www/common/translations/messages.hu.json b/www/common/translations/messages.hu.json index ebb4b3c7b..a6957d7e4 100644 --- a/www/common/translations/messages.hu.json +++ b/www/common/translations/messages.hu.json @@ -331,5 +331,95 @@ "status": "Állapotlap", "access_passwordUsed": "Ennek a dokumentumnak ez már volt jelszava . Nem használható többször.", "admin_diskUsageWarning": "Figyelem! A példányon tárolt adatmennyiségtől függően ez a riport elhasználhatja akár a server teljes memóriáját és lefagyáshoz vezethet.", - "poll_comment_disabled": "A ✓ gommbal tudod a kérdőívet publikálni, ezután lehet kommentálni." + "poll_comment_disabled": "A ✓ gommbal tudod a kérdőívet publikálni, ezután lehet kommentálni.", + "fm_removePermanentlyDialog": "Tuti kiakarod törtölni ezt a Driveból? Ez a fájl megmarad a többi felhasználok számára akik eltárolták.", + "fm_contextMenuError": "Nem tudtuk megnyitni a menüt ehez. Ha továbbra is fennmarad ez a probléma, frissítse az oldalt.", + "fm_removeSeveralPermanentlyDialog": "Biztosan akarod törölni ezt a {0} elemet a tárhelyedről? De továbbra is megmaradnak a többi felhasználó tárhelyén, akik szintén tárolták ezeket.", + "fm_deleteOwnedPads": "Biztos vagy benne hogy véglegesen megsemmisíted ezt a fájlt?", + "fm_restoreDialog": "Biztosan helyreállitja a/az {0}-t az eredeti helyére?", + "fm_unknownFolderError": "A kiválasztott vagy legutóbb megtekintett mappa már nem létezik. Szülő-mappa megnyitása...", + "fm_selectError": "Nem lehet kiválasztani a célzott elemet. Ha a probléma továbbra is fennáll, próbálja újratölteni az oldalt.", + "fm_categoryError": "Nem lehet megnyitni a kiválasztott kategóriát, a gyökérmappát mutatjuk.", + "fm_info_root": "Tetszőleges mélységű mapparendszert hozhatsz létre a fájljaid rendezésére.", + "fm_info_template": "Ezek a dokumentumok sablonként vannak tárolva. Új dokumentumok létrehozásához lehet őket használni.", + "fm_info_recent": "Ezelet a dokumentumokat a közelmúltban megnyitották vagy módosították (Te, vagy a közreműködők).", + "fm_info_trash": "Ürítsd ki a Kukát a CryptDrive tárhelyed felszabadításához.", + "fm_info_sharedFolder": "Ez egy megosztott mappa. Nem vagy bejelentkezve, ezért Számodra ez csak olvasható.
Regisztrálj, vagy Jelentkezz be, hogy importálhas a CryptDrive-odra, és szerkeszthesd a tartalmát.", + "fm_info_anonymous": "Nem vagy bejelentkezve, így a dokumentumaid {0} nap múlva lejárnak. Ha törlődik a böngésződ gyorsítótára, elvesznek.
Regisztrálj (nincs szükség személyes adatok megadására) vagy Jelentkezz be, hogy tárolhasd őket hosszabb távon. Tudj meg többet a a regisztrált CryptPad-fiókokról!.", + "fm_renamedPad": "Egyéni nevet állított be ehhez a dokumentumhoz. A neve:
{0}", + "fm_canBeShared": "Ez a mappa megosztható", + "fm_prop_tagsList": "Címkék", + "fm_burnThisDriveButton": "Törölje a CryptPad által tárolt összes információt a böngészőből", + "fm_burnThisDrive": "Biztos, hogy el akar távolítani mindent, amit a CryptPad tárol a böngészőjében?
Ez eltávolítja a CryptDrive-ot és annak előzményeit a böngészőjéből, de a dokumentumai továbbra is létezni fognak (titkosítva) a szerverünkön.", + "fm_padIsOwned": "Ön ennek a dokumentumnak a tulajdonosa", + "fm_padIsOwnedOther": "Ez a dokumentum egy másik felhasználó tulajdonában van", + "fm_tags_name": "Címke neve", + "fm_tags_used": "Felhasználások száma", + "fm_restoreDrive": "A meghajtó visszaállítása egy korábbi állapotba. A legjobb eredmény elérése érdekében ne végezzen változtatásokat a meghajtón, amíg ez a folyamat be nem fejeződött.", + "fc_newfolder": "Új mappa", + "fc_rename": "Átnevezés", + "fc_color": "Szín megváltoztatása", + "fc_open": "Megnyitás", + "fc_open_ro": "Megnyitás (csak olvasás)", + "fc_expandAll": "Minden kinyitása", + "fc_delete": "Kukába helyezés", + "fc_delete_owned": "Megsemmisítés", + "fc_restore": "Visszaállítás", + "fc_remove": "Kitörlés", + "fc_remove_sharedfolder": "Eltávolitás", + "fc_empty": "Kuka kiürítése", + "fc_prop": "Tulajdonságok", + "fc_hashtag": "Címkék", + "settingsButton": "Beállítások", + "login_username": "Felhasználónév", + "login_password": "Jelszó", + "register_header": "Regisztrálás", + "register_cancel": "Mégse", + "settings_cat_account": "Fiók", + "settings_cat_drive": "Drive", + "settings_cat_code": "Kód", + "settings_cat_subscription": "Feliratkozás", + "settings_title": "Beállitások", + "settings_save": "Mentés", + "settings_restore": "Helyreállítás", + "settings_resetButton": "Eltávolitás", + "settings_resetTipsAction": "Visszaállítás", + "settings_resetTips": "Tippek", + "settings_resetThumbnailsAction": "Törlés", + "settings_autostoreYes": "Automatikus", + "settings_userFeedbackTitle": "Visszajelzés", + "upload_cancelled": "Megszakított", + "upload_size": "Méret", + "download_mt_button": "Letöltése", + "download_dl": "Letöltés", + "download_step1": "Letöltés", + "download_step2": "Visszatitkósitás", + "todo_title": "CryptTodo", + "mdToolbar_help": "Segítség", + "mdToolbar_bold": "Vastag", + "mdToolbar_italic": "Döltbető", + "mdToolbar_strikethrough": "Áthúzott", + "mdToolbar_link": "Link", + "mdToolbar_quote": "Idézés", + "mdToolbar_code": "Kód", + "about": "Rólunk", + "features_anon": "Vendég", + "features_registered": "Regisztrált", + "features_premium": "Premium", + "edit": "Szerkesztés", + "view": "Megtekintés", + "fm_deletedPads": "Ezek a dokumentumok már nem léteznek a szerveren, eltávolításra kerültek a CryptDrive-ról: {0}", + "fc_collapseAll": "Minden bezárása", + "register_warning": "Figyelmeztetés", + "mdToolbar_tutorial": "https://www.markdowntutorial.com/", + "fm_info_owned": "Ön a tulajdonosa az itt megjelenített dokumentumoknak. Ez azt jelenti, hogy bármikor véglegesen eltávolíthatja őket a szerverről. Ha ezt megteszi, más felhasználók többé nem férhetnek hozzá hozzájuk.", + "fm_moveNestedSF": "Egy megosztott mappát nem helyezhet el egy másik mappán belül. A {0} mappa nem lett áthelyezve.", + "fm_passwordProtected": "Jelszóvédett", + "fc_newsharedfolder": "Új megosztott mappa", + "settings_cat_cursor": "Egérmutató", + "settings_thumbnails": "Előnézet", + "settings_import": "Importálás", + "upload_pending": "Függöben lévő", + "upload_up": "Feltöltés", + "features_f_subscribe": "Feliratkozás" } diff --git a/www/common/translations/messages.it.json b/www/common/translations/messages.it.json index f764e2779..895e05b53 100644 --- a/www/common/translations/messages.it.json +++ b/www/common/translations/messages.it.json @@ -879,7 +879,7 @@ "team_inviteButton": "Invita membri", "owner_request": "{0} propone tu sia proprietario/a di {1}", "team_cat_general": "Informazioni", - "properties_passwordWarning": "La password è stata modificata con successo ma non è stato possibile aggiornare il tuo CryptDrive con i nuovi dati. Potrebbe essere necessario rimuovere la vecchia versione del documento manualmente. Premi OK per ricaricare e aggiornare i tuoi diritti d'accesso.", + "properties_passwordWarning": "La password è stata modificata con successo ma non è stato possibile aggiornare il tuo CryptDrive con i nuovi dati. Potrebbe essere necessario rimuovere la vecchia versione del documento manualmente.
Premi OK per ricaricare e aggiornare i tuoi diritti d'accesso.", "share_embedCategory": "Incorpora", "chrome68": "Sembra tu stia usando il browser Chrome o Chromium versione 68. Questa versione contiene un errore che fa sì che la pagina diventi completamente bianca dopo alcuni secondi o che la pagina non risponda ai clic. Per risolvere il problema puoi passare ad un'altra scheda e poi tornare a questa, oppure puoi provare a scorrere la pagina. Questo problema sarà risolto nella prossima versione del tuo browser.", "crowdfunding_popup_text": "

Abbiamo bisogno del tuo aiuto!

Per garantire lo sviluppo attivo di CryptPad, valuta di sostenere il progetto tramite la nostra pagina Open Collective, dove potrai vedere il nostro Cronoprogramma e gli obiettivi di finanziamento.", diff --git a/www/common/translations/messages.pl.json b/www/common/translations/messages.pl.json index eade0f43f..096f45276 100644 --- a/www/common/translations/messages.pl.json +++ b/www/common/translations/messages.pl.json @@ -4,19 +4,19 @@ "pad": "Pad", "code": "Kod", "poll": "Balot", - "slide": "Prezentacja Markdown", + "slide": "Slajdy Markdown", "contacts": "Kontakty", "file": "Plik", "kanban": "Kanban", "presentation": "Prezentacja", "doc": "Dokument", "form": "Formularz", - "teams": "Grupy", + "teams": "Zespoły", "sheet": "Arkusz", "todo": "Do zrobienia", "media": "Media", "whiteboard": "Tablica", - "drive": "CryptDrive", + "drive": "Dysk", "diagram": "Diagram" }, "disconnected": "Rozłączony", @@ -55,7 +55,7 @@ "upgradeAccount": "Ulepsz swoje konto", "upgrade": "Ulepsz", "language": "Język", - "userlist_offline": "Jesteś w trybie offline, lista użytkowników nie jest dostępna.", + "userlist_offline": "Nie masz obecnie dostępu do internetu, lista użytkowników nie jest dostępna.", "errorState": "Błąd krytyczny: {0}", "forgotten": "Przeniesiono do kosza", "initializing": "Inicjalizacja...", @@ -63,7 +63,7 @@ "realtime_unrecoverableError": "Wystąpił nieodwracalny błąd. Wciśnij OK, aby odświeżyć stronę.", "disabledApp": "Ta aplikacja nie jest dostępna. Skontaktuj się z administratorem, aby uzyskać więcej informacji.", "mustLogin": "Musisz być zalogowany/a aby otrzymać dostęp do tej strony", - "deletedFromServer": "Dokument zniszczony", + "deletedFromServer": "Dokument został zniszczony", "deleted": "Usunięto", "saved": "Zapisano", "error": "Błąd", @@ -74,8 +74,8 @@ "invalidHashError": "Dokument, który chcesz zobaczyć ma błędny adres URL.", "chainpadError": "Podczas aktualizacji zawartości wystąpił krytyczny błąd. Dokument wyświetlany jest w trybie tylko do odczytu, aby umożliwić zachowanie wyników pracy.
Wciśnij klawisz Esc aby wyświetlić dokument lub odśwież stronę, by spróbować wrócić do trybu edycji.", "inactiveError": "Ten dokument został usunięty z powodu braku aktywności. Wciśnij klawisz Esc, aby stworzyć nowy dokument.", - "deletedError": "Ten dokument został usunięty i nie jest już dostępny.", - "expiredError": "Ten dokument został zniszczony i nie jest już dostępny.", + "deletedError": "Dokument został usunięty i nie jest już dostępny.", + "expiredError": "Dokument wygasł i nie jest już dostępny.", "anonymousStoreDisabled": "Administrator tej instancji wyłączył zapisywanie danych dla niezalogowanych użytkowników. Zaloguj się, aby otrzymać dostęp do aplikacji.", "padNotPinnedVariable": "Dokument zostanie usunięty po {4} dniach braku aktywności, {0}zaloguj się{1} lub {2}zarejestruj{3} aby go zachować.", "padNotPinned": "Ten dokument zostanie usunięty po 3 miesiącach braku aktywności, {0}zaloguj się{1} lub {2}zarejestruj{3} aby go zachować.", @@ -357,7 +357,7 @@ "settings_cat_pad": "Tekst sformatowany", "settings_cat_code": "Kod", "settings_cat_cursor": "Kursor", - "settings_cat_drive": "CryptDrive", + "settings_cat_drive": "Dysk", "settings_cat_account": "Konto", "register_emailWarning3": "Jeśli to rozumiesz i chcesz używać swojego adresu e-mail jako nazwy użytkownika, kliknij OK.", "register_emailWarning2": "Nie będziesz mógł zresetować swojego hasła za pomocą swojego e-maila, tak jak można to zrobić w przypadku innych usług.", @@ -438,14 +438,14 @@ "support_close": "Zamknij zgłoszenie", "support_answer": "Odpowiedz", "support_listHint": "Oto lista zgłoszeń wysłanych do administratorów i ich odpowiedzi. Zamknięte zgłoszenie nie może być ponownie otwarte, ale możesz utworzyć nowe. Możesz ukryć zgłoszenia, które zostały zamknięte.", - "support_listTitle": "Zgłoszenia wsparcia technicznego", + "support_listTitle": "Zgłoszenia pomocy technicznej", "support_cat_tickets": "Aktualne zgłoszenia", "support_formMessage": "Wpisz swoją wiadomość…", "support_formContentError": "Błąd: treść jest pusta", "support_formTitleError": "Błąd: tytuł jest pusty", "support_formButton": "Wyślij", "support_formHint": "Użyj tego formularza, aby bezpiecznie skontaktować się z administratorami.
Proszę zauważyć, że niektóre kwestie/pytania mogą być już poruszone w Podręczniku użytkownika programu CryptPad. Prosimy nie tworzyć nowego zgłoszenia, jeśli masz już otwarte zgłoszenie dotyczące tego samego problemu. Zamiast tego odpowiedz na oryginalną wiadomość, podając dodatkowe informacje.", - "support_formTitle": "Nowe zgłoszenie", + "support_formTitle": "Nowe Zgłoszenie", "support_cat_new": "Nowe zgłoszenie", "support_disabledHint": "Ta instancja CryptPad nie jest jeszcze skonfigurowana do korzystania z formularza pomocy technicznej.", "support_disabledTitle": "Wsparcie nie jest włączone", @@ -457,8 +457,8 @@ "admin_supportAddKey": "Dodaj klucz prywatny", "admin_supportInitPrivate": "Twoja instancja CryptPad ma skonfigurowany adres wsparcia technicznego, ale Twoje konto nie ma poprawnego klucza prywatnego, aby uzyskać do niej dostęp. Użyj poniższego formularza, aby dodać lub zaktualizować klucz prywatny do swojego konta.", "admin_supportInitHelp": "Twój serwer nie jest jeszcze skonfigurowany do używania skrzynki pocztowej służącej do udzielania pomocy technicznej. Jeśli chcesz, aby skrzynka pocztowa służąca do udzielania pomocy technicznej otrzymywała wiadomości od Twoich użytkowników, powinieneś poprosić administratora serwera o uruchomienie skryptu znajdującego się w \"./scripts/generate-admin-keys.js\", a następnie zapisanie klucza publicznego w pliku \"config.js\" i przesłanie Ci klucza prywatnego.", - "admin_cat_support": "Pomoc", - "supportPage": "Pomoc", + "admin_cat_support": "Wsparcie", + "supportPage": "Wsparcie", "fm_info_sharedFolderHistory": "To jest tylko historia Twojego folderu współdzielonego: {0}
Twój CryptDrive pozostanie w trybie tylko do odczytu podczas nawigacji.", "notifications_dismiss": "Odrzuć", "share_withFriends": "Udostępnij", @@ -499,7 +499,7 @@ "contact_devHint": "Na prośby o funkcje, poprawę użyteczności lub podziękowania.", "contact_dev": "Skontaktuj się z twórcami", "contact_adminHint": "W przypadku jakichkolwiek problemów związanych z kontem użytkownika, limitem pamięci lub dostępnością usługi.\n", - "contact_admin": "Skontaktuj się z administratorami w celu: {0}", + "contact_admin": "Skontaktuj się z administratorami: {0}", "footer_donate": "Przekaż darowiznę", "admin_flushCacheDone": "Pamięć podręczna wyczyszczona pomyślnie", "admin_flushCacheButton": "Wyczyść pamięć podręczną", @@ -516,7 +516,7 @@ "admin_activeSessionsHint": "Liczba aktywnych połączeń websocket (i połączonych unikalnych adresów IP)", "admin_activeSessionsTitle": "Aktywne połączenia", "adminPage": "Administracja", - "admin_cat_stats": "Statystyka", + "admin_cat_stats": "Statystyki", "admin_cat_general": "Ogólne", "admin_authError": "Tylko administratorzy mogą mieć dostęp do tej strony", "fm_expirablePad": "Traci ważność: {0}", @@ -558,7 +558,7 @@ "share_linkCopy": "Kopiuj link", "share_linkOpen": "Otwórz link", "share_linkPresent": "Obecny", - "share_linkView": "Pokaż", + "share_linkView": "Podgląd", "share_linkEdit": "Edytuj", "share_linkAccess": "Prawa dostępu do danych", "share_linkCategory": "Link", @@ -642,7 +642,7 @@ "about": "O stronie", "main_catch_phrase": "Pakiet do współpracy
end-to-end szyfrowany i oparty na otwartym kodzie źródłowym", "home_host": "To jest niezależna wersja społecznościowa CryptPada.", - "mdToolbar_toc": "Spis treści", + "mdToolbar_toc": "Spis Treści", "mdToolbar_code": "Kod", "mdToolbar_check": "Lista zadań", "mdToolbar_list": "Lista punktowana", @@ -843,7 +843,7 @@ "form_type_md": "Opis", "form_sort_hint": "Proszę przeciągnąć te pozycje od najbardziej (1) do najmniej ({0}) preferowanych.", "form_type_sort": "Lista uporządkowana", - "form_type_poll": "Sonda", + "form_type_poll": "Ankieta", "form_type_multiradio": "Macierz wyboru", "form_type_multicheck": "Macierz pól wyboru", "form_type_checkbox": "Pole wyboru", @@ -963,8 +963,8 @@ "pad_settings_width_large": "Pełna szerokość", "pad_settings_width_small": "Tryb strony", "pad_settings_info": "Domyślne ustawienia dla tego dokumentu. Zostaną one zastosowane, gdy nowi użytkownicy będą odwiedzać ten dokument.", - "pad_settings_title": "Ustawienia dokumentu", - "settings_colorthemeTitle": "Motyw kolorystyczny", + "pad_settings_title": "Ustawienia Dokumentu", + "settings_colorthemeTitle": "Kolor motywu", "settings_colorthemeHint": "Zmień kolory CryptPada na tym urządzeniu.", "settings_colortheme_default": "Domyślne ustawienie systemowe ({0})", "settings_colortheme_light": "Jasny", @@ -993,8 +993,8 @@ "offlineError": "Nie można zsynchronizować najnowszych danych, ta strona nie może zostać wyświetlona w tej chwili. Ładowanie będzie kontynuowane po przywróceniu połączenia z serwisem.", "share_noContactsOffline": "Jesteś obecnie w trybie offline. Kontakty nie są dostępne.", "access_offline": "Jesteś obecnie w trybie offline. Zarządzanie dostępem nie jest dostępne.", - "admin_support_last": "Zaktualizowany w dniu: ", - "admin_support_first": "Utworzony w dniu: ", + "admin_support_last": "Zaktualizowano: ", + "admin_support_first": "Utworzono: ", "admin_support_collapse": "Zwiń", "admin_support_open": "Pokaż", "admin_support_closed": "Zamknięte zgłoszenia:", @@ -1005,7 +1005,7 @@ "history_trimPrompt": "Ten dokument ma zapisaną {0} historię, która może spowolnić czas ładowania. Rozważ usunięcie historii, jeśli nie jest ona potrzebna.", "mediatag_loadButton": "Wczytaj załącznik", "settings_mediatagSizeHint": "Maksymalny rozmiar w megabajtach (MB) dla automatycznie ładowanych elementów multimedialnych (obrazy, wideo, pdf) osadzonych w dokumentach. Elementy większe niż podany rozmiar mogą zostać załadowane ręcznie. Użyj \"-1\", aby zawsze ładować elementy multimedialne automatycznie.", - "settings_mediatagSizeTitle": "Automatyczny limit pobierania", + "settings_mediatagSizeTitle": "Automatyczny limit pobrań", "mediatag_notReady": "Proszę dokończyć pobieranie", "pad_mediatagOpen": "Otwórz plik", "pad_mediatagShare": "Udostępnij plik", @@ -1014,11 +1014,11 @@ "download_zip_file": "Plik {0}/{1}", "download_zip": "Tworzenie pliku ZIP…", "fileTableHeader": "Pobrane i przesłane dane", - "allowNotifications": "Zezwól na powiadomienia", - "archivedFromServer": "Zarchiwizowany dokument", + "allowNotifications": "Wszystkie powiadomienia", + "archivedFromServer": "Dokument zarchiwizowany", "restoredFromServer": "Przywrócony dokument", - "admin_archiveInput2": "Hasło do dokumentu", - "admin_archiveInput": "Adres URL dokumentu", + "admin_archiveInput2": "Hasło dokumentu", + "admin_archiveInput": "URL dokumentu", "admin_unarchiveButton": "Przywróc", "admin_unarchiveHint": "Przywróć dokument, który został wcześniej zarchiwizowany", "admin_archiveButton": "Archiwizuj", @@ -1058,10 +1058,10 @@ "admin_defaultlimitTitle": "Maksymalny limit przechowywania danych (MB)", "admin_registrationTitle": "Zamknij rejestrację", "admin_registrationHint": "Nie zezwalaj nowym użytkownikom na rejestrację", - "snapshots_cantMake": "Nie można utworzyć zrzutu obrazu. Jesteś rozłączony.", - "snapshots_notFound": "Ten zrzut obrazu już nie istnieje, ponieważ historia tego dokumentu została usunięta.", - "snapshot_error_exists": "Istnieje już zrzut tej wersji", - "snapshots_ooPickVersion": "Przed utworzeniem zrzutu obrazu należy wybrać wersję", + "snapshots_cantMake": "Nie można utworzyć obrazu. Jesteś rozłączony.", + "snapshots_notFound": "Ten obraz już nie istnieje, ponieważ historia tego dokumentu została usunięta.", + "snapshot_error_exists": "Istnieje już obraz tej wersji", + "snapshots_ooPickVersion": "Przed utworzeniem obrazu należy wybrać wersję", "oo_version": "Wersja: ", "oo_version_latest": "Najnowsza", "snapshots_delete": "Usuń", @@ -1069,10 +1069,10 @@ "snapshots_close": "Zamknij", "snapshots_restore": "Przywróć", "snapshots_open": "Otwórz", - "snapshots_placeholder": "Tytuł zrzutu obrazu", - "snapshots_new": "Nowy zrzut obrazu", - "snapshots_button": "Zrzuty obrazów", - "snaphot_title": "Zrzut obrazu", + "snapshots_placeholder": "Nazwa obrazu", + "snapshots_new": "Nowy obraz", + "snapshots_button": "Obrazy dokumentu", + "snaphot_title": "Obraz dokumentu", "infobar_versionHash": "Obecnie przeglądasz poprzednią wersję tego dokumentu ({0}).", "history_restoreDriveDone": "CryptDrive przywrócony", "history_restoreDrivePrompt": "Czy na pewno chcesz zastąpić aktualną wersję CryptDrive wyświetloną wersją?", @@ -1198,7 +1198,7 @@ "form_answerWarning": "Niepotwierdzona tożsamość", "form_answerName": "Odpowiedź od {0} na {1}", "form_backButton": "Wstecz", - "form_viewButton": "Pokaż", + "form_viewButton": "Podgląd", "form_answerAnonymous": "Odpowiedź anonimowa w dniu {0}", "form_showSummary": "Pokaż podsumowanie", "form_showIndividual": "Pokaż poszczególne odpowiedzi", @@ -1433,7 +1433,7 @@ "admin_noticeTitle": "Ogłoszenie na stronie głównej", "admin_noticeHint": "Opcjonalny komunikat wyświetlany na stronie głównej", "ui_true": "prawda", - "admin_usersTitle": "Katalog Użytkownika", + "admin_usersTitle": "Katalog użytkowników", "home_location": "Zaszyfrowane dane znajdują się w {0}", "home_morestorage": "By uzyskać więcej miejsca:", "register_instance": "Tworzenie nowego konta na {0}", @@ -1452,7 +1452,7 @@ "admin_documentSize": "Rozmiar dokumentu", "admin_documentMetadata": "Aktualne metadane", "admin_documentCreationTime": "Stworzono", - "admin_channelArchived": "Zarchiwizowano", + "admin_channelArchived": "Archiwalny", "admin_documentMetadataPlaceholder": "ID lub adres URL dokumentu", "admin_currentlyOnline": "Obecnie dostępni", "admin_storageUsage": "Przechowywane dane", @@ -1464,7 +1464,7 @@ "admin_planlimit": "Limit pamięci", "admin_getRawMetadata": "Historia metadanych", "og_teamDrive": "Dysk grupowy", - "admin_cat_users": "Katalog Użytkownika", + "admin_cat_users": "Katalog użytkowników", "admin_archiveReason": "Podaj powód archiwizacji i potwierdź, że chcesz kontynuować", "admin_accountMetadataPlaceholder": "ID Użytkownika (klucz publiczny)", "footer_website": "Strona Projektu", @@ -1482,7 +1482,7 @@ "admin_planName": "Nazwa planu", "admin_note": "Adnotacja planu", "admin_archiveBlock": "Zarchiwizuj segment", - "admin_restoreBlock": "Przywróć segment", + "admin_restoreBlock": "Przywróć archiwalny segment", "og_login": "Zaloguj się do {0}", "og_register": "Zarejestruj konto w {0}", "og_contact": "{0} Kontakt", @@ -1491,10 +1491,10 @@ "ui_jsRequired": "JavaScript musi być włączony, aby wykonać szyfrowanie w przeglądarce", "og_encryptedAppType": "Zaszyfrowany {0}", "admin_documentConflict": "Zarchiwizuj/przywróć", - "admin_conflictExplanation": "Istnieją dwie wersje tego dokumentu. Przywrócenie zarchiwizowanej wersji spowoduje nadpisanie obecnej wersji. Archiwizacja obecnej wersji spowoduje nadpisanie wersji zarchiwizowanej. Nie będzie możliwe cofnięcie żadnej z tych czynności.", + "admin_conflictExplanation": "Istnieją dwie wersje tego dokumentu. Przywrócenie wersji archiwalnej spowoduje nadpisanie obecnej. Archiwizacja obecnej wersji spowoduje nadpisanie archiwalnej. Nie będzie możliwe cofnięcie żadnej z tych czynności.", "fm_filterBy": "Filtr", "fm_rmFilter": "Wyłącz filtr", - "calendar_rec": "Powtórz", + "calendar_rec": "Powtarzaj", "calendar_rec_no": "Raz", "calendar_rec_daily": "Codziennie", "calendar_rec_stop": "Zatrzymaj powtarzanie", @@ -1504,16 +1504,16 @@ "calendar_rec_edit_from": "Edytuj przyszłe wydarzenia", "calendar_rec_edit_one": "Edytuj tylko to wydarzenie", "calendar_rec_weekend": "Codziennie w weekendy", - "calendar_rec_updated": "Zasada zmieniona w {0}", + "calendar_rec_updated": "Zasada zmieniona {0}", "calendar_rec_yearly": "Raz na rok, w {2}", "admin_blockAvailable": "Segment dostępny", - "admin_blockArchived": "Segment zarchiwizowany", + "admin_blockArchived": "Segment został zarchiwizowany", "admin_firstPinTime": "Data najstarszej pinezki", "admin_lastPinTime": "Data najnowszej pinezki", "admin_pinLogAvailable": "Dostępny log pinezek", - "admin_pinLogArchived": "Log pinezek jest zarchiwizowany", + "admin_pinLogArchived": "Log pinezek został zarchiwizowany", "admin_getPinList": "Lista obecnych pinezek", - "og_default": "CryptPad: end-to-end szyfrowany pakiet narzędzi do współpracy", + "og_default": "CryptPad: szyfrowany end-to-end pakiet narzędzi do współpracy", "calendar_rec_edit": "Powtarzające się wydarzenie", "calendar_str_filter_day": "Dni: {0}", "calendar_rec_weekdays": "Codziennie w weekendy", @@ -1588,7 +1588,7 @@ "duplicate": "Duplikat", "mfa_revoke_label": "Aby wyłączyć 2FA, na początku wprowadź swoje hasło", "mfa_revoke_button": "Potwierdź wyłączenie 2FA", - "team_nameAlreadySet": "Zespół już nazywa się {0}", + "team_nameAlreadySet": "{0} jest już nazwą zespołu", "selectLanguage": "Wybierz język", "dph_reason": "Powód: {0}", "dph_sf_destroyed_team": "Folder współdzielony {0} na dysku zespołowym {1} został zniszczony przez właściciela", @@ -1642,11 +1642,11 @@ "recovery_mfa_error": "Nieznany błąd. Odśwież i spróbuj ponownie.", "recovery_mfa_disabled": "Uwierzytelnianie dwuetapowe jest już wyłączone dla tego konta.", "recovery_mfa_secret_ph": "Kod odzyskiwania", - "admin_invitationTitle": "Linki do zaproszeń", - "admin_invitationCreate": "Stwórz link do zaproszenia", - "admin_invitationEmail": "Adres email użytkownika", + "admin_invitationTitle": "Zaproszenia", + "admin_invitationCreate": "Stwórz zaproszenie", + "admin_invitationEmail": "Email użytkownika", "admin_usersRemove": "Usuń", - "register_invalidToken": "Link zaproszenia jest nieprawidłowy", + "register_invalidToken": "Zaproszenie jest nieprawidłowe", "label_logo": "Logo CryptPad", "recovery_mfa_secret": "Wprowadź swój kod odzyskiwania aby wyłączyć 2FA dla swojego konta:", "login_notFilledUser": "Wprowadź nazwę użytkownika", @@ -1668,12 +1668,12 @@ "loading_recover": "Nie możesz zdobyć kodu? Przywróć swoje konto", "goLeft": "Lewo", "ssoauth_header": "Hasło CryptPad", - "ssoauth_form_hint_login": "Wprowadź swoje konto CryptPad", + "ssoauth_form_hint_login": "Wprowadź swoje hasło CryptPad", "kanban_showTags": "Wszystkie tagi", "kanban_hideTags": "Mniej tagów", "admin_forcemfaTitle": "Wymagaj Uwierzytelniania Dwuetapowego", "admin_forcemfaHint": "Wszyscy użytkownicy tej instancji zostaną poproszeni o skonfigurowanie uwierzytelniania dwuetapowego, aby zalogować się do swojego konta.", - "support_recordedContent": "Zawartość", + "support_recordedContent": "Treść", "support_legacyDump": "Wyeksportuj wszystko", "support_legacyClear": "Usuń to konto", "mfa_disable": "Wyłącz 2FA", @@ -1690,5 +1690,78 @@ "recovery_forgot_text": "Skopiuj następujące informacje i prześlij je administratorom swojej instancji", "goRight": "Prawo", "loading_mfa_required": "Uwierzytelnianie dwuetapowe jest wymagane na tej instancji. Uaktualnij swoje kono z użyciem aplikacji uwierzytelniającej i poniższego formularza.", - "admin_invitationLink": "Link do zaproszenia" + "admin_invitationLink": "Zaproszenie", + "admin_registrationSsoTitle": "Zamknij rejestrację SSO", + "admin_usersAdd": "Dodaj istniejącego użytkownika", + "admin_storeInvitedLabel": "Automatycznie dodaj zaproszonych użytkowników", + "admin_usersRemoveConfirm": "Czy na pewno chcesz usunąć użytkownika z katalogu? Nadal będą mieć dostęp do i będą w stanie używać swojego konta.", + "ssoauth_form_hint_register": "Dodaj hasło CryptPad aby zwiększyć poziom zabezpieczenia, lub pozostaw puste i kontynuuj. Jeśli nie dodasz hasła, klucze chroniące Twoje dane będą dostępne dla administratorów instancji.", + "label_viewMode": "Włącz tryb podglądu", + "team_nameTooLong": "Zbyt długa nazwa zespołu (maks. 50 znaków)", + "context_menu": "Akcje folderów", + "admin_accountReport": "Raport archiwizacji konta", + "admin_accountReportFull": "Pobierz raport szczegółowy", + "admin_channelPlaceholder": "Zastępstwo zniszczonego dokumentu", + "status": "Status strony", + "admin_diskUsageWarning": "Uwaga! W zależności od ilości danych przechowywanych w tej instancji, wygenerowanie raportu może pochłonąć całą pamięć dostępną na serwerze i spowodować awarię.", + "calendar_rec_change": "Przenoszenie powtarzającego się wydarzenia do innego kalendarza. Zmiana może zostać zrobiona tylko dla tego wydarzenia, lub dla wszystkich jego powtórzeń.", + "calendar_rec_change_first": "Przenoszenie pierwszego powtarzającego się wydarzenia do innego kalendarza. Powtórzenia również zostaną przeniesione.", + "admin_cat_security": "Bezpieczeństwo", + "admin_cat_customize": "Dostosuj", + "admin_colorTitle": "Kolor akcentu", + "admin_logoTitle": "Własne logo", + "admin_supportAdd": "Dodaj kontakt do zespołu pomocy technicznej", + "admin_logoHint": "SVG, PNG lub JPG, maksymalny rozmiar 200KB", + "admin_logoButton": "Prześlij nowe", + "admin_logoRemoveButton": "Przywróć domyślne", + "admin_colorHint": "Zmień kolor akcentu Twojej instancji CryptPad. Dopilnuj, żeby tekst i przyciski były czytelne i posiadały wystarczający kontrast zarówno dla jasnego jak i ciemnego motywu.", + "admin_colorCurrent": "Obecny kolor akcentu", + "admin_colorChange": "Zmień kolor", + "admin_colorPick": "Wybierz kolor", + "admin_colorPreview": "Podgląd koloru", + "admin_supportSetupTitle": "Inicjalizuj pomoc", + "admin_supportEnabled": "System pomocy jest włączony.", + "admin_supportConfirm": "Jesteś pewien? Usuniesz wszystkie istniejące zgłoszenia i zablokujesz dostęp wszystkim moderatorom.", + "admin_supportDisabled": "System pomocy jest wyłączony.", + "admin_supportDelete": "Wyłącz pomoc", + "admin_supportMembers": "Zespół pomocy technicznej", + "support_cat_search": "Szukaj", + "support_cat_settings": "Ustawienia", + "support_cat_closed": "Zamknięte", + "support_cat_open": "Skrzynka odbiorcza", + "support_openTicketTitle": "Otwórz zgłoszenie dla użytkownika", + "support_cat_legacy": "Poprzednie", + "support_pending": "Zgłoszenia archiwalne:", + "support_pending_tag": "Archiwalne", + "support_active_tag": "Skrzynka odbiorcza", + "support_closed_tag": "Zamknięte", + "support_privacyTitle": "Odpowiedz anonimowo", + "support_privacyHint": "Zaznacz tę opcję żeby odpowiedzieć jako 'Zespół Pomocy Technicznej' zamiast własną nazwą użytkownika", + "support_notificationsTitle": "Wyłącz powiadomienia", + "support_userChannel": "ID kanału powiadomień użytkownika", + "support_openTicketHint": "Skopiuj dane użytkownika odbiorcy z ich profilu lub z istniejącego zgłoszenia. Otrzymają powiadomienie o wiadomości.", + "support_recordedId": "ID formatki (unikalny)", + "support_userKey": "Klucz publiczny użytkownika", + "support_invalChan": "Nieprawidłowy kanał powiadomień", + "support_recordedTitle": "Formatki", + "admin_supportTeamTitle": "Zarządzaj zespołem pomocy technicznej", + "admin_supportTeamHint": "Dodaj lub usuń osoby z zespołu pomocy technicznej tej instancji", + "support_pasteUserData": "Wklej tu dane użytkownika", + "support_legacyButton": "Pokaż aktywne zgłoszenia", + "support_recordedHint": "Zdefiniuj często używane fragmenty tekstu, które będzie można potem wstawić do wiadomości jednym kliknięciem.", + "support_recordedEmpty": "Brak formatek", + "support_legacyTitle": "Zobacz stare dane pomocy", + "support_searchLabel": "Znajdź (tytuł lub ID zgłoszenia)", + "support_legacyHint": "Zobacz zgłoszenia z poprzedniego systemu pomocy technicznej i odtwórz je w nowym.", + "admin_supportOpen": "Otwórz helpdesk", + "admin_supportInit": "Inicjalizuj helpdesk na tej instancji", + "moderationPage": "Helpdesk", + "support_userNotification": "Nowe zgłoszenie lub odpowiedź: {0}", + "admin_invitationHint": "Każde zaproszenie stworzy jedno konto, nawet jeśli rejestracja jest zamknięta. Nazwa użytkownika i email są wyłącznie poglądowe. CryptPad nie wyśle zaproszenia (czy czegokolwiek innego) mailem, skopiuj link i prześlij go za pomocą wybranego bezpiecznego kanału.", + "admin_storeSsoLabel": "Automatycznie dodaj użytkowników SSO", + "admin_usersBlock": "URL bloku logowania użytkownika (opcjonalne)", + "admin_usersHint": "Lista znanych Ci kont na tej instancji. Zaznacz poniżej aby dodać konta automatycznie, lub wprowadź informacje ręcznie za pomocą formularza.", + "admin_supportSetupHint": "Stwórz lub aktualizuj klucze pomocy.", + "admin_supportRotateNotify": "Uwaga: nowe klucze zostały wygenerowane, ale nieoczekiwany błąd nie pozwolił systemowi wysłać ich moderatorom. Usuń i dodaj ponownie członków zespołu", + "support_notificationsHint": "Zaznacz tę opcję, żeby wyłączyć powiadomienia o nowych zgłoszeniach i odpowiedziach" }