diff --git a/.jshintignore b/.jshintignore index c403b39b3..2eac30b3a 100644 --- a/.jshintignore +++ b/.jshintignore @@ -14,6 +14,7 @@ www/common/hyperscript.js www/pad/wysiwygarea-plugin.js www/pad/mediatag-plugin.js www/pad/mediatag-plugin-dialog.js +www/pad/disable-base64.js www/kanban/jkanban.js diff --git a/.lesshintrc b/.lesshintrc index 693029bf1..651613c98 100644 --- a/.lesshintrc +++ b/.lesshintrc @@ -40,7 +40,7 @@ "depthLevel": { "depth": 1 // TODO(cjd) This is obviously not triggering, even with 1 }, - "duplicateProperty": { "enabled": true }, + "duplicateProperty": { "enabled": false }, "emptyRule": { "enabled": true }, "hexValidation": { "enabled": true }, // disallow actual garbage color hex codes (e.g. #ab) "propertyUnits": { diff --git a/bower.json b/bower.json index 28db3ec8e..79859659e 100644 --- a/bower.json +++ b/bower.json @@ -36,7 +36,7 @@ "alertifyjs": "1.0.11", "scrypt-async": "1.2.0", "require-css": "0.1.10", - "less": "^2.7.2", + "less": "^3.7.1", "bootstrap": "^v4.0.0", "diff-dom": "2.1.1", "nthen": "^0.1.5", diff --git a/config.example.js b/config.example.js index 1d85d6c96..98d1889fd 100644 --- a/config.example.js +++ b/config.example.js @@ -276,7 +276,7 @@ module.exports = { */ blobStagingPath: './blobstage', - /* CryptPad's file storage adaptor closes unused files after a configurale + /* CryptPad's file storage adaptor closes unused files after a configurable * number of milliseconds (default 30000 (30 seconds)) */ channelExpirationMs: 30000, diff --git a/customize.dist/ckeditor-config.js b/customize.dist/ckeditor-config.js index 36cac87f0..d8936c2c4 100644 --- a/customize.dist/ckeditor-config.js +++ b/customize.dist/ckeditor-config.js @@ -5,12 +5,12 @@ CKEDITOR.editorConfig = function( config ) { config.needsBrFiller= fixThings; config.needsNbspFiller= fixThings; - config.removeButtons= 'Source,Maximize,Anchor'; + config.removeButtons= 'Source,Maximize'; // magicline plugin inserts html crap into the document which is not part of the // document itself and causes problems when it's sent across the wire and reflected back config.removePlugins= 'resize,elementspath'; config.resize_enabled= false; //bottom-bar - config.extraPlugins= 'autolink,colorbutton,colordialog,font,indentblock,justify,mediatag,print'; + config.extraPlugins= 'autolink,colorbutton,colordialog,font,indentblock,justify,mediatag,print,blockbase64'; config.toolbarGroups= [ // {"name":"clipboard","groups":["clipboard","undo"]}, //{"name":"editing","groups":["find","selection"]}, diff --git a/customize.dist/fonts/cptools/fonts/cptools.svg b/customize.dist/fonts/cptools/fonts/cptools.svg new file mode 100644 index 000000000..2ea458f12 --- /dev/null +++ b/customize.dist/fonts/cptools/fonts/cptools.svg @@ -0,0 +1,12 @@ + + + +Generated by IcoMoon + + + + + + + + \ No newline at end of file diff --git a/customize.dist/fonts/cptools/fonts/cptools.ttf b/customize.dist/fonts/cptools/fonts/cptools.ttf new file mode 100644 index 000000000..179ba4d98 Binary files /dev/null and b/customize.dist/fonts/cptools/fonts/cptools.ttf differ diff --git a/customize.dist/fonts/cptools/fonts/cptools.woff b/customize.dist/fonts/cptools/fonts/cptools.woff new file mode 100644 index 000000000..04cd47172 Binary files /dev/null and b/customize.dist/fonts/cptools/fonts/cptools.woff differ diff --git a/customize.dist/fonts/cptools/style.css b/customize.dist/fonts/cptools/style.css new file mode 100644 index 000000000..83c233e62 --- /dev/null +++ b/customize.dist/fonts/cptools/style.css @@ -0,0 +1,31 @@ +@font-face { + font-family: 'cptools'; + src: + url('fonts/cptools.ttf?dysqmo') format('truetype'), + url('fonts/cptools.woff?dysqmo') format('woff'), + url('fonts/cptools.svg?dysqmo#cptools') format('svg'); + font-weight: normal; + font-style: normal; +} + +.cptools { + /* use !important to prevent issues with browser extensions that change fonts */ + font-family: 'cptools' !important; + speak: none; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + + /* Better Font Rendering =========== */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.cptools-template:before { + content: "\e900"; +} +.cptools-new-template:before { + content: "\e901"; +} diff --git a/customize.dist/loading.js b/customize.dist/loading.js index 2bc0ec420..e8f8a9453 100644 --- a/customize.dist/loading.js +++ b/customize.dist/loading.js @@ -182,7 +182,7 @@ define([], function () { '', '
', '
', - '', + '', '
', '

', '
' diff --git a/customize.dist/pages.js b/customize.dist/pages.js index 152970f58..e3fc17659 100644 --- a/customize.dist/pages.js +++ b/customize.dist/pages.js @@ -32,7 +32,6 @@ define([ }); return select; }; - languageSelector = languageSelector; // jshint var footerCol = function (title, L, literal) { return h('div.col-6.col-sm-3', [ @@ -95,7 +94,7 @@ define([ ]) ]) ]), - h('div.cp-version-footer', "CryptPad v2.5.0 (Fossa)") + h('div.cp-version-footer', "CryptPad v2.6.0 (Gibbon)") ]); }; @@ -633,6 +632,7 @@ define([ ]) ]), ]), + infopageFooter(), ]; }; diff --git a/customize.dist/src/less2/404.less b/customize.dist/src/less2/404.less deleted file mode 100644 index 33a852cd0..000000000 --- a/customize.dist/src/less2/404.less +++ /dev/null @@ -1,40 +0,0 @@ -@import (once) './include/font.less'; -.font_neuropolitical(); -.font_open-sans(); - -body.cp-page-index { @import "./pages/page-index.less"; } -body.cp-page-contact { @import "./pages/page-contact.less"; } -body.cp-page-login { @import "./pages/page-login.less"; } -body.cp-page-register { @import "./pages/page-register.less"; } -body.cp-page-what-is-cryptpad { @import "./pages/page-what-is-cryptpad.less"; } -body.cp-page-about { @import "./pages/page-about.less"; } -body.cp-page-privacy { @import "./pages/page-privacy.less"; } -body.cp-page-terms { @import "./pages/page-terms.less"; } - -// Set the HTML style for the apps which shouldn't have a body scrollbar -html.cp-app-noscroll { - @import "./include/app-noscroll.less"; - .app-noscroll_main(); -} -// Set the HTML style for printing slides -html.cp-app-print { - @import "./include/app-print.less"; - .app-print_main(); -} - -body.cp-readonly .cp-hidden-if-readonly { display: none !important; } - -body.cp-app-drive { @import "../../../drive/app-drive.less"; } -body.cp-app-pad { @import "../../../pad/app-pad.less"; } -body.cp-app-code { @import "../../../code/app-code.less"; } -body.cp-app-slide { @import "../../../slide/app-slide.less"; } -body.cp-app-file { @import "../../../file/app-file.less"; } -body.cp-app-filepicker { @import "../../../filepicker/app-filepicker.less"; } -body.cp-app-contacts { @import "../../../contacts/app-contacts.less"; } -body.cp-app-poll { @import "../../../poll/app-poll.less"; } -body.cp-app-whiteboard { @import "../../../whiteboard/app-whiteboard.less"; } -body.cp-app-todo { @import "../../../todo/app-todo.less"; } -body.cp-app-profile { @import "../../../profile/app-profile.less"; } -body.cp-app-settings { @import "../../../settings/app-settings.less"; } -body.cp-app-debug { @import "../../../debug/app-debug.less"; } - diff --git a/customize.dist/src/less2/include/alertify.less b/customize.dist/src/less2/include/alertify.less index fd340f8d2..0df305ddc 100644 --- a/customize.dist/src/less2/include/alertify.less +++ b/customize.dist/src/less2/include/alertify.less @@ -1,8 +1,11 @@ -@import (once) "./colortheme-all.less"; -@import (once) "./browser.less"; -@import (once) "./variables.less"; - -.alertify_main () { +@import (reference) "./colortheme-all.less"; +@import (reference) "./browser.less"; +@import (reference) "./variables.less"; + +.alertify_main() { + --LessLoader_require: LessLoader_currentFile(); +}; +& { @max-z-index: 2147483647; @alertify-fore: @colortheme_modal-fg; @alertify-base: @colortheme_modal-bg; @@ -407,3 +410,4 @@ } } } + diff --git a/customize.dist/src/less2/include/app-noscroll.less b/customize.dist/src/less2/include/app-noscroll.less index f0a760b5f..fcd8f5d01 100644 --- a/customize.dist/src/less2/include/app-noscroll.less +++ b/customize.dist/src/less2/include/app-noscroll.less @@ -1,14 +1,8 @@ -// html -.app-noscroll_main () { - height: 100%; - width: 100%; - padding: 0px; - margin: 0px; - overflow: hidden; - box-sizing: border-box; - position: relative; - border: 0; - body { +.app-noscroll_main() { + --LessLoader_require: LessLoader_currentFile(); +} +& { + .cp-app-noscroll { height: 100%; width: 100%; padding: 0px; @@ -17,6 +11,16 @@ box-sizing: border-box; position: relative; border: 0; + body { + height: 100%; + width: 100%; + padding: 0px; + margin: 0px; + overflow: hidden; + box-sizing: border-box; + position: relative; + border: 0; + } } } diff --git a/customize.dist/src/less2/include/app-print.less b/customize.dist/src/less2/include/app-print.less index 957170044..1625ff874 100644 --- a/customize.dist/src/less2/include/app-print.less +++ b/customize.dist/src/less2/include/app-print.less @@ -1,46 +1,52 @@ -.app-print_main () { - // Current scope is - @media print { - height: auto; - max-height: none; - overflow: visible; - display: block; - @page { - margin: 0; - size: landscape; - } - // Slide app - body.cp-app-slide { +.app-print_main() { + --LessLoader_require: LessLoader_currentFile(); +} +& { + .cp-app-print { + // Current scope is + @media print { + height: auto; + max-height: none; + overflow: visible; display: block; - .CodeMirror, #cme_toolbox { - display: none; + @page { + margin: 0; + size: landscape; } - * { - visibility: hidden; - height: auto; - max-height: none; - } - .cp-app-slide-viewer #cp-app-slide-print { + // Slide app + body.cp-app-slide { display: block; - visibility: visible; + .CodeMirror, #cme_toolbox { + display: none; + } * { + visibility: hidden; + height: auto; + max-height: none; + } + .cp-app-slide-viewer #cp-app-slide-print { + display: block; visibility: visible; + * { + visibility: visible; + } + } + .cp-app-slide-viewer #cp-app-slide-modal { + display: none !important; + } + .cp-app-slide-viewer { + flex: 1 !important; + overflow: visible !important; + } + .cp-toolbar-userlist-drawer { + display: none !important; + } + #cp-app-slide-editor { + height: auto; + display: block; } - } - .cp-app-slide-viewer #cp-app-slide-modal { - display: none !important; - } - .cp-app-slide-viewer { - flex: 1 !important; - overflow: visible !important; - } - .cp-toolbar-userlist-drawer { - display: none !important; - } - #cp-app-slide-editor { - height: auto; - display: block; } } } } + diff --git a/customize.dist/src/less2/include/avatar.less b/customize.dist/src/less2/include/avatar.less index b935db786..87b4a3a32 100644 --- a/customize.dist/src/less2/include/avatar.less +++ b/customize.dist/src/less2/include/avatar.less @@ -1,40 +1,65 @@ -@import (once) "./tools.less"; - -.avatar_main (@width) { +@import (reference) "./tools.less"; +.avatar_vars( + @width: 30px +) { + @avatar-width: @width; + @avatar-font-size: @width / 1.2; +} +.avatar_main(@width: 30px) { + --LessLoader_require: LessLoader_currentFile(); + .avatar_vars(@width); + --avatar-width: @avatar-width; + --avatar-font-size: @avatar-font-size; +} +& { + .avatar_vars(); &.cp-avatar { - overflow: hidden; - text-overflow: ellipsis; - font-size: 16px; - display: flex; - align-items: center; - .cp-avatar-default, media-tag { - display: inline-flex; - width: @width; - height: @width; - justify-content: center; - align-items: center; - border-radius: 4px; overflow: hidden; - box-sizing: content-box; - } - .cp-avatar-default { - .tools_unselectable(); - background: white; - color: black; - font-size: @width/1.2; - } - media-tag { - min-height: @width; - min-width: @width; - max-height: @width; - max-width: @width; - img { - min-width: 100%; - min-height: 100%; - max-width: none; - max-height: none; // To override 'media-tag img' in slide.less + text-overflow: ellipsis; + font-size: 16px; + display: flex; + align-items: center; + .cp-avatar-default, media-tag { + display: inline-flex; + + width: @avatar-width; + width: var(--avatar-width); + + height: @avatar-width; + height: var(--avatar-width); + + justify-content: center; + align-items: center; + border-radius: 4px; + overflow: hidden; + box-sizing: content-box; + } + .cp-avatar-default { + .tools_unselectable(); + background: white; + color: black; + font-size: @avatar-font-size; + font-size: var(--avatar-font-size); + } + media-tag { + min-height: @avatar-width; + min-height: var(--avatar-width); + + min-width: @avatar-width; + min-width: var(--avatar-width); + + max-height: @avatar-width; + max-height: var(--avatar-width); + + max-width: @avatar-width; + max-width: var(--avatar-width); + img { + min-width: 100%; + min-height: 100%; + max-width: none; + max-height: none; // To override 'media-tag img' in slide.less + } } - } } } diff --git a/customize.dist/src/less2/include/checkmark.less b/customize.dist/src/less2/include/checkmark.less index adbc70750..21d59cc19 100644 --- a/customize.dist/src/less2/include/checkmark.less +++ b/customize.dist/src/less2/include/checkmark.less @@ -1,11 +1,28 @@ -@import (once) "./colortheme-all.less"; +@import (reference) "./colortheme-all.less"; -.checkmark_main(@size) { +.checkmark_vars( + @size: 20px +) { + @checkmark-size: @size; + @checkmark-width: round(@size / 8); + @checkmark-dim1: round(@size / 3); + @checkmark-dim2: round(2 * @size / 3); + @checkmark-top: round(@size / 12) - 1; + @checkmark-radio-size: @checkmark-dim1 * 3; +} - @width: round(@size / 8); - @dim1: round(@size / 3); - @dim2: round(2 * @size / 3); - @top: round(@size / 12) - 1; +.checkmark_main(@size: 20px) { + --LessLoader_require: LessLoader_currentFile(); + .checkmark_vars(@size); + --checkmark-size: @checkmark-size; + --checkmark-width: @checkmark-width; + --checkmark-dim1: @checkmark-dim1; + --checkmark-dim2: @checkmark-dim2; + --checkmark-top: @checkmark-top; + --checkmark-radio-size: @checkmark-radio-size; +} +& { + .checkmark_vars(); // Text .cp-checkmark { margin: 0; @@ -58,8 +75,10 @@ .cp-checkmark-mark { margin-right: 10px; position: relative; - height: @size; - width: @size; + height: @checkmark-size; + height: var(--checkmark-size); + width: @checkmark-size; + width: var(--checkmark-size); background-color: @colortheme_checkmark-back0; display: flex; justify-content: center; @@ -68,12 +87,16 @@ &:after { content: ""; display: none; - margin-top: @top; - width: @dim1; - height: @dim2; + margin-top: @checkmark-top; + margin-top: var(--checkmark-top); + width: @checkmark-dim1; + width: var(--checkmark-dim1); + height: @checkmark-dim2; + height: var(--checkmark-dim2); transform: rotate(45deg); border: solid @colortheme_checkmark-col1; - border-width: 0 @width @width 0; + border-width: 0 @checkmark-width @checkmark-width 0; + border-width: 0 var(--checkmark-width) var(--checkmark-width) 0; position: absolute; } &:focus { @@ -129,12 +152,13 @@ } } - @radio-size: @dim1 * 3; .cp-radio-mark { margin-right: 10px; position: relative; - height: @radio-size; - width: @radio-size; + height: @checkmark-radio-size; + height: var(--checkmark-radio-size); + width: @checkmark-radio-size; + width: var(--checkmark-radio-size); background-color: @colortheme_checkmark-back0; border-radius: 50%; display: flex; @@ -147,12 +171,14 @@ content: ""; border-radius: 50%; background: white; - width: @dim1; - height: @dim1; + width: @checkmark-dim1; + width: var(--checkmark-dim1); + height: @checkmark-dim1; + height: var(--checkmark-dim1); //transform: rotate(45deg); //border: solid @colortheme_checkmark-col1; - //border-width: 0 @width @width 0; + //border-width: 0 var(--checkmark-width) var(--checkmark-width) 0; } &:focus { //border-color: #FF007C !important; diff --git a/customize.dist/src/less2/include/colortheme-all.less b/customize.dist/src/less2/include/colortheme-all.less index 4544da76e..be048d7bc 100644 --- a/customize.dist/src/less2/include/colortheme-all.less +++ b/customize.dist/src/less2/include/colortheme-all.less @@ -2,5 +2,5 @@ // create a file: customize/src/less2/include/colortheme.less // override whatever colors you want. When you update, the new colors will be // added ok because the original file is pulled in first. -@import (once) "/customize.dist/src/less2/include/colortheme.less"; -@import (once) "/customize/src/less2/include/colortheme.less"; +@import (reference) "/customize.dist/src/less2/include/colortheme.less"; +@import (reference) "/customize/src/less2/include/colortheme.less"; diff --git a/customize.dist/src/less2/include/colortheme.less b/customize.dist/src/less2/include/colortheme.less index b6862c3f4..905327685 100644 --- a/customize.dist/src/less2/include/colortheme.less +++ b/customize.dist/src/less2/include/colortheme.less @@ -99,8 +99,8 @@ @colortheme_friends-color: #fff; @colortheme_friends-warn: #cd2532; -@colortheme_default-bg: #ddd; -@colortheme_default-color: #000; +@colortheme_default-bg: #326599; +@colortheme_default-color: #FFF; @colortheme_default-warn: #cd2532; @colortheme_settings-bg: #0087ff; diff --git a/customize.dist/src/less2/include/creation.less b/customize.dist/src/less2/include/creation.less index e2115288a..e5c71a3db 100644 --- a/customize.dist/src/less2/include/creation.less +++ b/customize.dist/src/less2/include/creation.less @@ -1,12 +1,27 @@ -@import (once) "./colortheme-all.less"; -@import (once) "./tools.less"; -@import (once) './icon-colors.less'; +@import (reference) "./browser.less"; +@import (reference) "./colortheme-all.less"; +@import (reference) "./tools.less"; +@import (reference) './icon-colors.less'; + +.creation_vars( + @color: @colortheme_default-color, + @bg-color: @colortheme_default-bg +) { + @creation-color: @color; + @creation-bg-color: @bg-color; +}; .creation_main( - @color: @colortheme_default-color, // Color of the text for the toolbar - @bg-color: @colortheme_default-bg, // color of the toolbar background - @warn-color: @colortheme_default-warn, // color of the warning text in the toolbar + @color: @colortheme_default-color, + @bg-color: @colortheme_default-bg ) { + --LessLoader_require: LessLoader_currentFile(); + .creation_vars(@color, @bg-color); + --creation-color: @color; + --creation-bg-color: @bg-color; +} +& { + .creation_vars(); @colortheme_creation-modal-bg: #fff; @colortheme_creation-modal: #666; @colortheme_creation-modal-title: @colortheme_loading-bg; @@ -116,6 +131,8 @@ line-height: 28px; label { flex: 1; + // Force wrap when the other element in the line is 100% (IE bug): + min-width: 1px; } input[type="checkbox"] { &+ label { @@ -141,15 +158,19 @@ //margin-top: 10px; &.active { transition: max-height 0.5s ease-in-out; - max-width: unset; + max-width: none; max-height: 100px; } + input, select { + vertical-align: middle; + } } input, select { font-size: 14px; border: 1px solid @colortheme_form-border; height: 26px; + line-height: 26px; background-color: @colortheme_form-bg; color: @colortheme_form-color; } @@ -167,7 +188,7 @@ } &.active { label { - flex: unset; + flex: none; } .cp-creation-slider { flex: 1; @@ -184,7 +205,7 @@ padding: 0 5px; } label { - flex: unset; + flex: none; } } } @@ -258,22 +279,19 @@ color: black; border: 1px solid transparent; - &.cp-creation-template-selected { - color: @color !important; - background-color: @bg-color !important; - .fa { - color: @color; + &.cp-creation-template-selected, &:hover { + color: @creation-color !important; + color: var(--creation-color) !important; + background-color: @creation-bg-color !important; + background-color: var(--creation-bg-color) !important; + .fa, .cptools { + color: @creation-color; + color: var(--creation-color); } } transition: all 0.1s; - &:hover { - //color: @colortheme_modal-fg; - background-color: @colortheme_form-border; - box-shadow: none; - } - align-items: center; img { @@ -287,13 +305,15 @@ overflow: hidden; text-overflow: ellipsis; white-space: nowrap; + min-height: 20px; height: 20px; line-height: 20px; margin-top: 5px; max-width: 100%; } - .fa { - color: @bg-color; + .fa, .cptools { + color: @creation-bg-color; + color: var(--creation-bg-color); cursor: pointer; width: 100px; height: 100px; @@ -340,7 +360,7 @@ flex: 1; } .cp-creation-slider { - flex: unset; + flex: none; order: 10; width: 100%; } diff --git a/customize.dist/src/less2/include/dropdown.less b/customize.dist/src/less2/include/dropdown.less index 0d3552450..ac393fe3a 100644 --- a/customize.dist/src/less2/include/dropdown.less +++ b/customize.dist/src/less2/include/dropdown.less @@ -1,8 +1,11 @@ -@import (once) "./colortheme-all.less"; -@import (once) "./tools.less"; +@import (reference) "./colortheme-all.less"; +@import (reference) "./tools.less"; /* The container
- needed to position the dropdown content */ .dropdown_main () { + --LessLoader_require: LessLoader_currentFile(); +} +& { .cp-dropdown-container { @dropdown_font: @colortheme_app-font-size @colortheme_font; position: relative; diff --git a/customize.dist/src/less2/include/fileupload.less b/customize.dist/src/less2/include/fileupload.less index 3ed3e793e..c10abeec4 100644 --- a/customize.dist/src/less2/include/fileupload.less +++ b/customize.dist/src/less2/include/fileupload.less @@ -1,7 +1,11 @@ -@import (once) './colortheme-all.less'; -@import (once) './modal.less'; +@import (reference) './colortheme-all.less'; +@import (reference) './modal.less'; .fileupload_main () { + --LessLoader_require: LessLoader_currentFile(); + .modal_main(); +} +& { /* Upload status table */ #cp-fileupload { .modal_base(); @@ -54,4 +58,3 @@ } } } - diff --git a/customize.dist/src/less2/include/font.less b/customize.dist/src/less2/include/font.less index ec8e77f0f..627a9a9f8 100644 --- a/customize.dist/src/less2/include/font.less +++ b/customize.dist/src/less2/include/font.less @@ -1,9 +1,18 @@ -.font_neuropolitical () { - @font-face { - font-family: Neuropolitical; - src: url("/customize/fonts/neuropolitical.ttf"); - } +.font_main () { + --LessLoader_require: LessLoader_currentFile(); } -.font_open-sans () { - @import (once) '/customize/fonts/open-sans.less'; + +// Fonts need to go on the global scope +@font-face { + font-family: Neuropolitical; + src: url("/customize/fonts/neuropolitical.ttf"); } + +// Fonts need to go on the global scope +@font-tools { + font-family: CryptPadTools; + src: url("/customize/fonts/cryptpadtools.ttf"); +} + +@import (once) '/customize/fonts/open-sans.less'; + diff --git a/customize.dist/src/less2/include/framework.less b/customize.dist/src/less2/include/framework.less index 286870991..5caa847f4 100644 --- a/customize.dist/src/less2/include/framework.less +++ b/customize.dist/src/less2/include/framework.less @@ -1,38 +1,58 @@ -@import (once) "./colortheme-all.less"; -@import (once) "./toolbar.less"; -@import (once) './fileupload.less'; -@import (once) './alertify.less'; -@import (once) './tokenfield.less'; -@import (once) './creation.less'; -@import (once) './tippy.less'; -@import (once) "./checkmark.less"; -@import (once) "./password-input.less"; +@import (reference) "./colortheme-all.less"; +@import (reference) "./toolbar.less"; +@import (reference) './fileupload.less'; +@import (reference) './alertify.less'; +@import (reference) './tokenfield.less'; +@import (reference) './creation.less'; +@import (reference) './tippy.less'; +@import (reference) "./checkmark.less"; +@import (reference) "./password-input.less"; +@import (reference) './font.less'; +@import (reference) "./app-print.less"; +@import (reference) "./app-noscroll.less"; .framework_main(@bg-color, @warn-color, @color) { + --LessLoader_require: LessLoader_currentFile(); + // Set the HTML style for the apps which shouldn't have a body scrollbar + .app-noscroll_main(); + + // Set the HTML style for printing slides + .app-print_main(); + + .font_main(); + .toolbar_main( @bg-color: @bg-color, @warn-color: @warn-color, @color: @color ); - .fileupload_main(); .alertify_main(); + .fileupload_main(); .tokenfield_main(); .tippy_main(); .checkmark_main(20px); .password_main(); .creation_main( @bg-color: @bg-color, - @warn-color: @warn-color, @color: @color ); font: @colortheme_app-font; -} +}; .framework_min_main( @color: @colortheme_default-color, // Color of the text for the toolbar @bg-color: @colortheme_default-bg, // color of the toolbar background @warn-color: @colortheme_default-warn, // color of the warning text in the toolbar ) { + --LessLoader_require: LessLoader_currentFile(); + // Set the HTML style for the apps which shouldn't have a body scrollbar + .app-noscroll_main(); + + // Set the HTML style for printing slides + .app-print_main(); + + .font_main(); + .toolbar_main( @bg-color: @bg-color, @warn-color: @warn-color, @@ -46,4 +66,7 @@ font: @colortheme_app-font; } +& { + body.cp-readonly .cp-hidden-if-readonly { display: none !important; } +} diff --git a/customize.dist/src/less2/include/help.less b/customize.dist/src/less2/include/help.less index 0e6e90d87..4dd396a29 100644 --- a/customize.dist/src/less2/include/help.less +++ b/customize.dist/src/less2/include/help.less @@ -1,9 +1,30 @@ -@import (once) "./colortheme-all.less"; +@import (reference) "./colortheme-all.less"; -.help_main (@color, @bg-color) { +.help_vars ( + @color: @colortheme_default-color, + @bg-color: @colortheme_default-bg +) { + @help-bg-color-l15: lighten(@bg-color, 15%); + @help-text-color: contrast(@help-bg-color-l15, #fff, #000); //@color; + @help-link-color: contrast(@help-bg-color-l15, lighten(spin(@bg-color, 180), 10%), darken(spin(@bg-color, 180), 10%)); +} +.help_main ( + @color: @colortheme_default-color, + @bg-color: @colortheme_default-bg +) { + --LessLoader_require: LessLoader_currentFile(); + .help_vars(@color, @bg-color); + --help-bg-color-l15: @help-bg-color-l15; + --help-text-color: @help-text-color; + --help-link-color: @help-link-color; +}; +& { + .help_vars(); .cp-help-container { + position: relative; - background-color: lighten(@bg-color, 15%); + background-color: @help-bg-color-l15; + background-color: var(--help-bg-color-l15); &.cp-help-hidden { display: none; } @@ -14,14 +35,13 @@ right: 5px; } .cp-help-text { - color: contrast(lighten(@bg-color, 15%), #fff, #000); //@color; + color: @help-text-color; + color: var(--help-text-color); margin: 0; padding: 15px; a { - //color: darken(@colortheme_link-color, 30%); - @spin: spin(lighten(@bg-color, 15%), 180); - color: contrast(lighten(@bg-color, 15%), lighten(@spin, 10%), darken(@spin, 10%)); - //color: darken(spin(lighten(@bg-color, 15%), 180), 10%); + color: @help-link-color; + color: var(--help-link-color); } h1 { font-size: 20px; @@ -36,3 +56,4 @@ } } } + diff --git a/customize.dist/src/less2/include/icon-colors.less b/customize.dist/src/less2/include/icon-colors.less index 283626cfd..e18578c6a 100644 --- a/customize.dist/src/less2/include/icon-colors.less +++ b/customize.dist/src/less2/include/icon-colors.less @@ -1,5 +1,8 @@ -@import (once) "./colortheme-all.less"; +@import (reference) "./colortheme-all.less"; .iconColors_main () { + --LessLoader_require: LessLoader_currentFile(); +} +& { // Classes used in common-interface.js .cp-icon-color-pad { color: @colortheme_pad-bg; } .cp-icon-color-code { color: @colortheme_code-bg; } diff --git a/customize.dist/src/less2/include/infopages.less b/customize.dist/src/less2/include/infopages.less index 4f3f6d0ad..3df7b4c1d 100644 --- a/customize.dist/src/less2/include/infopages.less +++ b/customize.dist/src/less2/include/infopages.less @@ -1,10 +1,25 @@ -@import (once) "./colortheme-all.less"; +@import (reference) "./colortheme-all.less"; +@import (reference) "./font.less"; -@infopages_infobar-height: 64px; -@infopages_padding: 32px; +.infopages_link () { + text-decoration: none; + color: #0275D8; + cursor: pointer; + display: inline-flex; + &:hover { + transform: scale(1.05); + } +} -// Basic setup for info pages, this should be used at the global level .infopages_main () { + --LessLoader_require: LessLoader_currentFile(); +} +body { + .font_main(); + @infopages_infobar-height: 64px; + @infopages_padding: 32px; + + // Basic setup for info pages, this should be used at the global level background-color: @colortheme_info-background; a { color: @cryptpad_color_blue; @@ -100,20 +115,8 @@ border-top: 2px solid #fff; } } -}; -.infopages_link () { - text-decoration: none; - color: #0275D8; - cursor: pointer; - display: inline-flex; - &:hover { - transform: scale(1.05); - } -} - -// Apply this to the top bar div -.infopages_topbar () { + // Apply this to the top bar div .cp-topbar { background: #fff; z-index: 10000; //Z infopage toolbar @@ -149,71 +152,72 @@ margin-right: 0.5em; } } -} -// navigation top bar -.navbar { - background: #fff; - .navbar-brand { - display: block; - background-image: url(/customize/CryptPad_logo_color.svg); - background-repeat: no-repeat; - background-size: contain; - height: 50px; - width: 250px; - @media (max-width: 326px) { - width: 180px; - } - margin-right: 0; - } - a { - border: 2px solid transparent; - white-space: nowrap; - } - .nav-link { - padding: 0.5em 0.7em; - &:hover { - color: @cryptpad_color_light_blue; + // navigation top bar + .navbar { + background: #fff; + .navbar-brand { + display: block; + background-image: url(/customize/CryptPad_logo_color.svg); + background-repeat: no-repeat; + background-size: contain; + height: 50px; + width: 250px; + @media (max-width: 326px) { + width: 180px; + } + margin-right: 0; + } + a { + border: 2px solid transparent; + white-space: nowrap; + } + .nav-link { + padding: 0.5em 0.7em; + &:hover { + color: @cryptpad_color_light_blue; + } + } + .cp-register-btn { + border: 2px solid #4591C4; + display: inline-block; + } + button:focus { + outline: none; + } + .navbar-toggler { + margin-top: 10px; + color: #4591C4; } } - .cp-register-btn { - border: 2px solid #4591C4; - display: inline-block; - } - button:focus { - outline: none; - } - .navbar-toggler { - margin-top: 10px; - color: #4591C4; - } -} -@media (max-width: 1000px) { - #menuCollapse { - text-align: right; -/* @media (min-width: 576px) { - top: 100%; - background: rgba(255,255,255,0.8); - position: absolute; - right: 0px; - padding: 0 20px; - z-index: 1; - } -*/ - } - .navbar-nav a { - text-align: right !important; - } - .cp-register-btn { - margin-right: 13px; - text-align: center; + @media (max-width: 1000px) { + #menuCollapse { + text-align: right; + /* @media (min-width: 576px) { + top: 100%; + background: rgba(255,255,255,0.8); + position: absolute; + right: 0px; + padding: 0 20px; + z-index: 1; + } + */ + } + .navbar-nav a { + text-align: right !important; + } + .cp-register-btn { + margin-right: 13px; + text-align: center; + } } -} -//footer general styles + //footer general styles -.footer-title { - font-weight: bold; - font-size: 1.2em; - color: #1E1F1F; + .footer-title { + font-weight: bold; + font-size: 1.2em; + color: #1E1F1F; + } } + diff --git a/customize.dist/src/less2/include/leftside-menu.less b/customize.dist/src/less2/include/leftside-menu.less index 28ae57af4..baca3ac4d 100644 --- a/customize.dist/src/less2/include/leftside-menu.less +++ b/customize.dist/src/less2/include/leftside-menu.less @@ -1,6 +1,6 @@ -@import (once) "./unselectable.less"; -@import (once) "./variables.less"; -@import (once) "./colortheme-all.less"; +@import (reference) "./unselectable.less"; +@import (reference) "./variables.less"; +@import (reference) "./colortheme-all.less"; .leftside-menu_main() { } diff --git a/customize.dist/src/less2/include/limit-bar.less b/customize.dist/src/less2/include/limit-bar.less index b2ea5f230..3ed7bd454 100644 --- a/customize.dist/src/less2/include/limit-bar.less +++ b/customize.dist/src/less2/include/limit-bar.less @@ -1,6 +1,9 @@ -@import (once) "./colortheme-all.less"; +@import (reference) "./colortheme-all.less"; .limit-bar_main () { + --LessLoader_require: LessLoader_currentFile(); +} +& { .cp-limit-container { @colortheme_green: #5cb85c; display: inline-flex; diff --git a/customize.dist/src/less2/include/markdown-toolbar.less b/customize.dist/src/less2/include/markdown-toolbar.less deleted file mode 100644 index 4fb466525..000000000 --- a/customize.dist/src/less2/include/markdown-toolbar.less +++ /dev/null @@ -1,20 +0,0 @@ -@import (once) "./colortheme-all.less"; - -.markdownToolbar_main (@color, @bg-color) { - .cp-markdown-toolbar { - height: @toolbar_line-height; - background-color: lighten(@bg-color, 20%); - display: none; - button { - height: @toolbar_line-height !important; - outline: 0; - color: @color; - .toolbar_button; - font: normal normal normal 14px/1 FontAwesome; - &:hover { - background-color: lighten(@bg-color, 8%); - } - &.cp-markdown-help { float: right; } - } - } -} diff --git a/customize.dist/src/less2/include/markdown.less b/customize.dist/src/less2/include/markdown.less index 470f81a82..1ba97a0f1 100644 --- a/customize.dist/src/less2/include/markdown.less +++ b/customize.dist/src/less2/include/markdown.less @@ -1,3 +1,15 @@ +.markdown_main() { + blockquote { + background: #e5e5e5; + padding: 10px; + border-left: 3px solid #999; + padding-right: 0; + p { margin: 0; } + blockquote { margin: 0; } + } + // todo ul, ol +} + .markdown_preformatted-code (@color: #333) { pre > code { display: block; @@ -23,15 +35,3 @@ } } -.markdown_main() { - blockquote { - background: #e5e5e5; - padding: 10px; - border-left: 3px solid #999; - padding-right: 0; - p { margin: 0; } - blockquote { margin: 0; } - } -} -// todo ul, ol - diff --git a/customize.dist/src/less2/include/modal.less b/customize.dist/src/less2/include/modal.less index e7e39ad96..07c533b15 100644 --- a/customize.dist/src/less2/include/modal.less +++ b/customize.dist/src/less2/include/modal.less @@ -1,5 +1,5 @@ -@import (once) "./colortheme-all.less"; -@import (once) "./variables.less"; +@import (reference) "./colortheme-all.less"; +@import (reference) "./variables.less"; .modal_base() { font-family: @colortheme_font; @@ -17,62 +17,68 @@ } } -.cp-modal-container { - display: none; - - z-index: 100000; //Z modal container - position: absolute; - top: 0; - bottom: 0; - left: 0; - right: 0; - background-color: @colortheme_modal-dim; - - .cp-modal { - background-color: @colortheme_modal-bg; - color: @colortheme_modal-fg; - box-shadow: @variables_shadow; - - padding: @variables_padding; +.modal_main() { + --LessLoader_require: LessLoader_currentFile(); +} +& { + .cp-modal-container { + display: none; + z-index: 100000; //Z modal container position: absolute; - top: 15vh; bottom: 15vh; - left: 10vw; right: 10vw; - - overflow: auto; - - font-family: @colortheme_font; - text-align: center; + top: 0; + bottom: 0; + left: 0; + right: 0; + background-color: @colortheme_modal-dim; - & > p { - margin-bottom: 1em; - } - - .cp-modal-form { - display: flex; - flex-wrap: wrap; - align-items: center; - justify-content: center; - } + .cp-modal { + background-color: @colortheme_modal-bg; + color: @colortheme_modal-fg; + box-shadow: @variables_shadow; - input { - background-color: @colortheme_modal-input; - color: @colortheme_modal-input-fg; - border: 0; - padding: 8px 12px; - margin: 1em; - width: 300px; - } - - .cp-modal-close { - text-shadow: none; - color: inherit; + padding: @variables_padding; position: absolute; - top: 0; - right: 0; - margin: @variables_padding; - cursor: pointer; + top: 15vh; bottom: 15vh; + left: 10vw; right: 10vw; + + overflow: auto; + + font-family: @colortheme_font; + text-align: center; + + & > p { + margin-bottom: 1em; + } + + .cp-modal-form { + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: center; + } + + input { + background-color: @colortheme_modal-input; + color: @colortheme_modal-input-fg; + border: 0; + padding: 8px 12px; + margin: 1em; + width: 300px; + } + + .cp-modal-close { + text-shadow: none; + color: inherit; + + position: absolute; + top: 0; + right: 0; + margin: @variables_padding; + cursor: pointer; + } } } } + diff --git a/customize.dist/src/less2/include/password-input.less b/customize.dist/src/less2/include/password-input.less index 8836476fd..a2f2fb044 100644 --- a/customize.dist/src/less2/include/password-input.less +++ b/customize.dist/src/less2/include/password-input.less @@ -1,4 +1,7 @@ .password_main() { + --LessLoader_require: LessLoader_currentFile(); +} +& { .cp-password-container { display: flex; align-items: center; diff --git a/customize.dist/src/less2/include/sidebar-layout.less b/customize.dist/src/less2/include/sidebar-layout.less index ef6e1189a..07471183a 100644 --- a/customize.dist/src/less2/include/sidebar-layout.less +++ b/customize.dist/src/less2/include/sidebar-layout.less @@ -1,18 +1,22 @@ -@import (once) "/customize/src/less2/include/colortheme-all.less"; -@import (once) "/customize/src/less2/include/leftside-menu.less"; - -@leftside-bg: @colortheme_sidebar-left-bg; -@leftside-color: @colortheme_sidebar-left-fg; -@rightside-color: @colortheme_sidebar-right-fg; -@description-color: @colortheme_sidebar-description; +@import (reference) "/customize/src/less2/include/colortheme-all.less"; +@import (reference) "/customize/src/less2/include/leftside-menu.less"; @sidebar_button-width: 400px; - .sidebar-layout_main() { + --LessLoader_require: LessLoader_currentFile(); + + // This is way too broad to put in the global scope input[type="text"], input[type="password"] { padding-left: 10px; } +} +& { + @leftside-bg: @colortheme_sidebar-left-bg; + @leftside-color: @colortheme_sidebar-left-fg; + @rightside-color: @colortheme_sidebar-right-fg; + @description-color: @colortheme_sidebar-description; + #cp-sidebarlayout-container { font-size: 16px; display: flex; diff --git a/customize.dist/src/less2/include/tippy.less b/customize.dist/src/less2/include/tippy.less index 7f38af30f..794159ba7 100644 --- a/customize.dist/src/less2/include/tippy.less +++ b/customize.dist/src/less2/include/tippy.less @@ -1,6 +1,9 @@ -@import (once) './colortheme-all.less'; +@import (reference) './colortheme-all.less'; .tippy_main() { + --LessLoader_require: LessLoader_currentFile(); +} +& { .tippy-tooltip.cryptpad-theme { /* Your styling here. Example: */ background-color: white; diff --git a/customize.dist/src/less2/include/tokenfield.less b/customize.dist/src/less2/include/tokenfield.less index 5e518f08c..faa302b0a 100644 --- a/customize.dist/src/less2/include/tokenfield.less +++ b/customize.dist/src/less2/include/tokenfield.less @@ -1,6 +1,9 @@ -@import (once) "./tools.less"; +@import (reference) "./tools.less"; .tokenfield_main () { + --LessLoader_require: LessLoader_currentFile(); +} +& { .ui-autocomplete { z-index: 100001; // alertify + 1 } diff --git a/customize.dist/src/less2/include/toolbar-history.less b/customize.dist/src/less2/include/toolbar-history.less index 54a3bb0a0..cb41c2112 100644 --- a/customize.dist/src/less2/include/toolbar-history.less +++ b/customize.dist/src/less2/include/toolbar-history.less @@ -1,6 +1,9 @@ -@import (once) "./colortheme-all.less"; +@import (reference) "./colortheme-all.less"; .history_main () { + --LessLoader_require: LessLoader_currentFile(); +} +& { .cp-toolbar-history { display: none; text-align: center; diff --git a/customize.dist/src/less2/include/toolbar.less b/customize.dist/src/less2/include/toolbar.less index ad696382f..858c0a8d9 100644 --- a/customize.dist/src/less2/include/toolbar.less +++ b/customize.dist/src/less2/include/toolbar.less @@ -1,15 +1,36 @@ -@import (once) "./dropdown.less"; -@import (once) "./colortheme-all.less"; -@import (once) "./browser.less"; -@import (once) "./ckeditor-fix.less"; -@import (once) "./avatar.less"; -@import (once) "./toolbar-history.less"; -@import (once) "./icon-colors.less"; -@import (once) "./tools.less"; -@import (once) "./icons.less"; -@import (once) "./modal.less"; -@import (once) "./markdown-toolbar.less"; -@import (once) "./help.less"; +@import (reference) "./dropdown.less"; +@import (reference) "./colortheme-all.less"; +@import (reference) "./browser.less"; +@import (reference) "./ckeditor-fix.less"; +@import (reference) "./avatar.less"; +@import (reference) "./toolbar-history.less"; +@import (reference) "./icon-colors.less"; +@import (reference) "./tools.less"; +@import (reference) "./icons.less"; +@import (reference) "./modal.less"; +@import (reference) "./help.less"; + +.toolbar_vars ( + @color: @colortheme_default-color, // Color of the text for the toolbar + @bg-color: @colortheme_default-bg, // color of the toolbar background + @warn-color: @colortheme_default-warn // color of the warning text in the toolbar +) { + @toolbar-color: @color; + @toolbar-color-l20: lighten(@color, 20%); + @toolbar-color-d20: darken(@color, 20%); + @toolbar-color-d15: darken(@color, 15%); + + @toolbar-bg-color: @bg-color; + @toolbar-bg-color-l8: lighten(@bg-color, 8%); + @toolbar-bg-color-l20: lighten(@bg-color, 20%); + @toolbar-bg-color-d5: darken(@bg-color, 5%); + @toolbar-bg-color-d10: darken(@bg-color, 10%); + @toolbar-bg-color-d15: darken(@bg-color, 15%); + + @toolbar-warn-color: @warn-color; + + @toolbar-userlist-name-edit: contrast(@toolbar-color, @toolbar-color-l20, @toolbar-color-d20); +}; .toolbar_main ( @color: @colortheme_default-color, // Color of the text for the toolbar @@ -17,7 +38,41 @@ @warn-color: @colortheme_default-warn, // color of the warning text in the toolbar @barWidth: 600px // width of the toolbar ) { + --LessLoader_require: LessLoader_currentFile(); + .toolbar_vars(@color, @bg-color, @warn-color); + + --toolbar-color: @toolbar-color; + --toolbar-color-l20: @toolbar-color-l20; + --toolbar-color-d20: @toolbar-color-d20; + --toolbar-color-d15: @toolbar-color-d15; + + --toolbar-bg-color: @toolbar-bg-color; + --toolbar-bg-color-l8: @toolbar-bg-color-l8; + --toolbar-bg-color-l20: @toolbar-bg-color-l20; + --toolbar-bg-color-d5: @toolbar-bg-color-d5; + --toolbar-bg-color-d10: @toolbar-bg-color-d10; + --toolbar-bg-color-d15: @toolbar-bg-color-d15; + + --toolbar-warn-color: @toolbar-warn-color; + --toolbar-userlist-name-edit: @toolbar-userlist-name-edit; + + @media screen and (max-width: @barWidth) { + .cp-toolbar-rightside { + flex-wrap: wrap; + height: auto; + width: 100%; + } + } + + .help_main(@color, @bg-color); + .dropdown_main(); + .history_main(); + .iconColors_main(); + .modal_main(); +}; +& { + .toolbar_vars(); @toolbar_line-height: 32px; @toolbar_top-height: 64px; @toolbar_button-font: @colortheme_app-font; @@ -26,12 +81,27 @@ // this is a workaround .fa-shhare-alt:before { content: "\f1e0"; } - .dropdown_main(); .ckeditor_fix(); - .history_main(); - .iconColors_main(); - .markdownToolbar_main(@color, @bg-color); - .help_main(@color, @bg-color); + + .cp-markdown-toolbar { + height: @toolbar_line-height; + background-color: @toolbar-bg-color-l20; + background-color: var(--toolbar-bg-color-l20); + display: none; + button { + height: @toolbar_line-height !important; + outline: 0; + color: @toolbar-color; + color: var(--toolbar-color); + .toolbar_button; + font: normal normal normal 14px/1 FontAwesome; + &:hover { + background-color: @toolbar-bg-color-l8; + background-color: var(--toolbar-bg-color-l8); + } + &.cp-markdown-help { float: right; } + } + } .cp-toolbar-container { display: flex; @@ -65,7 +135,8 @@ } .cp-toolbar-userlist-drawer { - background-color: @bg-color; + background-color: @toolbar-bg-color; + background-color: var(--toolbar-bg-color); font: @colortheme_app-font-size @colortheme_font; min-width: 175px; width: 175px; @@ -253,31 +324,39 @@ } .cp-toolbar-userlist-drawer { - background-color: @bg-color; - color: @color; + background-color: @toolbar-bg-color; + background-color: var(--toolbar-bg-color); + color: @toolbar-color; + color: var(--toolbar-color); .cp-toolbar-userlist-drawer-close { - color: @color; + color: @toolbar-color; + color: var(--toolbar-color); } h2 { - background-color: darken(@bg-color, 10%); - color: @color; + background-color: @toolbar-bg-color-d10; + background-color: var(--toolbar-bg-color-d10); + color: @toolbar-color; + color: var(--toolbar-color); } .cp-toolbar-userlist-name-input { - background-color: darken(@bg-color, 10%); - color: @color; + background-color: @toolbar-bg-color-d10; + background-color: var(--toolbar-bg-color-d10); + color: @toolbar-color; + color: var(--toolbar-color); } .cp-toolbar-userlist-name-edit { - color: contrast(@color, - lighten(@color, 20%), - darken(@color, 20%)); + color: @toolbar-userlist-name-edit; + color: var(--toolbar-userlist-name-edit); background: transparent; &:hover { - color: @color; + color: @toolbar-color; + color: var(--toolbar-color); } } .cp-toolbar-userlist-friend { &:hover { - color: darken(@color, 15%); + color: @toolbar-color-d15; + color: var(--toolbar-color-d15); } } } @@ -297,8 +376,10 @@ display: flex; flex-wrap: wrap; justify-content: space-between; - background-color: @bg-color; - color: @color; + background-color: @toolbar-bg-color; + background-color: var(--toolbar-bg-color); + color: @toolbar-color; + color: var(--toolbar-color); .fa { font: normal normal normal 14px/1 FontAwesome; @@ -516,42 +597,57 @@ .cp-toolbar-spinner { font-size: @colortheme_app-font-size; - color: @color; + color: @toolbar-color; + color: var(--toolbar-color); } .cp-toolbar-limit { - text-shadow: -1px 0 @color, 0 1px @color, 1px 0 @color, 0 -1px @color; - color: @warn-color; + text-shadow: -1px 0 @toolbar-color, 0 1px @toolbar-color, 1px 0 @toolbar-color, 0 -1px @toolbar-color; + text-shadow: -1px 0 var(--toolbar-color), 0 1px var(--toolbar-color), 1px 0 var(--toolbar-color), 0 -1px var(--toolbar-color); + color: @toolbar-warn-color; + color: var(--toolbar-warn-color); } .cp-toolbar-leftside, .cp-toolbar-rightside { - background-color: lighten(@bg-color, 8%); + background-color: @toolbar-bg-color-l8; + background-color: var(--toolbar-bg-color-l8); button:hover, button.cp-toolbar-button-active { - background-color: @bg-color; + background-color: @toolbar-bg-color; + background-color: var(--toolbar-bg-color); } } .cp-toolbar-title-hoverable:hover { .cp-toolbar-title-editable, .cp-toolbar-title-edit { cursor: text; - border: 1px solid darken(@bg-color, 15%); - background: darken(@bg-color, 10%); + border: 1px solid @toolbar-bg-color-d15; + border: 1px solid var(--toolbar-bg-color-d15); + background: @toolbar-bg-color-d10; + background: var(--toolbar-bg-color-d10); transition: all 0.15s; - color: @color; + color: @toolbar-color; + color: var(--toolbar-color); } .cp-toolbar-title-editable { cursor: text; } } .cp-toolbar-title-save { - border: 1px solid darken(@bg-color, 15%); - background: darken(@bg-color, 10%); - color: @color; + border: 1px solid @toolbar-bg-color-d15; + border: 1px solid var(--toolbar-bg-color-d15); + background: @toolbar-bg-color-d10; + background: var(--toolbar-bg-color-d10); + color: @toolbar-color; + color: var(--toolbar-color); &:hover { - background: darken(@bg-color, 5%); + background: @toolbar-bg-color-d5; + background: var(--toolbar-bg-color-d5); } } input { - border: 1px solid darken(@bg-color, 15%); - background: darken(@bg-color, 10%); - color: @color; + border: 1px solid @toolbar-bg-color-d15; + border: 1px solid var(--toolbar-bg-color-d15); + background: @toolbar-bg-color-d10; + background: var(--toolbar-bg-color-d10); + color: @toolbar-color; + color: var(--toolbar-color); } .cp-dropdown-content.cp-dropdown-left a { color: black; @@ -577,7 +673,8 @@ padding: 0; margin: 0 5px; font-size: @colortheme_app-font-size; - color: @warn-color; + color: @toolbar-warn-color; + color: var(--toolbar-warn-color); .cp-pnp-msg { padding-left: 5px; font-family: @colortheme_font; @@ -586,7 +683,8 @@ font-size: @colortheme_app-font-size; font-family: @colortheme_font; font-weight: bold; - color: @warn-color; + color: @toolbar-warn-color; + color: var(--toolbar-warn-color); &:hover { text-decoration: underline; } @@ -880,11 +978,6 @@ display: flex; min-height: @toolbar_line-height; overflow: hidden; - @media screen and (max-width: @barWidth) { // 450px - flex-wrap: wrap; - height: auto; - width: 100%; - } &:empty { min-height: 0; height: 0; @@ -1003,6 +1096,5 @@ } } } - } diff --git a/customize.dist/src/less2/main.less b/customize.dist/src/less2/main.less deleted file mode 100644 index 1186465da..000000000 --- a/customize.dist/src/less2/main.less +++ /dev/null @@ -1,44 +0,0 @@ -@import (once) './include/font.less'; -.font_neuropolitical(); -.font_open-sans(); - -body.cp-page-index { @import "./pages/page-index.less"; } -body.cp-page-contact { @import "./pages/page-contact.less"; } -body.cp-page-login { @import "./pages/page-login.less"; } -body.cp-page-register { @import "./pages/page-register.less"; } -body.cp-page-what-is-cryptpad { @import "./pages/page-what-is-cryptpad.less"; } -body.cp-page-about { @import "./pages/page-about.less"; } -body.cp-page-privacy { @import "./pages/page-privacy.less"; } -body.cp-page-features { @import "./pages/page-features.less"; } -body.cp-page-faq { @import "./pages/page-faq.less"; } -body.cp-page-terms { @import "./pages/page-terms.less"; } - -// Set the HTML style for the apps which shouldn't have a body scrollbar -html.cp-app-noscroll { - @import "./include/app-noscroll.less"; - .app-noscroll_main(); -} -// Set the HTML style for printing slides -html.cp-app-print { - @import "./include/app-print.less"; - .app-print_main(); -} - -body.cp-readonly .cp-hidden-if-readonly { display: none !important; } - -body.cp-app-drive { @import "../../../drive/app-drive.less"; } -body.cp-app-pad { @import "../../../pad/app-pad.less"; } -body.cp-app-code { @import "../../../code/app-code.less"; } -body.cp-app-slide { @import "../../../slide/app-slide.less"; } -body.cp-app-file { @import "../../../file/app-file.less"; } -body.cp-app-filepicker { @import "../../../filepicker/app-filepicker.less"; } -body.cp-app-contacts { @import "../../../contacts/app-contacts.less"; } -body.cp-app-poll { @import "../../../poll/app-poll.less"; } -body.cp-app-whiteboard { @import "../../../whiteboard/app-whiteboard.less"; } -body.cp-app-todo { @import "../../../todo/app-todo.less"; } -body.cp-app-profile { @import "../../../profile/app-profile.less"; } -body.cp-app-settings { @import "../../../settings/app-settings.less"; } -body.cp-app-debug { @import "../../../debug/app-debug.less"; } -body.cp-app-worker { @import "../../../worker/app-worker.less"; } -body.cp-app-kanban { @import "../../../kanban/app-kanban.less"; } - diff --git a/customize.dist/src/less2/pages/page-404.less b/customize.dist/src/less2/pages/page-404.less index c6afae5b0..9ff9cdcc3 100644 --- a/customize.dist/src/less2/pages/page-404.less +++ b/customize.dist/src/less2/pages/page-404.less @@ -1,9 +1,8 @@ -@import (once) "../include/colortheme-all.less"; -@import (once) "../include/font.less"; -.font_neuropolitical(); -.font_open-sans(); +@import (reference) "../include/colortheme-all.less"; +@import (reference) "../include/font.less"; html, body { + .font_main(); margin: 0px; padding: 0px; #cp-main { diff --git a/customize.dist/src/less2/pages/page-about.less b/customize.dist/src/less2/pages/page-about.less index 9850b9621..23ce14e93 100644 --- a/customize.dist/src/less2/pages/page-about.less +++ b/customize.dist/src/less2/pages/page-about.less @@ -1,115 +1,118 @@ -@import (once) "../include/infopages.less"; -@import (once) "../include/colortheme-all.less"; +@import (reference) "../include/infopages.less"; +@import (reference) "../include/colortheme-all.less"; -.infopages_main(); -.infopages_topbar(); -#cp-main { - background: #fff; -} -.cp-about-intro { - padding-top: 3em; - padding-bottom: 3em; - background-image: url(/customize/bkabout.jpg); - background-size: cover; - background-repeat: no-repeat; - background-position: center; - .container { - color: #fff; - font-family: "Open Sans"; - h1 { - font-weight: 700; - } - a { +&.cp-page-about { + .infopages_main(); + + #cp-main { + background: #fff; + } + .cp-about-intro { + padding-top: 3em; + padding-bottom: 3em; + background-image: url(/customize/bkabout.jpg); + background-size: cover; + background-repeat: no-repeat; + background-position: center; + .container { color: #fff; - text-decoration: underline; - } - p { - padding-top: 1em; + font-family: "Open Sans"; + h1 { + font-weight: 700; + } + a { + color: #fff; + text-decoration: underline; + } + p { + padding-top: 1em; + } } } -} -.cp-container { - .row { - background: #fff; - } - .cp-bio-avatar { - padding-right: 0; - @media (max-width: 991px) { - padding-right: 15px; + .cp-container { + .row { + background: #fff; } - img { + .cp-bio-avatar { + padding-right: 0; @media (max-width: 991px) { - margin: 0 auto; - display: block; + padding-right: 15px; + } + img { + @media (max-width: 991px) { + margin: 0 auto; + display: block; + } } } - } - .cp-bio-avatar-right { - padding-right: 15px; - padding-left: 0; - @media (max-width: 991px) { - padding-left: 15px; + .cp-bio-avatar-right { + padding-right: 15px; + padding-left: 0; + @media (max-width: 991px) { + padding-left: 15px; + } } } -} -.cp-develop-about { - .cp-icon-cent { - width: 6rem; - background: #fff; - border-radius: 50%; - height: 6rem; - box-shadow: 0 5px 15px rgba(69,145,196, 0.3); - margin: 0 auto; - background-image: url(/customize/code.svg); - background-repeat: no-repeat; - margin-top: 1em; - margin-bottom: 1.5em; - background-position: 50%; - background-size: 4rem; - } - h2 { - margin-top: 0; - font-weight: 600; - color: #1E1F1F; - margin-bottom: 1.5em; - } -} -.cp-profile-det { - padding-left: 30px; - h3 { - color: #1E1F1F; - font-weight: 700; + .cp-develop-about { + .cp-icon-cent { + width: 6rem; + background: #fff; + border-radius: 50%; + height: 6rem; + box-shadow: 0 5px 15px rgba(69,145,196, 0.3); + margin: 0 auto; + background-image: url(/customize/code.svg); + background-repeat: no-repeat; + margin-top: 1em; + margin-bottom: 1.5em; + background-position: 50%; + background-size: 4rem; + } + h2 { + margin-top: 0; + font-weight: 600; + color: #1E1F1F; + margin-bottom: 1.5em; + } } - p { - color: #3F4141; + .cp-profile-det { + padding-left: 30px; + h3 { + color: #1E1F1F; + font-weight: 700; + } + p { + color: #3F4141; + margin-bottom: 1em; + } + hr { + margin-left: 0; + width: 15rem; + border-top: 2px solid @cryptpad_color_blue; + } margin-bottom: 1em; } - hr { - margin-left: 0; - width: 15rem; - border-top: 2px solid @cryptpad_color_blue; - } - margin-bottom: 1em; -} -.cp-soc-media { - font-size: 1.5em; - color: @cryptpad_color_blue; - padding-right: 1em; - display: inline-block; - &:hover { - transform: scale(1.1); - } - &:visited { + .cp-soc-media { + font-size: 1.5em; color: @cryptpad_color_blue; + padding-right: 1em; + display: inline-block; + &:hover { + transform: scale(1.1); + } + &:visited { + color: @cryptpad_color_blue; + } + } + .cp-contrib { + margin-top: 3em; + .cp-icon-cent { + background-image: url(/customize/source-branch.svg); + background-position: 60%; } -} -.cp-contrib { - margin-top: 3em; - .cp-icon-cent { - background-image: url(/customize/source-branch.svg); - background-position: 60%; + } + .cp-margin-bot { + margin-bottom: 1.5em; } } -.cp-margin-bot { - margin-bottom: 1.5em; -} + diff --git a/customize.dist/src/less2/pages/page-contact.less b/customize.dist/src/less2/pages/page-contact.less index 5cfe5245b..10150f597 100644 --- a/customize.dist/src/less2/pages/page-contact.less +++ b/customize.dist/src/less2/pages/page-contact.less @@ -1,90 +1,92 @@ -@import (once) "../include/infopages.less"; -@import (once) "../include/colortheme-all.less"; +@import (reference) "../include/infopages.less"; +@import (reference) "../include/colortheme-all.less"; -.infopages_main(); -.infopages_topbar(); +&.cp-page-contact { + .infopages_main(); -.fa { - padding-right: 0.25em; -} -#cp-main { - background-color: #fff; -} -.cp-container { - background: #fff; - .cp-iconCont { - h4 { - margin-top: 1.5em; - margin-bottom: 1.5em; - } - div { - .card { - padding: 4em 1em 0.5em 1em; - box-shadow: 0 5px 15px rgba(69,145,196, 0.3); - border-color: #fff; - text-align: center; - margin-bottom: 1em; - &:hover, &:focus { - text-decoration: none; - transform: scale(1.05); - } - @media (max-width: 1200px) and (min-width: 769px) { - min-height: 139px; - } - @media (max-width: 768px) and (min-width: 576px) { - min-height: 164px; - } - @media (max-width: 496px) { - min-height: 140px; - } - @media (max-width: 335px) { - min-height: 162px; - } + .fa { + padding-right: 0.25em; + } + #cp-main { + background-color: #fff; + } + .cp-container { + background: #fff; + .cp-iconCont { + h4 { + margin-top: 1.5em; + margin-bottom: 1.5em; } - &:nth-child(2) { + div { .card { - background-image: url(/customize/images/twitter.svg); - background-repeat: no-repeat; - background-position: 50% 10%; - background-size: 3rem; + padding: 4em 1em 0.5em 1em; + box-shadow: 0 5px 15px rgba(69,145,196, 0.3); + border-color: #fff; + text-align: center; + margin-bottom: 1em; + &:hover, &:focus { + text-decoration: none; + transform: scale(1.05); + } + @media (max-width: 1200px) and (min-width: 769px) { + min-height: 139px; + } + @media (max-width: 768px) and (min-width: 576px) { + min-height: 164px; + } + @media (max-width: 496px) { + min-height: 140px; + } + @media (max-width: 335px) { + min-height: 162px; + } } - } - &:nth-child(3) { - .card { - background-image: url(/customize/images/issue.svg); - background-repeat: no-repeat; - background-position: 50% 10%; - background-size: 3rem; + &:nth-child(2) { + .card { + background-image: url(/customize/images/twitter.svg); + background-repeat: no-repeat; + background-position: 50% 10%; + background-size: 3rem; + } } - } - &:nth-child(4) { - .card { - background-image: url(/customize/images/sayhi.svg); - background-repeat: no-repeat; - background-position: 50% 10%; - background-size: 3rem; + &:nth-child(3) { + .card { + background-image: url(/customize/images/issue.svg); + background-repeat: no-repeat; + background-position: 50% 10%; + background-size: 3rem; + } } - } - &:nth-child(5) { - .card { - background-image: url(/customize/images/email.svg); - background-repeat: no-repeat; - background-position: 50% 10%; - background-size: 3rem; + &:nth-child(4) { + .card { + background-image: url(/customize/images/sayhi.svg); + background-repeat: no-repeat; + background-position: 50% 10%; + background-size: 3rem; + } + } + &:nth-child(5) { + .card { + background-image: url(/customize/images/email.svg); + background-repeat: no-repeat; + background-position: 50% 10%; + background-size: 3rem; + } } } } } -} -.cp-contdet { - padding-top: 3em; - padding-bottom: 3em; - background-image: url(/customize/images/bkcontact.jpg); - background-size: cover; - background-repeat: no-repeat; - background-position: center; - h1 { - font-weight: 700; - color: #fff; + .cp-contdet { + padding-top: 3em; + padding-bottom: 3em; + background-image: url(/customize/images/bkcontact.jpg); + background-size: cover; + background-repeat: no-repeat; + background-position: center; + h1 { + font-weight: 700; + color: #fff; + } } } + diff --git a/customize.dist/src/less2/pages/page-faq.less b/customize.dist/src/less2/pages/page-faq.less index f0861a40d..96ba157e1 100644 --- a/customize.dist/src/less2/pages/page-faq.less +++ b/customize.dist/src/less2/pages/page-faq.less @@ -1,84 +1,86 @@ -@import (once) "../include/infopages.less"; -@import (once) "../include/colortheme-all.less"; +@import (reference) "../include/infopages.less"; +@import (reference) "../include/colortheme-all.less"; -.infopages_main(); -.infopages_topbar(); -#cp-main { - background: #fff; -} -.cp-faq { - padding-top: 3em; - padding-bottom: 3em; - background-image: url(/customize/images/cover-faq.jpg); - background-size: cover; - background-repeat: no-repeat; - background-position: center; - .container { - color: #fff; - font-family: "Open Sans"; +&.cp-page-faq { + .infopages_main(); + + #cp-main { + background: #fff; } - h1 { - font-weight: 700; + .cp-faq { + padding-top: 3em; + padding-bottom: 3em; + background-image: url(/customize/images/cover-faq.jpg); + background-size: cover; + background-repeat: no-repeat; + background-position: center; + .container { + color: #fff; + font-family: "Open Sans"; + } + h1 { + font-weight: 700; + } } -} -.cp-faq-ques-det { - .cp-faq-header { - a { - padding: 0; - h4 { - margin-top: 1.5rem; - margin-bottom: 1.5rem; - .cp-brand-font { - font-family: "Neuropolitical"; + .cp-faq-ques-det { + .cp-faq-header { + a { + padding: 0; + h4 { + margin-top: 1.5rem; + margin-bottom: 1.5rem; + .cp-brand-font { + font-family: "Neuropolitical"; + } } } } } -} -.cp-faq-container { - .cp-faq-questions-items { - background: #3a84b6; - color: #fff; - padding: 1rem 1rem 0.5rem 1rem; - margin-bottom: 1rem; - } - .cp-faq-questions-q { - padding: 0; - margin-bottom: 0.5rem; - cursor: pointer; - -webkit-touch-callout: none; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - &:hover { - text-decoration: none; + .cp-faq-container { + .cp-faq-questions-items { + background: #3a84b6; + color: #fff; + padding: 1rem 1rem 0.5rem 1rem; + margin-bottom: 1rem; } - &:after { - content: '\f067'; - font-family: FontAwesome; - font-weight: normal; - font-style: normal; - float: right; - text-decoration: none; - font-size: 13px; - line-height: 1.5; + .cp-faq-questions-q { + padding: 0; + margin-bottom: 0.5rem; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + &:hover { + text-decoration: none; + } + &:after { + content: '\f067'; + font-family: FontAwesome; + font-weight: normal; + font-style: normal; + float: right; + text-decoration: none; + font-size: 13px; + line-height: 1.5; + } } - } - .cp-faq-questions-q.active-faq { - &:after { - content: '\f068'; + .cp-faq-questions-q.active-faq { + &:after { + content: '\f068'; + } } + .cp-faq-questions-a { + display: none; + padding: 0.5rem; + margin-bottom: 0.5rem; + background-color: #fff; + color: #212529; + } + margin-bottom: 1.5rem; } - .cp-faq-questions-a { - display: none; - padding: 0.5rem; - margin-bottom: 0.5rem; - background-color: #fff; - color: #212529; - } - margin-bottom: 1.5rem; } diff --git a/customize.dist/src/less2/pages/page-features.less b/customize.dist/src/less2/pages/page-features.less index a65eed039..adaf174c7 100644 --- a/customize.dist/src/less2/pages/page-features.less +++ b/customize.dist/src/less2/pages/page-features.less @@ -1,86 +1,89 @@ -@import (once) "../include/infopages.less"; -@import (once) "../include/colortheme-all.less"; +@import (reference) "../include/infopages.less"; +@import (reference) "../include/colortheme-all.less"; -.infopages_main(); -.infopages_topbar(); -#cp-main { - background-color: #fff; -} -.cp_cont_features { - padding-top: 3em; - padding-bottom: 3em; - background-image: url('/customize/images/cover-features.jpg'); - background-size: cover; - background-repeat: no-repeat; - background-position: center; - h1 { - font-weight: 700; - color: #fff; +&.cp-page-features { + .infopages_main(); + + #cp-main { + background-color: #fff; } -} -#cp-features-register { - text-align: center; - padding: 20px; -} -.cp-features-register-button { - font-size: 20px; - color: #fff; - background: @cryptpad_color_blue; - border: 2px solid @cryptpad_color_blue; - border-radius: 0; - &:hover { - transform: scale(1.05); - cursor: pointer; + .cp_cont_features { + padding-top: 3em; + padding-bottom: 3em; + background-image: url('/customize/images/cover-features.jpg'); + background-size: cover; + background-repeat: no-repeat; + background-position: center; + h1 { + font-weight: 700; + color: #fff; + } } - padding: 0.5em 1em; -} -.cp-features-web { - .card { - box-shadow: 0 5px 15px rgba(69, 145, 196, 0.3); - border: none; + #cp-features-register { + text-align: center; + padding: 20px; } - h3 { + .cp-features-register-button { + font-size: 20px; color: #fff; + background: @cryptpad_color_blue; + border: 2px solid @cryptpad_color_blue; + border-radius: 0; + &:hover { + transform: scale(1.05); + cursor: pointer; + } + padding: 0.5em 1em; } - .list-group { - li { - &:before { - content: "\f00c"; - font-family: "FontAwesome"; - font-size: 14px; - color: @cryptpad_color_blue; - padding-right: 10px; + .cp-features-web { + .card { + box-shadow: 0 5px 15px rgba(69, 145, 196, 0.3); + border: none; + } + h3 { + color: #fff; + } + .list-group { + li { + &:before { + content: "\f00c"; + font-family: "FontAwesome"; + font-size: 14px; + color: @cryptpad_color_blue; + padding-right: 10px; + } + } + div { + display: inline; } } - div { - display: inline; + a.voted { + opacity: 0.6; + margin-left: 15px; + &:hover { + opacity: 1; + } } - } - a.voted { - opacity: 0.6; - margin-left: 15px; - &:hover { - opacity: 1; + .list-group-item { + border-color: rgba(69, 145, 196, 0.125); } } - .list-group-item { - border-color: rgba(69, 145, 196, 0.125); - } -} -.cp-anon-user { - .card-body { - background-color: @cryptpad_color_blue; - } -} -.cp-regis-user { - @media (max-width:575px) { - margin-top: 3em; + .cp-anon-user { + .card-body { + background-color: @cryptpad_color_blue; + } } - .card-body { - &:first-of-type { - background: #4591C4; - background: -webkit-linear-gradient(to right, #FF7C4F, #4592C4); // lesshint duplicateProperty: false - background: linear-gradient(to right, #FF7C4F, #4592C4); // lesshint duplicateProperty: false + .cp-regis-user { + @media (max-width:575px) { + margin-top: 3em; + } + .card-body { + &:first-of-type { + background: #4591C4; + background: -webkit-linear-gradient(to right, #FF7C4F, #4592C4); // lesshint duplicateProperty: false + background: linear-gradient(to right, #FF7C4F, #4592C4); // lesshint duplicateProperty: false + } } } } + diff --git a/customize.dist/src/less2/pages/page-index.less b/customize.dist/src/less2/pages/page-index.less index 75518f5f8..167423ad1 100644 --- a/customize.dist/src/less2/pages/page-index.less +++ b/customize.dist/src/less2/pages/page-index.less @@ -1,192 +1,193 @@ -@import (once) "../include/infopages.less"; -@import (once) "../include/colortheme-all.less"; +@import (reference) "../include/infopages.less"; +@import (reference) "../include/colortheme-all.less"; -.infopages_main(); -.infopages_topbar(); +&.cp-page-index { + .infopages_main(); -@background_lighter: rgba(0,0,0,0.1); -@background_darker: rgba(0,0,0,0.4); -#cp-main { - color: #FFF; - background: linear-gradient( @background_darker, @background_lighter ), url('/customize/bg14.jpg'); - background-size: cover; - background-position: center; - min-height: 100vh; - display: flex; - flex-direction: column; - justify-content: space-between; - align-items: center; - .container { - @media only screen and (max-device-width : 576px) { - margin-top: 6em; + @background_lighter: rgba(0,0,0,0.1); + @background_darker: rgba(0,0,0,0.4); + #cp-main { + color: #FFF; + background: linear-gradient( @background_darker, @background_lighter ), url('/customize/bg14.jpg'); + background-size: cover; + background-position: center; + min-height: 100vh; + display: flex; + flex-direction: column; + justify-content: space-between; + align-items: center; + .container { + @media only screen and (max-device-width : 576px) { + margin-top: 6em; + } } } -} -body { - font-family: "Open Sans", Helvetica; -} -.cp-right { - .cp-register-btn { - padding: 0.5em 1em 0.7em 1em; - border: 2px solid #fff; - &:hover { - transform: scale(1.05); - } + body { + font-family: "Open Sans", Helvetica; } - .cp-login-btn { - color: #fff; - padding: 0.5em 1em 0.7em 1em; - &:hover { - transform: scale(1.05); + .cp-right { + .cp-register-btn { + padding: 0.5em 1em 0.7em 1em; + border: 2px solid #fff; + &:hover { + transform: scale(1.05); + } + } + .cp-login-btn { + color: #fff; + padding: 0.5em 1em 0.7em 1em; + &:hover { + transform: scale(1.05); + } } } -} -.cp-title { - display: flex; - align-items: center; - flex-direction: column; - margin-top: 1.5em; - img { - height: 20vh; - margin-bottom: 1.5em; - } - margin-left: 0; - h1 { - font-family: "Neuropolitical"; - //font-family: Garamond, Baskerville, "Baskerville Old Face", "Hoefler Text", "Times New Roman", Times, serif; - //font-family: "Raleway"; - font-size: 45px; - } - p { - //font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; - font-size: 20px; - //font-style: italic; + .cp-title { + display: flex; + align-items: center; + flex-direction: column; + margin-top: 1.5em; + img { + height: 20vh; + margin-bottom: 1.5em; + } + margin-left: 0; + h1 { + font-family: "Neuropolitical"; + //font-family: Garamond, Baskerville, "Baskerville Old Face", "Hoefler Text", "Times New Roman", Times, serif; + //font-family: "Raleway"; + font-size: 45px; + } + p { + //font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; + font-size: 20px; + //font-style: italic; + } } -} -.navbar { - background: transparent; - width: 100%; - @media only screen and (max-device-width: 991px) { - margin-top: 0; + .navbar { + background: transparent; + width: 100%; + @media only screen and (max-device-width: 991px) { + margin-top: 0; + } + .navbar-brand { + background-image: url(/customize/CryptPad-white-logo.svg); + } + a { + color: #fff; + &:visited { + color: rgba(255,255,255,.9); + }; + } + .nav-link { + &:hover { + color: inherit; + transform: scale(1.05); + }; + } + .cp-register-btn { + border: 2px solid #fff; + } + .navbar-toggler { + margin-top: 10px; + color: #fff; + } } - .navbar-brand { - background-image: url(/customize/CryptPad-white-logo.svg); + @callout-padding: 15px; + a:hover { + text-decoration: none; } - a { - color: #fff; - &:visited { - color: rgba(255,255,255,.9); - }; + .bs-callout { + display: flex; + align-items: stretch; + margin: 25px 0; + background: rgba(255,255,255,0.6); + color: black; + transition: all .1s ease-in-out; + box-sizing: border-box; + height: 5em; + position: relative; + a { + color: black; + &:hover { text-decoration-line: none; } + } + div h4 { + @media only screen and (min-device-width: 576px) and (max-device-width: 767px) { + font-size: 1.3em; + } + } } - .nav-link { - &:hover { - color: inherit; - transform: scale(1.05); - }; + h4 { + margin: 0; } - .cp-register-btn { - border: 2px solid #fff; + .cp-callout-more-moremsg,.cp-callout-more-lessmsg { + transform: none !important; } - .navbar-toggler { - margin-top: 10px; - color: #fff; + .bs-callout div { + display: flex; + align-items: center; + justify-content: center; + height: 100%; + position: absolute; + left: 5em; } -} -@callout-padding: 15px; -a:hover { - text-decoration: none; -} -.bs-callout { - display: flex; - align-items: stretch; - margin: 25px 0; - background: rgba(255,255,255,0.6); - color: black; - transition: all .1s ease-in-out; - box-sizing: border-box; - height: 5em; - position: relative; - a { - color: black; - &:hover { text-decoration-line: none; } + .bs-callout+.bs-callout { + margin-top: -5px; } - div h4 { - @media only screen and (min-device-width: 576px) and (max-device-width: 767px) { - font-size: 1.3em; - } - } -} -h4 { - margin: 0; -} -.cp-callout-more-moremsg,.cp-callout-more-lessmsg { - transform: none !important; -} -.bs-callout div { - display: flex; - align-items: center; - justify-content: center; - height: 100%; - position: absolute; - left: 5em; -} -.bs-callout+.bs-callout { - margin-top: -5px; -} -.bs-callout:hover { - //color: white; - transform: scale(1.05); - cursor: pointer; -} -.bs-callout:hover.cp-callout-more { - transform: none !important; -} -.bs-callout .fa { - display: flex; - align-items: center; - font-size: 2em; - padding-left: 0.57em; - width: 2em; - transition: width 0.1s; - color: #fff; -} -.cp-callout-pad .fa { background-color: @colortheme_pad-bg; } -.cp-callout-code .fa { background-color: @colortheme_code-bg; } -.cp-callout-slide .fa { background-color: @colortheme_slide-bg; } -.cp-callout-poll .fa { background-color: @colortheme_poll-bg; } -.cp-callout-kanban .fa { background-color: @colortheme_kanban-bg; } -.cp-callout-whiteboard .fa { background-color: @colortheme_whiteboard-bg; } -.cp-callout-recent .fa { background-color: @colortheme_drive-bg; } -.cp-hidden { display: none !important; } -.cp-callout-more { - display: inline-block; - align-content: center; - height: 2em; - border-radius: 1em; - margin-left: auto; - margin-right: auto; - margin-top: 0; - background: none; - width: 100%; - div { - .infopages_link(); + .bs-callout:hover { + //color: white; + transform: scale(1.05); + cursor: pointer; + } + .bs-callout:hover.cp-callout-more { + transform: none !important; + } + .bs-callout .fa { + display: flex; + align-items: center; + font-size: 2em; + padding-left: 0.57em; + width: 2em; + transition: width 0.1s; color: #fff; - .fa { - font-size: inherit; - padding: 0; - width: 1em; - padding-left: 5px; - } } -} -@media (min-width: 576px) and (max-width: 767px) { - .container { - padding-left: 0; - padding-right: 0; + .cp-callout-pad .fa { background-color: @colortheme_pad-bg; } + .cp-callout-code .fa { background-color: @colortheme_code-bg; } + .cp-callout-slide .fa { background-color: @colortheme_slide-bg; } + .cp-callout-poll .fa { background-color: @colortheme_poll-bg; } + .cp-callout-kanban .fa { background-color: @colortheme_kanban-bg; } + .cp-callout-whiteboard .fa { background-color: @colortheme_whiteboard-bg; } + .cp-callout-recent .fa { background-color: @colortheme_drive-bg; } + .cp-hidden { display: none !important; } + .cp-callout-more { + display: inline-block; + align-content: center; + height: 2em; + border-radius: 1em; + margin-left: auto; + margin-right: auto; + margin-top: 0; + background: none; + width: 100%; + div { + .infopages_link(); + color: #fff; + .fa { + font-size: inherit; + padding: 0; + width: 1em; + padding-left: 5px; + } + } } - div#cp-main.cp-page-index .cp-topbar .navbar-toggler-left { - left: 5px; + @media (min-width: 576px) and (max-width: 767px) { + .container { + padding-left: 0; + padding-right: 0; + } + div#cp-main.cp-page-index .cp-topbar .navbar-toggler-left { + left: 5px; + } } } diff --git a/customize.dist/src/less2/pages/page-login.less b/customize.dist/src/less2/pages/page-login.less index 2f77e74f4..c92a08bde 100644 --- a/customize.dist/src/less2/pages/page-login.less +++ b/customize.dist/src/less2/pages/page-login.less @@ -1,69 +1,71 @@ -@import (once) "../include/infopages.less"; -@import (once) "../include/colortheme-all.less"; -@import (once) "../include/alertify.less"; -@import (once) "../include/checkmark.less"; +@import (reference) "../include/infopages.less"; +@import (reference) "../include/colortheme-all.less"; +@import (reference) "../include/alertify.less"; +@import (reference) "../include/checkmark.less"; -.infopages_main(); -.infopages_topbar(); -.alertify_main(); -.checkmark_main(20px); +&.cp-page-login { + .infopages_main(); + .alertify_main(); + .checkmark_main(20px); -.form-group { - .extra { - display: flex; - align-items: center; - justify-content: space-between; - width: 100%; - } -} -.cp-container { - #data { - background: #4591C4; - padding-top: 3em; - padding-bottom: 7em; - padding-left: 30px; - padding-right: 30px; - p { - color: #fff; - } - h2 { - font-weight: 700; - color: @cryptpad_header_col; + .form-group { + .extra { + display: flex; + align-items: center; + justify-content: space-between; + width: 100%; } } - #userForm { - padding-top: 3em; - padding-bottom: 2em; - .form-control { - border-radius: 0; - color: @cryptpad_text_col; - margin-top: 1em; - &:focus { - border-color: @cryptpad_color_blue; + .cp-container { + #data { + background: #4591C4; + padding-top: 3em; + padding-bottom: 7em; + padding-left: 30px; + padding-right: 30px; + p { + color: #fff; + } + h2 { + font-weight: 700; + color: @cryptpad_header_col; } } - .checkbox-container { - color: @cryptpad_text_col; + #userForm { + padding-top: 3em; + padding-bottom: 2em; + .form-control { + border-radius: 0; + color: @cryptpad_text_col; + margin-top: 1em; + &:focus { + border-color: @cryptpad_color_blue; + } + } + .checkbox-container { + color: @cryptpad_text_col; + } } - } - .align-items-center { - box-shadow: 0 5px 15px rgba(69,145,196, 0.3); - background: #fff; - } - .extra { - margin-top: 1em; - .login { - background: @cryptpad_color_blue; - color: #fff; - padding: 10px; - border-radius: 0; - &:hover { - transform: scale(1.05); + .align-items-center { + box-shadow: 0 5px 15px rgba(69,145,196, 0.3); + background: #fff; + } + .extra { + margin-top: 1em; + .login { + background: @cryptpad_color_blue; + color: #fff; + padding: 10px; + border-radius: 0; + &:hover { + transform: scale(1.05); + } } } } + .cp-container { + padding-top: 3em; + min-height: 66vh; + } } -.cp-container { - padding-top: 3em; - min-height: 66vh; -} + diff --git a/customize.dist/src/less2/pages/page-privacy.less b/customize.dist/src/less2/pages/page-privacy.less index cfd575173..2f6418e40 100644 --- a/customize.dist/src/less2/pages/page-privacy.less +++ b/customize.dist/src/less2/pages/page-privacy.less @@ -1,48 +1,51 @@ -@import (once) "../include/infopages.less"; -@import (once) "../include/colortheme-all.less"; +@import (reference) "../include/infopages.less"; +@import (reference) "../include/colortheme-all.less"; -.infopages_main(); -.infopages_topbar(); -#cp-main { - background: #fff; -} -.cp-privacy-top { - padding-top: 3em; - padding-bottom: 3em; - background-image: url(/customize/images/cover-privacy.jpg); - background-size: cover; - background-repeat: no-repeat; - background-position: center; - .container { - color: #fff; - font-family: "Open Sans"; - h1 { - font-weight: 700; - } - a { +&.cp-page-privacy { + .infopages_main(); + + #cp-main { + background: #fff; + } + .cp-privacy-top { + padding-top: 3em; + padding-bottom: 3em; + background-image: url(/customize/images/cover-privacy.jpg); + background-size: cover; + background-repeat: no-repeat; + background-position: center; + .container { color: #fff; - text-decoration: underline; + font-family: "Open Sans"; + h1 { + font-weight: 700; + } + a { + color: #fff; + text-decoration: underline; + } + p { + padding-top: 1em; + } + } + } + .cp-privacy { + background-image: url(/customize/CryptPadlogo_op5.svg); + background-size: cover; + background-repeat: no-repeat; + background-position: center; + hr { + margin-left: 0; + width: 15rem; + border-top: 2px solid #4591C4; + } + h3 { + color: #1E1F1F; + font-weight: 700; } p { - padding-top: 1em; + color: #3F4141; } } } -.cp-privacy { - background-image: url(/customize/CryptPadlogo_op5.svg); - background-size: cover; - background-repeat: no-repeat; - background-position: center; - hr { - margin-left: 0; - width: 15rem; - border-top: 2px solid #4591C4; - } - h3 { - color: #1E1F1F; - font-weight: 700; - } - p { - color: #3F4141; - } -} + diff --git a/customize.dist/src/less2/pages/page-register.less b/customize.dist/src/less2/pages/page-register.less index 84944f4df..314ad7236 100644 --- a/customize.dist/src/less2/pages/page-register.less +++ b/customize.dist/src/less2/pages/page-register.less @@ -1,139 +1,142 @@ -@import (once) "../include/infopages.less"; -@import (once) "../include/colortheme-all.less"; -@import (once) "../include/alertify.less"; -@import (once) "../include/checkmark.less"; +@import (reference) "../include/infopages.less"; +@import (reference) "../include/colortheme-all.less"; +@import (reference) "../include/alertify.less"; +@import (reference) "../include/checkmark.less"; -.infopages_main(); -.infopages_topbar(); -.alertify_main(); -.checkmark_main(20px); +&.cp-page-register { + .infopages_main(); -.cp-container { - .form-group { - .checkbox-container { - &:nth-of-type(1) { - margin-top: 2em; + .alertify_main(); + .checkmark_main(20px); + + .cp-container { + .form-group { + .checkbox-container { + &:nth-of-type(1) { + margin-top: 2em; + } + &:last-of-type { + margin-bottom: 1em; + } } - &:last-of-type { - margin-bottom: 1em; + #register { + &.btn { + padding: .5rem .5rem; + } + margin-top: 16px; + font-size: 1.25em; + min-width: 30%; } } - #register { - &.btn { - padding: .5rem .5rem; - } - margin-top: 16px; - font-size: 1.25em; - min-width: 30%; - } + padding-bottom: 3em; + min-height: 5vh; } - padding-bottom: 3em; - min-height: 5vh; -} -.alertify { - // workaround for alertify making empty p - p:empty { - display: none; + .alertify { + // workaround for alertify making empty p + p:empty { + display: none; + } } -} -.cp-register-wel { - padding-top: 6em; - padding-bottom: 20em; - background-image: url(/customize/bkregister.jpg); - background-size: cover; - background-repeat: no-repeat; - background-position: center; - h1 { - font-weight: 700; - color: #fff; - text-shadow: 0 1px 5px rgba(0,0,0,.2); + .cp-register-wel { + padding-top: 6em; + padding-bottom: 20em; + background-image: url(/customize/bkregister.jpg); + background-size: cover; + background-repeat: no-repeat; + background-position: center; + h1 { + font-weight: 700; + color: #fff; + text-shadow: 0 1px 5px rgba(0,0,0,.2); + } } -} -.cp-register-det { - margin-top: -7em; - background: #fff; - box-shadow: 0 5px 15px rgba(69,145,196, 0.3); + .cp-register-det { + margin-top: -7em; + background: #fff; + box-shadow: 0 5px 15px rgba(69,145,196, 0.3); - #data { - // Old browsers - background: #4591C4; + #data { + // Old browsers + background: #4591C4; - // Chrome 10-25, Safari 5.1-6 - background: -webkit-linear-gradient(to right, #FF7C4F, #4592C4); // lesshint duplicateProperty: false + // Chrome 10-25, Safari 5.1-6 + background: -webkit-linear-gradient(to right, #FF7C4F, #4592C4); // lesshint duplicateProperty: false - // W3C, IE 10+/ Edge, Firefox 16+, Chrome 26+, Opera 12+, Safari 7+ - background: linear-gradient(to right, #FF7C4F, #4592C4); // lesshint duplicateProperty: false + // W3C, IE 10+/ Edge, Firefox 16+, Chrome 26+, Opera 12+, Safari 7+ + background: linear-gradient(to right, #FF7C4F, #4592C4); // lesshint duplicateProperty: false - padding-top: 3em; - padding-bottom: 7em; - padding-left: 30px; - padding-right: 30px; - p { - color: #fff; - li { - margin-bottom: 1em; + padding-top: 3em; + padding-bottom: 7em; + padding-left: 30px; + padding-right: 30px; + p { + color: #fff; + li { + margin-bottom: 1em; + } + .fa { + font-size: 1.5em; + padding-right: 10px; + color: #000; + } } - .fa { - font-size: 1.5em; - padding-right: 10px; - color: #000; + h3 { + font-weight: 700; + margin-bottom: 1em; } } - h3 { - font-weight: 700; - margin-bottom: 1em; + #userForm { + padding-top: 3em; + padding-bottom: 2em; + .form-control { + border-radius: 0; + color: @cryptpad_text_col; + margin-top: 1em; + &:focus { + border-color: @cryptpad_color_blue; + } + } + .checkbox-container { + color: @cryptpad_text_col; + } } - } - #userForm { - padding-top: 3em; - padding-bottom: 2em; - .form-control { + .cp-login-register { + color: @cryptpad_color_blue; + background: #fff; + border: 2px solid @cryptpad_color_blue; border-radius: 0; - color: @cryptpad_text_col; - margin-top: 1em; - &:focus { - border-color: @cryptpad_color_blue; + &:hover { + transform: scale(1.05); } } - .checkbox-container { + } + .cp-register-test { + margin-top: 3em; + hr { + width: 15rem; + border-top: 2px solid @cryptpad_color_blue; + margin-top: 0; + margin-bottom: 2em; + } + p { + margin-bottom: 0; + } + .cp-test-source { + font-style: italic; + } + .test-details { + padding-left: 4em; + background-image: url(/customize/testimonial.svg); + background-repeat: no-repeat; + background-position: left top; + background-size: 3em; color: @cryptpad_text_col; } + } - .cp-login-register { - color: @cryptpad_color_blue; + #cp-main { background: #fff; - border: 2px solid @cryptpad_color_blue; - border-radius: 0; - &:hover { - transform: scale(1.05); - } } } -.cp-register-test { - margin-top: 3em; - hr { - width: 15rem; - border-top: 2px solid @cryptpad_color_blue; - margin-top: 0; - margin-bottom: 2em; - } - p { - margin-bottom: 0; - } - .cp-test-source { - font-style: italic; - } - .test-details { - padding-left: 4em; - background-image: url(/customize/testimonial.svg); - background-repeat: no-repeat; - background-position: left top; - background-size: 3em; - color: @cryptpad_text_col; - } -} -#cp-main { - background: #fff; -} diff --git a/customize.dist/src/less2/pages/page-terms.less b/customize.dist/src/less2/pages/page-terms.less index a1f8b2955..7370f34f3 100644 --- a/customize.dist/src/less2/pages/page-terms.less +++ b/customize.dist/src/less2/pages/page-terms.less @@ -1,5 +1,7 @@ -@import (once) "../include/infopages.less"; -@import (once) "../include/colortheme-all.less"; +@import (reference) "../include/infopages.less"; +@import (reference) "../include/colortheme-all.less"; + +&.cp-page-terms { + .infopages_main(); +} -.infopages_main(); -.infopages_topbar(); diff --git a/customize.dist/src/less2/pages/page-what-is-cryptpad.less b/customize.dist/src/less2/pages/page-what-is-cryptpad.less index f08655b9c..f26188fe7 100644 --- a/customize.dist/src/less2/pages/page-what-is-cryptpad.less +++ b/customize.dist/src/less2/pages/page-what-is-cryptpad.less @@ -1,43 +1,45 @@ -@import (once) "../include/infopages.less"; -@import (once) "../include/colortheme-all.less"; +@import (reference) "../include/infopages.less"; +@import (reference) "../include/colortheme-all.less"; -.infopages_main(); -.infopages_topbar(); +&.cp-page-what-is-cryptpad { + .infopages_main(); -.cp-what-is { + .cp-what-is { + padding-top: 3em; + padding-bottom: 3em; + background-image: url(/customize/bkwhat.jpg); + background-size: cover; + background-repeat: no-repeat; + background-position: center; + color: #fff; + h1 { + font-weight: 700; + } + } + #cp-main { + background: #fff; + } + .cp-container { padding-top: 3em; padding-bottom: 3em; - background-image: url(/customize/bkwhat.jpg); - background-size: cover; - background-repeat: no-repeat; - background-position: center; - color: #fff; - h1 { + h2 { + margin-top: 0; font-weight: 700; + color: @cryptpad_header_col; + } + p { + color: @cryptpad_text_col; + } + #zeroknowledge { + width: 65%; + } + .row { + margin-bottom: 1.5em; + } + img { + display: block; + margin: 0 auto; } -} -#cp-main { - background: #fff; -} -.cp-container { - padding-top: 3em; - padding-bottom: 3em; - h2 { - margin-top: 0; - font-weight: 700; - color: @cryptpad_header_col; - } - p { - color: @cryptpad_text_col; - } - #zeroknowledge { - width: 65%; - } - .row { - margin-bottom: 1.5em; - } - img { - display: block; - margin: 0 auto; } } + diff --git a/customize.dist/src/less2/readme.md b/customize.dist/src/less2/readme.md index 08a26ec9b..062b5baff 100644 --- a/customize.dist/src/less2/readme.md +++ b/customize.dist/src/less2/readme.md @@ -1,19 +1,45 @@ # CryptPad Styling -How it works: -* In this example, we use the index page, for each page we will have a corresponding class name and a corresponding less file. -* The index page has a main div containing everything `
` -* There is a corresponding less file called `less2/pages/page-index.less` -* Finally there is a corresponding line in main.less which imports that less file: `div#main.cp-page-index { @import "./pages/page-index.less"; }` - * cp-page-index class means: - * cp -> cryptpad - * page -> this is a style for accessing a page's less file - * index -> the name of the page and of the less file (page-index.less) -* And everything which is standardized across pages is included from `page-index.less` as variables and mixins. +## Linking Less/CSS + +In order to keep the amount of CSS generated under control, we use "linking", via the LessLoader. +This makes use of CSS variables in order to work. The old solution was to put all of the content into less mixins +which would be used inside of the scope where they should be, but this caused a state explosion because each app needed +essentially the same mixins. However, these mixins had arguments such as colors which were different per-app. + +The new solution is to set CSS variables for the arguments (like color) and then put the bulk of the less at the global +scope. When you include a dependency, the following happens: + +1. You `@include (reference) './include/dependency.less`. The (reference) argument which means it will not emit CSS, +this is important because otherwise all of the dependencies of your app's less file would end up bundled with it, the +state explosion problem. +2. You invoke `.dependency_main(@arg1 @arg2)` inside of the scope you want it in, the name `dependency_main` is a +convention, all less variables, mixins, or CSS variables which a file creates should be prefixed with the name of the +file (in this case, "dependency"). +3. The mixin `.dependency_main` does a couple of things: + * First, it sets a CSS variable called `--LessLoader_require`, this is a special variable which the browser does not + use, the only objective of this variable is to inform LessLoader that another file is needed. To do this, there is a + helper function (also specified in LessLoader.js) called `LessLoader_currentFile()`. The syntax is: + `--LessLoader_require: LessLoader_currentFile();` and in the CSS, this outputs something like: + `--LessLoader_require: "/customize/src/less2/include/dependency.less?ver=2.4.0-1531572157592";` + * Secondly, it sets browser variables for it's arguments, making sure to avoid namespace collisions: + `--dependency-arg1: @arg1;`, `--dependency-arg2: @arg2;`. Sometimes a less transformation needs to be done on a + variable, unfortunately in this case the transformation must be done here and the transformed variable must be output. + `--dependency-arg1-l10: lighten(@arg1, 10%);`. +4. After less processing is completed, the LessLoader caches the result of parsing, then scans the it for instances of +`--LessLoader_require` variable and then processes them, but it does this separately. So even if dependency.less is +required many times, it will only be processed by the less interpreter once. + +## Other convensions -Rules: * All of our new classes and ids should start with `cp-`. -* You may make as many files as you need, for different purposes, but they can only contain mixins and variables. +* The document body has a class on it depending on the app/page, app classes begin with `cp-app-` and page classes begin +with `cp-page-`. +* Custom classes ought to begin with `cp-` and the name of the file where the rules are written for them (see help.less as +an example of doing the right thing). +* Since the include files generate CSS and the app cannot control the scope which it's run at, be considerate avoid +making an include file which changes something significant (like making a rule for `li`). help.less is an excellent example +of doing this well, infopages.less is the worst example (fortunately it doesn't get included in any of the apps). * All mixins and variables must be prefixed with the name of the file where they're defined and and underscore. * e.g. `@colortheme_toolbar-poll-bg: #006304;` defined in `colortheme.less` * All mixin / variable files go in an `/include/` directory. diff --git a/customize.dist/template.js b/customize.dist/template.js index 0ee34d407..661ce6687 100644 --- a/customize.dist/template.js +++ b/customize.dist/template.js @@ -26,7 +26,7 @@ $(function () { window.Tether = function () {}; require([ - 'less!/customize/src/less2/main.less', + 'less!/customize/src/less2/pages/page-' + css + '.less', 'css!/bower_components/bootstrap/dist/css/bootstrap.min.css' ], function () { $body.append($main); diff --git a/customize.dist/translations/messages.de.js b/customize.dist/translations/messages.de.js index 6826230da..4f70ced16 100644 --- a/customize.dist/translations/messages.de.js +++ b/customize.dist/translations/messages.de.js @@ -1,17 +1,18 @@ - define(function () { - var out = {}; +define(function () { + var out = {}; - // translations must set this key for their language to be available in - // the language dropdowns that are shown throughout Cryptpad's interface - out._languageName = 'German'; + // translations must set this key for their language to be available in + // the language dropdowns that are shown throughout Cryptpad's interface + out._languageName = 'German'; - out.main_title = "Cryptpad: Echtzeitzusammenarbeit ohne Preisgabe von Informationen"; - out.main_slogan = "Einigkeit ist Stärke - Zusammenarbeit der Schlüssel"; // Der Slogan sollte evtl. besser englisch bleiben. + out.main_title = "Cryptpad: Echtzeitzusammenarbeit ohne Preisgabe von Informationen"; + out.main_slogan = "Einigkeit ist Stärke - Zusammenarbeit der Schlüssel"; - out.type = {}; - out.type.pad = 'Pad'; - out.type.code = 'Code'; + out.type = {}; + out.type.pad = 'Pad'; + out.type.code = 'Code'; out.type.poll = 'Umfrage'; + out.type.kanban = 'Kanban'; out.type.slide = 'Präsentation'; out.type.drive = 'CryptDrive'; out.type.whiteboard = 'Whiteboard'; @@ -25,6 +26,7 @@ out.button_newpoll = 'Neue Umfrage'; out.button_newslide = 'Neue Präsentation'; out.button_newwhiteboard = 'Neues Whiteboard'; + out.button_newkanban = 'Neues Kanban'; // NOTE: Remove updated_0_ if we need an updated_1_ out.updated_0_common_connectionLost = "Die Verbindung zum Server ist abgebrochen
Du verwendest jetzt das Dokument schreibgeschützt, bis die Verbindung wieder funktioniert."; @@ -32,17 +34,19 @@ out.websocketError = 'Verbindung zum Websocket fehlgeschlagen...'; out.typeError = "Dieses Dokument ist nicht mit dem Programm kompatibel"; - out.onLogout = 'Du bist ausgeloggt. {0}Klicke hier{1}, um wieder einzuloggen,
oder drucke die Escapetaste, um dein Dokument schreibgeschützt zu benutzen.'; - out.wrongApp = "Der Inhalt dieser Echtzeitsitzung kann nicht in deinem Browser angezeigt werden. Bitte lade die Seite neu."; + out.onLogout = 'Du bist ausgeloggt. {0}Klicke hier{1}, um wieder einzuloggen,
oder drücke die Escapetaste, um dein Dokument schreibgeschützt zu benutzen.'; + out.wrongApp = "Der Inhalt dieser Echtzeitsitzung kann nicht in Deinem Browser angezeigt werden. Bitte lade die Seite neu."; out.padNotPinned = 'Dieses Dokument wird nach 3 Monaten ohne Zugang auslaufen, {0}logge dich ein{1} or {2}registriere dich{3}, um das Auslaufen zu verhindern.'; out.anonymousStoreDisabled = "Der Webmaster dieses CryptPad Server hat die anonyme Verwendung deaktiviert. Du muss dich einloggen, um CryptDrive zu verwenden."; out.expiredError = 'Dieses Dokument ist abgelaufen und ist nicht mehr verfügbar.'; - out.deletedError = 'Dieses Dokument wurde von seinem Besitzer gelöscht und nicht mehr verfügbar.'; - out.inactiveError = 'Dieses Dokument ist wegen Inaktivität gelöscht worden. Drucke auf die Esc-Taste, um ein neues Dokument zu gestalten.'; - out.chainpadError = 'Ein kritischer Fehler hat stattgefunden, bei den Updates deines Dokuments. Dieses Dokument ist schreibgeschützt, damit du sicher machen kannst, dass keine Inhalt verloren geht.
'+ - 'Druck auf Esc, um das Dokument schreibgeschützt zu lesen, oder lade es neu, um das Editierien wiederanzufangen.'; - out.errorCopy = ' Du kannst noch den Inhalt woanders kopieren, nachdem du Esc drucken.
Wenn du die Seite verlässt, verschwindet der Inhalt für immer!'; - out.errorRedirectToHome = 'Drucke Esc, um zu deinem CryptDrive zu gehen.'; + out.deletedError = 'Dieses Dokument wurde von seinem Besitzer gelöscht und ist nicht mehr verfügbar.'; + out.inactiveError = 'Dieses Dokument ist wegen Inaktivität gelöscht worden. Drücke auf die Esc-Taste, um ein neues Dokument zu erstellen.'; + out.chainpadError = 'Ein kritischer Fehler ist beim Aktualisieren deines Dokuments aufgetreten. Dieses Dokument ist schreibgeschützt, damit du sicherstellen kannst, dass kein Inhalt verloren geht.
'+ + 'Drücke auf Esc, um das Dokument schreibgeschützt zu lesen, oder lade es neu, um das Editierien wieder aufzunehmen.'; + out.errorCopy = ' Du kannst noch den Inhalt woanders hin kopieren, nachdem du Esc gedrückt hast.
Wenn du die Seite verlässt, verschwindet der Inhalt für immer!'; + out.errorRedirectToHome = 'Drücke Esc um zu deinem CryptDrive zurückzukehren.'; + out.newVersionError = "Eine neue Version von CryptPad ist verfügbar.
" + + "Lade die Seite neu um die neue version zu benutzen, oder drücke Esc um im Offline-Modus weiterzuarbeiten."; out.loading = "Laden..."; out.error = "Fehler"; @@ -51,7 +55,7 @@ out.deleted = "Dokumente, die von deinem CryptDrive gelöscht wurden"; out.deletedFromServer = "Dokumente, die vom Server gelöscht wurden"; - out.realtime_unrecoverableError = "Das Echtzeitengine hat ein nicht-reparierbaren Fehler getroffen. Klicke auf OK, um neuzuladen."; + out.realtime_unrecoverableError = "Es ist ein nicht reparierbarer Fehler aufgetreten.. Klicke auf OK, um neuzuladen."; out.disconnected = 'Getrennt'; out.synchronizing = 'Synchronisieren'; @@ -96,13 +100,13 @@ out.formattedGB = "{0} GB"; out.formattedKB = "{0} KB"; - out.greenLight = "Alles funktioniert bestens"; - out.orangeLight = "Deine langsame Verbindung kann die Nutzung beeinträchtigen"; - out.redLight = "Du wurdest von dieser Sitzung getrennt"; + out.greenLight = "Alles funktioniert bestens"; + out.orangeLight = "Deine langsame Verbindung kann die Nutzung beeinträchtigen"; + out.redLight = "Du wurdest von dieser Sitzung getrennt"; - out.pinLimitReached = "Du hast deine Speicherplatzgrenze erreicht"; - out.updated_0_pinLimitReachedAlert = "Du hast deine Speicherplatzgrenze erreicht. Neue Dokumente werden nicht mehr in deinem CryptDrive gespeichert.
" + - 'Du kannst entweder Dokument von deinem CryptDrive entfernen oder ein Premiumagenbot anfordern, damit deine Grenze erhöht wird.'; + out.pinLimitReached = "Du hast Deine Speicherplatzgrenze erreicht"; + out.updated_0_pinLimitReachedAlert = "Du hast Deine Speicherplatzgrenze erreicht. Neue Dokumente werden nicht mehr in Deinem CryptDrive gespeichert.
" + + 'Du kannst entweder ein Dokument von deinem CryptDrive entfernen oder ein Premiumangebot anfordern, damit deine Grenze erhöht wird.'; out.pinLimitReachedAlert = out.updated_0_pinLimitReachedAlert; out.pinLimitReachedAlertNoAccounts = out.pinLimitReached; out.pinLimitNotPinned = "Du hast deine Speicherplatzgrenze erreicht.
"+ @@ -113,27 +117,27 @@ out.moreActions = "Mehr Aktionen"; out.importButton = "Importieren"; - out.importButtonTitle = 'Importiere eine lokale Datei in dieses Dokument'; + out.importButtonTitle = 'Importiere eine lokale Datei in dieses Dokument'; out.exportButton = "Exportieren"; - out.exportButtonTitle = 'Exportiere dieses Dokument in eine lokale Datei'; - out.exportPrompt = 'Wie möchtest du die Datei nennen?'; + out.exportButtonTitle = 'Exportiere dieses Dokument in eine lokale Datei'; + out.exportPrompt = 'Wie möchtest du die Datei nennen?'; out.changeNamePrompt = 'Ändere deinen Namen (oder lasse dieses Feld leer, um anonym mitzuarbeiten): '; out.user_rename = "Bearbeite deinen Name"; out.user_displayName = "Name"; out.user_accountName = "Kontoname"; - out.clickToEdit = "Zum Bearbeiten klicken"; - out.saveTitle = "Bitte gebe das Titel ein (enter)"; + out.clickToEdit = "Zum Bearbeiten klicken"; + out.saveTitle = "Bitte gebe den Titel ein (Enter)"; - out.forgetButtonTitle = 'Entferne dieses Dokument von deiner Startseitenliste'; + out.forgetButtonTitle = 'Entferne dieses Dokument von deiner Startseitenliste'; out.forgetButtonTitle = 'Dieses Dokument zum Papierkorb verschieben'; - out.forgetPrompt = 'Mit dem Klick auf OK wird das Dokument aus deinem lokalen Speicher gelöscht. Fortfahren?'; + out.forgetPrompt = 'Mit dem Klick auf OK wird das Dokument aus deinem lokalen Speicher gelöscht. Fortfahren?'; out.movedToTrash = 'Dieses Dokument liegt im Papierkorb.
Du kannst zum CryptDrive navigieren'; - out.shareButton = 'Teilen'; - out.shareSuccess = 'Die URL wurde in die Zwischenablage kopiert'; + out.shareButton = 'Teilen'; + out.shareSuccess = 'Die URL wurde in die Zwischenablage kopiert'; out.userListButton = "Benutzerliste"; @@ -142,24 +146,24 @@ out.newButton = 'Neu'; out.newButtonTitle = 'Neues Dokument gestalten'; out.uploadButton = 'Hochladen'; - out.uploadButtonTitle = 'Eine neue Datei ins aktuelle Ordner hochladen'; + out.uploadButtonTitle = 'Eine neue Datei in den aktuelle Ordner hochladen'; out.saveTemplateButton = "Als Vorlage speichern"; - out.saveTemplatePrompt = "Bitte gib ein Titel für die Vorlag ein"; + out.saveTemplatePrompt = "Bitte gib einen Titel für die Vorlage ein"; out.templateSaved = "Vorlage gespeichert!"; out.selectTemplate = "Bitte wähle eine Vorlage oder drucke die Esc Taste"; out.useTemplate = "Mit einer Vorlage starten?"; //Would you like to "You have available templates for this type of pad. Do you want to use one?"; - out.useTemplateOK = 'Wähle ein Template (Enter)'; + out.useTemplateOK = 'Wähle eine Vorlage (Enter)'; out.useTemplateCancel = 'Frisch starten (Esc)'; out.template_import = "Eine Vorlage importieren"; out.template_empty = "Keine Vorlage verfügbar"; - out.previewButtonTitle = "Der Markdownvorschau (un)sichtbar machen"; + out.previewButtonTitle = "Die Markdownvorschau (un)sichtbar machen"; out.presentButtonTitle = "Zum Präsentationsmodus wechseln"; out.backgroundButtonTitle = 'Hintergrundfarbe'; - out.colorButtonTitle = 'Die Hintergrundfrabe des Präsentationsmodus bearbeiten'; + out.colorButtonTitle = 'Die Hintergrundfarbe des Präsentationsmodus bearbeiten'; out.propertiesButton = "Eigenschaften"; out.propertiesButtonTitle = 'Die Eigenschaften des Dokuments ansehen'; @@ -172,7 +176,7 @@ out.printDate = "Datum anzeigen"; out.printTitle = "Titel der Präsentation anzeigen"; out.printCSS = "Custom CSS Regeln (CSS):"; - out.printTransition = "Animierte Transitionen aktivieren"; + out.printTransition = "Animierte Übergänge aktivieren"; out.printBackground = "Ein Hintergrundbild verwenden"; out.printBackgroundButton = "Bitte ein Bild wählen"; out.printBackgroundValue = "Aktueller Hintergrund: {0}"; @@ -185,13 +189,13 @@ out.filePicker_filter = "Namensfilter"; out.or = 'oder'; - out.tags_title = "Tags (for you only)"; + out.tags_title = "Tags (nur für dich)"; out.tags_add = "Die Tags dieser Seite bearbeiten"; out.tags_searchHint = "Dateien mit Tags in deinem CryptDrive suchen"; out.tags_searchHint = "Die Suche mit dem Tag # in deinem CryptDrive starten."; out.tags_notShared = "Deine Tags sind nicht mit anderen Benutzern geteilt"; out.tags_duplicate = "Doppeltes Tag: {0}"; - out.tags_noentry = "Du kannst ein Tag auf einem gelöschten Dokument nicht hinzufügen!"; + out.tags_noentry = "Du kannst kein Tag bei einem gelöschten Dokument hinzufügen!"; out.slideOptionsText = "Einstellungen"; out.slideOptionsTitle = "Präsentationseinstellungen"; @@ -201,27 +205,27 @@ out.languageButton = "Sprache"; out.languageButtonTitle = "Bitte wähle die Sprache für die Syntaxhervorhebung"; out.themeButton = "Farbschema"; - out.themeButtonTitle = "Wähle das Farbschema um Kode und Folieneditor darzustellen"; - - out.editShare = "Mitarbeit-URL teilen"; - out.editShareTitle = "Mitarbeit-URL in die Zwischenablage kopieren"; - out.editOpen = "Die Mitarbeit-URL in ein neues Tab öffnen"; - out.editOpenTitle = "Öffne dieses Dokument in Mitarbeitmodus in einem neuem Tab"; - out.viewShare = "Schreibgeschützt-URL teilen"; - out.viewShareTitle = "Schreibgeschützt-URL in die Zwischenablage kopieren"; - out.viewOpen = "In neuem Tab anzeigen"; - out.viewOpenTitle = "Dokument schreibgeschützt in neuem Tab öffnen."; + out.themeButtonTitle = "Wähle das Farbschema für Code und Folieneditor"; + + out.editShare = "Mitarbeits-URL teilen"; + out.editShareTitle = "Mitarbeit-URL in die Zwischenablage kopieren"; + out.editOpen = "Die Mitarbeits-URL in einem neuen Tab öffnen"; + out.editOpenTitle = "Öffne dieses Dokument im Mitarbeitmodus in einem neuen Tab"; + out.viewShare = "Schreibgeschützte URL teilen"; + out.viewShareTitle = "Schreibgeschützte URL in die Zwischenablage kopieren"; + out.viewOpen = "In neuem Tab anzeigen"; + out.viewOpenTitle = "Dokument schreibgeschützt in neuem Tab öffnen."; out.fileShare = "Link kopieren"; out.getEmbedCode = "Einbettungscode anzeigen"; - out.viewEmbedTitle = "Das Dokument in einer externe Webseite einbetten"; - out.viewEmbedTag = "Um dieses Dokument einzubetten, benutzt du dieses iframe in deiner HTML Seite, wie du wilsst. Du kannst mit CSS oder HTML Attributen das Stil erweitern"; + out.viewEmbedTitle = "Das Dokument in eine externe Webseite einbetten"; + out.viewEmbedTag = "Um dieses Dokument einzubetten, platziere dieses iframe an der gewünschten Stelle Deiner HTML Seite. Du kannst es mit CSS oder HTML Attributen gestalten"; out.fileEmbedTitle = "Die Datei in einer externen Seite einbetten"; - out.fileEmbedScript = "Um diese Datei einzubetten, bringst du dieses Skript einmal in deiner Webseite, damit das Media-Tag geladen wird:"; - out.fileEmbedTag = "Dann kannst du das Media-Tag, wo du willst auf einder Seite platzieren:"; + out.fileEmbedScript = "Um diese Datei einzubetten, füge dieses Skript einmal in Deiner Webseite ein, damit das Media-Tag geladen wird:"; + out.fileEmbedTag = "Dann platziere das Media-Tag an der gewünschten Stelle der Seite:"; - out.notifyJoined = "{0} ist in der Mitarbeit-Sitzung "; + out.notifyJoined = "{0} ist in der Mitarbeits-Sitzung "; out.notifyRenamed = "{0} ist jetzt als {1} bekannt"; - out.notifyLeft = "{0} hat die Mitarbeit-Sitzung verlassen"; + out.notifyLeft = "{0} hat die Mitarbeits-Sitzung verlassen"; out.okButton = 'OK (enter)'; @@ -238,6 +242,7 @@ out.history_next = "früher"; out.history_prev = "Zur früheren Version wechseln"; out.history_goTo = "Zur genannten Version wechseln"; + out.history_loadMore = "Weiteren Verlauf laden"; out.history_close = "Zurück"; out.history_closeTitle = "Verlauf schliessen"; out.history_restore = "wiederherstellen"; @@ -252,59 +257,68 @@ out.pad_mediatagWidth = "Breite (px)"; out.pad_mediatagHeight = "Höhe (px)"; - // Polls - - out.poll_title = "Datumsplaner ohne Preisgabe von Infos"; - out.poll_subtitle = "Echtzeit-planen ohne Preisgabe von Infos"; - - out.poll_p_save = "Deine Einstellungen werden sofort automatisch gesichert."; - out.poll_p_encryption = "Alle Eingaben sind verschlüsselt, deshalb haben nur Leute im Besitz des Links Zugriff. Selbst der Server sieht nicht was du änderst."; - - out.wizardLog = "Klicke auf den Button links oben um zur Umfrage zurückzukehren."; - out.wizardTitle = "Nutze den Assistenten um deine Umfrage zu erstellen."; - out.wizardConfirm = "Bist du wirklich bereit die angegebenen Optionen bereits zu deiner Umfrage hinzuzufügen?"; - - - out.poll_publish_button = "Veröffentlichen"; - out.poll_admin_button = "Admin"; - out.poll_create_user = "Neuen Benutzer hinzufügen"; - out.poll_create_option = "Neue Option hinzufügen"; - out.poll_commit = "Einchecken"; - - out.poll_closeWizardButton = "Assistent schließen"; - out.poll_closeWizardButtonTitle = "Assistent schließen"; - out.poll_wizardComputeButton = "Optionen übernehmen"; - out.poll_wizardClearButton = "Tabelle leeren"; - out.poll_wizardDescription = "Erstelle die Optionen automatisch, indem du eine beliebige Anzahl von Daten und Zeiten eingibst."; - out.poll_wizardAddDateButton = "+ Daten"; - out.poll_wizardAddTimeButton = "+ Zeiten"; - - out.poll_optionPlaceholder = "Option"; - out.poll_userPlaceholder = "Dein Name"; + // Kanban + out.kanban_newBoard = "Neues Kanban-Bord"; + out.kanban_item = "Item {0}"; // Item number for initial content + out.kanban_todo = "Zu bearbeiten"; + out.kanban_done = "Erledigt"; + out.kanban_working = "In Bearbeitung"; + out.kanban_deleteBoard = "Bist du sicher, dass du dieses Bord löschen möchtest?"; + out.kanban_addBoard = "Ein Bord hinzufügen"; + out.kanban_removeItem = "Dieses Item entfernen"; + out.kanban_removeItemConfirm = "Bist du sicher, dass du dieses Item löschen möchtest?"; + + // Polls + out.poll_title = "Terminplaner ohne Preisgabe von Daten"; + out.poll_subtitle = "Echtzeit-planen ohne Preisgabe von Daten"; + + out.poll_p_save = "Deine Einstellungen werden sofort automatisch gesichert."; + out.poll_p_encryption = "Alle Eingaben sind verschlüsselt, deshalb haben nur Leute Zugriff, die den Link kennen. Selbst der Server sieht nicht was Du änderst."; + + out.wizardLog = "Klicke auf den Button links oben um zur Umfrage zurückzukehren."; + out.wizardTitle = "Nutze den Assistenten um deine Umfrage zu erstellen."; + out.wizardConfirm = "Bist du wirklich bereit, die angegebenen Optionen bereits zu deiner Umfrage hinzuzufügen?"; + + out.poll_publish_button = "Veröffentlichen"; + out.poll_admin_button = "Admin"; + out.poll_create_user = "Neuen Benutzer hinzufügen"; + out.poll_create_option = "Neue Option hinzufügen"; + out.poll_commit = "Einchecken"; + + out.poll_closeWizardButton = "Assistent schließen"; + out.poll_closeWizardButtonTitle = "Assistent schließen"; + out.poll_wizardComputeButton = "Optionen übernehmen"; + out.poll_wizardClearButton = "Tabelle leeren"; + out.poll_wizardDescription = "Erstelle die Optionen automatisch, indem du eine beliebige Anzahl von Daten und Zeiten eingibst."; + out.poll_wizardAddDateButton = "+ Daten"; + out.poll_wizardAddTimeButton = "+ Zeiten"; + + out.poll_optionPlaceholder = "Option"; + out.poll_userPlaceholder = "Dein Name"; out.poll_removeOption = "Bist du sicher, dass du diese Option entfernen möchtest?"; out.poll_removeUser = "Bist du sicher, dass du diese(n) Nutzer*in entfernen möchtest?"; - out.poll_titleHint = "Titel"; - out.poll_descriptionHint = "Beschreibe deine Abstimmung und publiziere sie mit dem 'Veröffentlichen'-Knopf wenn du fertig bis."+ - " Die Beschreibung kann mit dem Markdown Syntax geschrieben werden und du kannst Media-Elemente von deinem CryptPad einbetten." + - "Jeder mit dem Link kann die Beschreibung ändern, aber es ist keine gute Praxis."; + out.poll_titleHint = "Titel"; + out.poll_descriptionHint = "Beschreibe deine Abstimmung und publiziere sie mit dem 'Veröffentlichen'-Knopf wenn du fertig bist."+ + " Die Beschreibung kann mit Markdown Syntax geschrieben werden und Du kannst Media-Elemente von deinem CryptPad einbetten." + + "Jeder, der den Link kennt, kann die Beschreibung ändern, aber es ist keine gute Praxis."; out.poll_remove = "Entfernen"; out.poll_edit = "Bearbeiten"; out.poll_locked = "Gesperrt"; out.poll_unlocked = "Editierbar"; - out.poll_bookmark_col = 'Setze ein Lesezeichen auf dieser Spalte, damit sie immer editierbar und links immer für dich erscheint.'; - out.poll_bookmarked_col = 'Dieses ist die Splate mit Lesezeichen für dich. Sie wird immer editierbar und links für dich angezeigt.'; + out.poll_bookmark_col = 'Setze ein Lesezeichen auf dieser Spalte, damit sie immer gleich editierbar und links angezeigt wird.'; + out.poll_bookmarked_col = 'Dieses ist die Spalte mit Lesezeichen für dich. Sie wird immer editierbar und links angezeigt.'; out.poll_total = 'SUMME'; out.poll_comment_list = "Komentare"; - out.poll_comment_add = "Ein Kommentar hinzufügen"; + out.poll_comment_add = "Einen Kommentar hinzufügen"; out.poll_comment_submit = "Schicken"; - out.poll_comment_remove = "Dieses Kommentar entfernen"; + out.poll_comment_remove = "Diesen Kommentar entfernen"; out.poll_comment_placeholder = "Dein Kommentar"; - out.poll_comment_disabled = "Diese Umfrage mit dem ✓ Knopf veröffentlichen, damit die Kommentare möglich sind."; + out.poll_comment_disabled = "Diese Umfrage mit dem ✓ Knopf veröffentlichen, damit Kommentare möglich sind."; // Canvas out.canvas_clear = "Löschen"; @@ -323,11 +337,11 @@ // Profile out.profileButton = "Profil"; // dropdown menu out.profile_urlPlaceholder = 'URL'; - out.profile_namePlaceholder = 'Angezeigte name'; + out.profile_namePlaceholder = 'Angezeigter Name'; out.profile_avatar = "Avatar"; - out.profile_upload = " Ein neues Avatar hochladen"; + out.profile_upload = " Einen neuen Avatar hochladen"; out.profile_uploadSizeError = "Fehler: Dein Avatar muss kleiner als {0} sein"; - out.profile_uploadTypeError = "Fehler: Das Typ dieses Bild ist nicht unterestützt. Unterstütze Typen sind: {0}"; + out.profile_uploadTypeError = "Fehler: Der Typ dieses Bildes wird nicht unterstützt. Unterstütze Typen sind: {0}"; out.profile_error = "Fehler bei der Erstellung deines Profils: {0}"; out.profile_register = "Du muss dich einloggen, um ein Profil zu erstellen!"; out.profile_create = "Ein Profil erstellen"; @@ -336,35 +350,34 @@ out.profile_inviteButton = "Sich in Verbindung setzen"; out.profile_inviteButtonTitle ='Ein Link erstellen, damit dieser Benutzer sich mit dir in Verbindung setzt.'; - out.profile_inviteExplanation = "Ein Klick auf OK wird ein Link erstellen, dass eine sichere Chatsession nur mit {0} erlaubt.

Dieses Link kann öffentlich gepostet werden."; + out.profile_inviteExplanation = "Ein Klick auf OK wird einen Link erstellen, der eine sichere Chatsession nur mit {0} erlaubt.

Dieser Link kann öffentlich gepostet werden."; out.profile_viewMyProfile = "Mein Profil anzeigen"; // contacts/userlist out.userlist_addAsFriendTitle = 'Benutzer "{0}" als Kontakt hinzufügen'; out.userlist_thisIsYou = 'Das bist du ("{0}")'; - out.userlist_pending = "Wartet..."; + out.userlist_pending = "Warte..."; out.contacts_title = "Kontakte"; out.contacts_addError = 'Fehler bei dem Hinzufügen des Kontakts in die Liste'; - out.contacts_added = 'Verbindungeinladung angenommen.'; - out.contacts_rejected = 'Verbindungeinladung abgelehnt'; + out.contacts_added = 'Verbindungseinladung angenommen.'; + out.contacts_rejected = 'Verbindungseinladung abgelehnt'; out.contacts_request = 'Benutzer {0} möchtet dich als Kontakt hinzufügen. Annehmen?'; out.contacts_send = 'Schicken'; - out.contacts_remove = 'Dieses Kontakt entfernen'; + out.contacts_remove = 'Diesen Kontakt entfernen'; out.contacts_confirmRemove = 'Bist du sicher, dass du {0} von der Kontaktliste entfernen möchtest?'; out.contacts_typeHere = "Gebe eine Nachricht ein..."; out.contacts_info1 = "Diese ist deine Kontaktliste. Ab hier, kannst du:"; - out.contacts_info2 = "Auf dem Avatar eines Kontakts klicken, um mit diesem Benutzer zu chatten"; - out.contacts_info3 = "Das Avatar doppelklicken, um sein Profil anzuzeigen"; - out.contacts_info4 = "Jede Teilnehmer, kann den Chatverlauf löschen"; + out.contacts_info2 = "Auf den Avatar eines Kontakts klicken, um mit diesem Benutzer zu chatten"; + out.contacts_info3 = "Den Avatar doppelklicken, um sein Profil anzuzeigen"; + out.contacts_info4 = "Jeder Teilnehmer kann den Chatverlauf löschen"; out.contacts_removeHistoryTitle = 'Den Chatverlauf löschen'; - out.contacts_confirmRemoveHistory = 'Bist du sicher, den Chatverlauf komplett zu löschen? Die Daten sind dann weg.'; - out.contacts_removeHistoryServerError = 'Es gab ein Fehler bei dem Löschen des Chatverlaufs. Versuche es noch einmal später'; + out.contacts_confirmRemoveHistory = 'Bist du sicher, dass du den Chatverlauf komplett löschen willst? Die Daten sind dann weg.'; + out.contacts_removeHistoryServerError = 'Es gab einen Fehler bei dem Löschen des Chatverlaufs. Versuche es später noch einmal'; out.contacts_fetchHistory = "Den früheren Verlauf laden"; // File manager - out.fm_rootName = "Dokumente"; out.fm_trashName = "Papierkorb"; out.fm_unsortedName = "Dateien (ohne Ordnung)"; @@ -373,9 +386,10 @@ out.fm_searchName = "Suchen"; out.fm_recentPadsName = "Zuletzt geöffnete Dokumente"; out.fm_ownedPadsName = "Eigene"; + out.fm_tagsName = "Tags"; out.fm_searchPlaceholder = "Suchen..."; out.fm_newButton = "Neu"; - out.fm_newButtonTitle = "Ein neues Dokument oder Ordner gestalten, oder eine Datei in dem aktuellen Ordner importiere"; + out.fm_newButtonTitle = "Ein neues Dokument oder Ordner erstellen, oder eine Datei in den aktuellen Ordner importieren"; out.fm_newFolder = "Neuer Ordner"; out.fm_newFile = "Neues Dokument"; out.fm_folder = "Ordner"; @@ -392,49 +406,52 @@ out.fm_openParent = "Im Ordner zeigen"; out.fm_noname = "Dokument ohne Titel"; out.fm_emptyTrashDialog = "Soll der Papierkorb wirklich gelöscht werden?"; - out.fm_removeSeveralPermanentlyDialog = "Bist sicher, diese {0} Elemente dauerhaft aus deinem CryptDrive zu entfernen?"; - out.fm_removePermanentlyDialog = "Bist sicher, dieses Element dauerhaft aus deinem CryptDrive zu entfernen?"; - out.fm_removeSeveralDialog = "Bist du sicher, diese {0} Elemente aus dem Papierkorb zu entfernen?"; - out.fm_removeDialog = "Bist sicher, {0} zum Papierkorb zu verschieben?"; - out.fm_deleteOwnedPad = "Bist du sicher, dieses Dokument aus dem Server dauerhaft zu löschen?"; + out.fm_removeSeveralPermanentlyDialog = "Bist du sicher, dass du diese {0} Elemente dauerhaft aus deinem CryptDrive entfernen willst?"; + out.fm_removePermanentlyDialog = "Bist du sicher, dass du dieses Element dauerhaft aus deinem CryptDrive entfernen willst?"; + out.fm_removeSeveralDialog = "Bist Du sicher, dasss du diese {0} Elemente aus dem Papierkorb entfernen willst?"; + out.fm_removeDialog = "Bist du sicher, dass du {0} zum Papierkorb zu verschieben?"; + out.fm_deleteOwnedPad = "Bist du sicher, dass du dieses Dokument aus dem Server dauerhaft löschen willst?"; out.fm_deleteOwnedPads = "Bist du sicher, dass du diese Dokumente dauerhaft aus dem Server entfernen möchtest?"; out.fm_restoreDialog = "Bist du sicher, dass du {0} zurück zum originalen Ordner verschieben möchtests?"; - out.fm_unknownFolderError = "Der Ordner, der gerade gewählt oder letzlich besucht wurde, existiert nicht mehr. Der Parentordner wird geöffnet..."; - out.fm_contextMenuError = "Fehler bei der Öfnnung des Kontextmenü für dieses Element. Wenn dieses Problem wieder erscheint, versuche die Seite neuzuladen."; - out.fm_selectError = "Fehler bei der Selektierung des Zielelements. Wenn dieses Problem wieder erscheint, versuche die Seite neuzuladen."; - out.fm_categoryError = "Fehler bei dem Öffnen der selektierten Kategorie. Der Wurzel wird angezeigt."; - out.fm_info_root = "Gestalte hier soviele Ordnern, wie du willst, um deine Dateien und Dokumente zu organisieren."; - out.fm_info_unsorted = 'Hier sind alle Dateien, die du besucht hast, noch nicht in "Dokumente" sortiert sind oder zum Papierkorb verschoben wurden.'; + out.fm_unknownFolderError = "Der Ordner, der gerade gewählt oder letzlich besucht wurde, existiert nicht mehr. Der übergeordnete Ordner wird geöffnet..."; + out.fm_contextMenuError = "Fehler bei der Öfnnung des Kontextmenü für dieses Element. Wenn dieses Problem wieder erscheint, versuche die Seite neu zu laden."; + out.fm_selectError = "Fehler bei der Selektierung des Zielelements. Wenn dieses Problem wieder erscheint, versuche die Seite neu zu laden."; + out.fm_categoryError = "Fehler beim Öffnen der selektierten Kategorie. Der Stamm-Ordner wird angezeigt."; + out.fm_info_root = "Erstelle hier so viele Ordner, wie du willst, um deine Dateien und Dokumente zu organisieren."; + out.fm_info_unsorted = 'Hier sind alle Dateien, die Du besucht hast, die noch nicht in "Dokumente" sortiert sind oder zum Papierkorb verschoben wurden.'; out.fm_info_template = 'Hier sind alle Dokumente, die als Vorlage gespeichert wurden und die du wiederverwenden kannst, um ein neues Dokument zu erstellen.'; - out.fm_info_recent = "Liste der zuletzt geöffnete Dokumente."; + out.fm_info_recent = "Liste der zuletzt geöffneten Dokumente."; out.updated_0_fm_info_trash = 'Leere den Papierkorb, um mehr freien Platz in deinem CryptDrive zu erhalten.'; out.fm_info_trash = out.updated_0_fm_info_trash; out.fm_info_allFiles = 'Beinhaltet alle Dateien von "Dokumente", "Unklassifiziert" und "Papierkorb". Dateien können hier nicht verschoben werden.'; out.fm_info_anonymous = 'Du bist nicht eingeloggt, daher laufen die Dokumente nach 3 Monaten aus (mehr dazu lesen). ' + - 'Zugang zu den Dokumenten ist in deinem Browser gespeichert, daher wir das Löschen des Browserverlaufs auch die Dokumente verschwinden lassen.
' + + 'Der Zugang zu den Dokumenten ist in deinem Browser gespeichert, daher wird das Löschen des Browserverlaufs auch die Dokumente verschwinden lassen.
' + 'Registriere dich oder logge dich ein, um sie dauerhaft zu machen.
'; - out.fm_info_owned = "Diese Dokumente sind deine eigene. Das heisst, dass du sie vom Server entfernen kannst, wann du willst. Wenn du das machst, dann wird es auch keinen Zugriff zu diesem für andere Benutzer geben."; + out.fm_info_owned = "Diese Dokumente sind deine eigenen. Das heisst, dass du sie vom Server entfernen kannst, wann Du willst. Wenn du das machst, dann wird es auch keinen Zugriff zu diesem für andere Benutzer geben."; out.fm_alert_backupUrl = "Backuplink für dieses CryptDrive.
" + - "Es ist hoch empfohlen dieses Link geheim zu halten.
" + - "Du kannst es benutzen, um deine gesamte Dateien abzurufen, wenn dein Browserspeicher gelöscht wurde.
" + - "Jede Person, die dieses Link hat, kann die Dateien in deinem CryptDrive bearbeiten oder löschen.
"; + "Es ist hoch empfohlen diesen Link geheim zu halten.
" + + "Du kannst es benutzen, um deine gesamten Dateien abzurufen, wenn dein Browserspeicher gelöscht wurde.
" + + "Jede Person, die diesen Link hat, kann die Dateien in deinem CryptDrive bearbeiten oder löschen.
"; out.fm_alert_anonymous = "Hallo, du benutzt CryptPad anonym. Das ist in Ordnung aber Dokumente können nach einer Inaktivitätsperiode gelöscht werden. " + - "Wir haben fortgeschrittene Aktionen aus dem anonymen CryptDrive entfernt, weil wir klar machen wollen, dass es kein sicherer Platz ist, Dinge zu lagern." + - 'Du kannst lesen, weshalb wir das machen und weshalb du wirklich ' + - 'registrieren oder eingloggen solltest.'; + "Wir haben fortgeschrittene Aktionen aus dem anonymen CryptDrive entfernt, weil wir klar machen wollen, dass es kein sicherer Platz ist, Dinge zu lagern." + + 'Du kannst lesen, weshalb wir das machen und weshalb du wirklich ' + + 'registrieren oder einloggen solltest.'; out.fm_backup_title = 'Backup link'; out.fm_nameFile = 'Wie soll diese Datei heissen?'; out.fm_error_cantPin = "Interner Serverfehler. Bitte lade die Seite neu und versuche es wieder."; - out.fm_viewListButton = "Listeansicht"; - out.fm_viewGridButton = "Kachelnansicht"; - out.fm_renamedPad = "Du hast ein spezielle Name für dieses Dokument gesetzt. Seine geteiltes Titel ist:
{0}"; + out.fm_viewListButton = "Listenansicht"; + out.fm_viewGridButton = "Kachelansicht"; + out.fm_renamedPad = "Du hast einen speziellen Name für dieses Dokument gesetzt. Seine geteilter Titel ist:
{0}"; out.fm_prop_tagsList = "Tags"; - out.fm_burnThisDriveButton = "Alle Informationen löschen , die CryptPad in deinem Browser hält"; - out.fm_burnThisDrive = "Bist du sicher, dass du alles, was CryptPad in deinem Browser hält löschen möchtest?
" + - "Das wird dein CryptDrive und seinen Verlauf von deinem Browser löschen, Dokumente werden noch auf unseres Server (verschlüsselt) bleiben."; + out.fm_burnThisDriveButton = "Alle Informationen löschen, die CryptPad in deinem Browser hält"; + out.fm_burnThisDrive = "Bist Du sicher, dass du alles, was CryptPad in deinem Browser gespeichert hat, löschen möchtest?
" + + "Das wird dein CryptDrive und seinen Verlauf in deinem Browser löschen, Dokumente werden noch (verschlüsselt) auf unserem Server bleiben."; out.fm_padIsOwned = "Dieses Dokument ist dein Eigenes"; out.fm_padIsOwnedOther = "Dieses Dokument ist von einem anderen Benutzer"; - out.fm_deletedPads = "Dieses Dokument existiert nicht mehr auf dem Server, es wurde von deinem CryptDrive gelöscht: {0}"; + out.fm_deletedPads = "Dieses Dokument existiert nicht mehr auf dem Server, es wurde von Deinem CryptDrive gelöscht: {0}"; + out.fm_tags_name = "Tag Bezeichnung"; + out.fm_tags_used = "Anzahl"; + // File - Context menu out.fc_newfolder = "Neuer Ordner"; out.fc_rename = "Unbenennen"; @@ -448,14 +465,15 @@ out.fc_prop = "Eigenschaften"; out.fc_hashtag = "Tags"; out.fc_sizeInKilobytes = "Grösse in Kilobytes"; + // fileObject.js (logs) - out.fo_moveUnsortedError = "Du kannst, ein Ordner nicht in die Liste von allen Pads verschieben"; - out.fo_existingNameError = "Dieser Dokumentname ist in diesem Verzeichnis schon da. Bitte wähle einen Anderen."; - out.fo_moveFolderToChildError = "Du kannst ein Ordner nicht in eine seine Nachfolgern verchieben"; - out.fo_unableToRestore = "Ein Fehler ist aufgetreten, um diese Datei zu seinem Herkunftordner zu verschieben. Du kannst probieren, diese zu einem anderen Ordner zu verschieben."; - out.fo_unavailableName = "Ein Dokument oder Ordner mit dem selben Name existiert in diesem Ordner schon. Bitte benenne es zuerst um, und versucht wieder zu verschieben."; + out.fo_moveUnsortedError = "Du kannst einen Ordner nicht in die Liste von allen Pads verschieben"; + out.fo_existingNameError = "Dieser Dokumentname existiert schon in diesem Verzeichnis. Bitte wähle einen Anderen."; + out.fo_moveFolderToChildError = "Du kannst einen Ordner nicht in einen seiner Nachfolger verschieben"; + out.fo_unableToRestore = "Es hat nicht funktioniert, diese Datei an ihrem Herkunftort wiederherzustellen. Du kannst versuchen, sie an einen anderen Ort zu verschieben."; + out.fo_unavailableName = "Ein Dokument oder Ordner mit diesem Namen existiert in diesem Ordner schon. Bitte benenne sie zuerst um, und versuche es dann erneut."; - out.fs_migration = "Dein CryptDrive wird gerade zu einer neueren Version aktualisiert. Daher muss die Seite neugeladen werden.
Bite lade die Seite neu, um sie weiter zu verwenden."; + out.fs_migration = "Dein CryptDrive wird gerade zu einer neueren Version aktualisiert. Daher muss die Seite neugeladen werden.
Bitte lade die Seite neu, um sie weiter zu verwenden."; // login out.login_login = "Einloggen"; @@ -470,41 +488,41 @@ out.login_confirm = "Passwort bestätigen"; out.login_remember = "Mein Login speichern"; - out.login_hashing = "Dein Passwort wird gerade durchgerechnet, das kann etwas dauert."; + out.login_hashing = "Dein Passwort wird gerade durchgerechnet, das kann etwas dauern."; out.login_hello = 'Hallo {0},'; // {0} is the username out.login_helloNoName = 'Hallo,'; out.login_accessDrive = 'Dein CryptDrive ansehen'; out.login_orNoLogin = 'oder'; - out.login_noSuchUser = 'Ungültiger Benutzername oder Passwort. Versuche es erneute oder registriere'; + out.login_noSuchUser = 'Ungültiger Benutzername oder Passwort. Versuche es erneut oder registriere dich'; out.login_invalUser = 'Der Benutzername kann nicht leer sein'; out.login_invalPass = 'Der Passwort kann nicht leer sein'; out.login_unhandledError = 'Ein Fehler ist aufgetreten:('; out.register_importRecent = "Die Dokumente aus deiner anonymen Sitzung importieren"; - out.register_acceptTerms = "Ich bin mit den Servicebedingungen einverstanden"; + out.register_acceptTerms = "Ich bin mit den Nutzungsbedingungen einverstanden"; out.register_passwordsDontMatch = "Passwörter sind nicht gleich!"; - out.register_passwordTooShort = "Passwörter müssen mindestens {0} Buchstaben haben."; + out.register_passwordTooShort = "Passwörter müssen mindestens {0} Zeichen haben."; - out.register_mustAcceptTerms = "Du musst mit den Servicebedingungen einverstanden sein."; - out.register_mustRememberPass = "Wir können dein Passwort nicht zurücksetzen, im Fall dass du dieses vergisst. Es ist äusserst wichtig, dass du dieses erinnerst! Bitte ticke das Kästchen ein."; + out.register_mustAcceptTerms = "Du musst mit den Nutzungsbedingungen einverstanden sein."; + out.register_mustRememberPass = "Wir können dein Passwort nicht zurücksetzen, falls du es vergisst. Es ist äusserst wichtig, dass du es dir merkst! Bitte markiere das Kästchen."; - out.register_whyRegister = "Wieso sollst du dich registrieren?"; + out.register_whyRegister = "Wieso solltest Du dich registrieren?"; out.register_header = "Willkommen zu CryptPad"; out.register_explanation = [ "

Lass uns ein Paar Punkte überprüfen:

", "
    ", - "
  • Dein Passwort ist dein Geheimnis, um alle deine Dokumente zu verschlüsseln. Wenn du es verlierst, gibt es keine Methode die Daten zurückzufinden.
  • ", - "
  • Du kannst die Dokumente, die du letzlich angesehen hast importieren, damit sind sie in deinem CryptDrive.
  • ", - "
  • Wenn du auf einem geteilten Rechner bist, muss du ausloggen, wenn du fertig bist. Es ist nicht ausreichend, die Browserfensters (oder das Browser) zu schliessen.
  • ", + "
  • Dein Passwort ist dein Geheimnis, um alle deine Dokumente zu verschlüsseln. Wenn du es verlierst, gibt es keine Methode, die Daten wiederzufinden.
  • ", + "
  • Du kannst die Dokumente, die du zuletzt angesehen hast, importieren, damit sie in deinem CryptDrive sind.
  • ", + "
  • Wenn du den Rechner mit anderen teilst, musst du ausloggen, wenn du fertig bist. Es ist nicht ausreichend, das Browserfensters oder den Browser zu schliessen.
  • ", "
" ].join(''); out.register_writtenPassword = "Ich habe meinen Benutzername und Passwort notiert. Weiter geht's."; out.register_cancel = "Zurück"; - out.register_warning = "\"Ohne Preisgabe von Information\" heisst, dass wir keine Methode haben, wenn du dein Passwort verlierst."; + out.register_warning = "\"Ohne Preisgabe von Daten\" heisst, dass niemand deine Daten wiederherstellen kann, wenn du dein Passwort verlierst."; out.register_alreadyRegistered = "Dieser Benutzer existiert schon, willst du dich einloggen?"; @@ -519,15 +537,15 @@ out.settings_save = "Speichern"; out.settings_backupCategory = "Backup"; - out.settings_backupTitle = "Eine Backup erstellen oder die Daten restaurieren"; + out.settings_backupTitle = "Eine Backup erstellen oder die Daten wiederherstellen"; out.settings_backup = "Backup"; - out.settings_restore = "Restaurieren"; + out.settings_restore = "Wiederherstellen"; out.settings_resetNewTitle = "CryptDrive säubern"; out.settings_resetButton = "Löschen"; out.settings_reset = "Alle Dateien und Ordnern aus deinem CryptDrive löschen"; out.settings_resetPrompt = "Diese Aktion wird alle Dokumente deines CryptDrives entfernen.
"+ - "Bist du sicher, dass du es tun möchtest?
" + + "Bist du sicher, dass du das tun möchtest?
" + "Gebe I love CryptPad ein, um zu bestätigen."; // TODO: I love CryptPad should be localized out.settings_resetDone = "Dein CryptDrive ist jetzt leer!"; out.settings_resetError = "Prüftext inkorrekt. Dein CryptDrive wurde nicht verändert."; @@ -538,67 +556,76 @@ out.settings_resetTipsDone = "Alle Tipps sind wieder sichtbar."; out.settings_thumbnails = "Vorschaubilder"; - out.settings_disableThumbnailsAction = "Die Gestaltung von Vorschaubilder in deinem CryptPad deaktivieren"; - out.settings_disableThumbnailsDescription = "Vorschaubilder sind automatisch erstellt und gespeichert in deinem Browser, wenn du ein Dokument besuchst. Du kannst dieses Feature hier deaktivieren."; + out.settings_disableThumbnailsAction = "Die Erstellung von Vorschaubilder in deinem CryptPad deaktivieren"; + out.settings_disableThumbnailsDescription = "Vorschaubilder werden automatisch erstellt und in deinem Browser gespeichert, wenn du ein Dokument besuchst. Du kannst dieses Feature hier deaktivieren."; out.settings_resetThumbnailsAction = "Entfernen"; - out.settings_resetThumbnailsDescription = "Alle Vorschaubilder entfernen, die in deinem Browser gespeichert sind."; - out.settings_resetThumbnailsDone = "Alle Vorschaubilder sind entfern worden."; + out.settings_resetThumbnailsDescription = "Alle Vorschaubilder entfernen, die in Deinem Browser gespeichert sind."; + out.settings_resetThumbnailsDone = "Alle Vorschaubilder sind entfernt worden."; - out.settings_importTitle = "Importierie die neulich besuchte Dokumente in deinem CryptDrive"; + out.settings_importTitle = "Importiere die kürzlich besuchte Dokumente in Deinem CryptDrive"; out.settings_import = "Importieren"; - out.settings_importConfirm = "Bist du sicher, dass du die neulich besuchte Dokumente in deinem Konto importieren möchtest??"; + out.settings_importConfirm = "Bist Du sicher, dass Du die kürzlich besuchte Dokumente in Deinem Konto importieren möchtest??"; out.settings_importDone = "Import erledigt"; out.settings_userFeedbackTitle = "Rückmeldung"; - out.settings_userFeedbackHint1 = "CryptPad gibt grundlegende Rückmeldungen zum Server. Es erlaubt uns, wie wir deine Erfahrung verbessern können."; + out.settings_userFeedbackHint1 = "CryptPad gibt grundlegende Rückmeldungen zum Server, um die Benutzer-Erfahrung zu verbessern können."; out.settings_userFeedbackHint2 = "Der Inhalt deiner Dokumente wird nie mit dem Server geteilt."; out.settings_userFeedback = "Rückmeldungen aktivieren"; out.settings_deleteTitle = "Löschung des Kontos"; - out.settings_deleteHint = "Die Löschung eines Kontos ist dauerhaft. Dein CryptDrive und eigene Dokumente werden alle von dem Server gelöscht. Die restliche Dokumente werden nach 90 Tage gelöscht, wenn keine andere diese bei sich gelagert haben."; + out.settings_deleteHint = "Die Löschung eines Kontos ist dauerhaft. Dein CryptDrive und eigene Dokumente werden alle von dem Server gelöscht. Die restliche Dokumente werden nach 90 Tage gelöscht, wenn niemand anderes diese bei sich gelagert hat."; out.settings_deleteButton = "Dein Konto löschen"; - out.settings_deleteModal = "Gebe die folgende Information zu deinem CryptPad Adminstrator, damit er die Daten vom Server löschen kann."; - out.settings_deleteConfirm = "OK klicken wird dein Konto dauerhaft löschen. Bist du sicher?"; - out.settings_deleted = "Dein Konto ist jetzt gelöscht. Drucke OK, um zum Homepage zu gelingen."; + out.settings_deleteModal = "Gebe die folgende Information deinem CryptPad Adminstrator, damit er die Daten vom Server löschen kann."; + out.settings_deleteConfirm = "Wenn du OK klickst, wird dein Konto dauerhaft löschen. Bist Du sicher?"; + out.settings_deleted = "Dein Konto ist jetzt gelöscht. Drucke OK, um zum Homepage zu gelangen."; - out.settings_anonymous = "Du bist nicht eingeloggt. Die Einstellungen hier sind spezifisch zu deinem Browser."; + out.settings_anonymous = "Du bist nicht eingeloggt. Die Einstellungen hier gelten nur für diesem Browser."; out.settings_publicSigningKey = "Öffentliche Schlüssel zum Unterschreiben"; out.settings_usage = "Verbrauch"; out.settings_usageTitle = "Die Gesamtgrösse deiner Dokumente in MB"; // TODO: pinned ?? - out.settings_pinningNotAvailable = "Genagelte Dokumente sind nur für angemeldete Benutzer verfügbar."; + out.settings_pinningNotAvailable = "Gepinnte Dokumente sind nur für angemeldete Benutzer verfügbar."; out.settings_pinningError = "Etwas ging schief"; - out.settings_usageAmount = "Deine genagelte Dokumente verwenden {0}MB"; + out.settings_usageAmount = "Deine gepinnten Dokumente verwenden {0}MB"; out.settings_logoutEverywhereButton = "Ausloggen"; - out.settings_logoutEverywhereTitle = "Von jeden Browsers ausloggen"; - out.settings_logoutEverywhere = "Das Ausloggen in alle andere Websitzungen erzwingen"; - out.settings_logoutEverywhereConfirm = "Bist du sicher? Du wirdst auf allen deinen Geräten dich wieder einloggen müssen."; + out.settings_logoutEverywhereTitle = "Überall ausloggen"; + out.settings_logoutEverywhere = "Das Ausloggen in allen andere Websitzungen erzwingen"; + out.settings_logoutEverywhereConfirm = "Bist du sicher? Du wirst dich auf allen deinen Geräten wieder einloggen müssen."; - out.settings_codeIndentation = 'Einrücken für das Codeeditor (Leerzeichen)'; + out.settings_codeIndentation = 'Einrücken für den Code-Editor (Leerzeichen)'; out.settings_codeUseTabs = "Mit Tabs einrücken (anstatt mit Leerzeichen)"; - out.settings_padWidth = "Maximumgrösse des Editors"; - out.settings_padWidthHint = "Rich-text Dokumente benutzen normalerweise die grösste verfügbare Breite und es kann manchmal schwer lesebar sein. Du kannst die Breite des Editors hier reduzieren."; + out.settings_padWidth = "Maximalgrösse des Editors"; + out.settings_padWidthHint = "Rich-text Dokumente benutzen normalerweise die grösste verfügbare Zeilenbreite, das kann manchmal schwer lesbar sein. Du kannst die Breite des Editors hier reduzieren."; out.settings_padWidthLabel = "Die Breite des Editors reduzieren"; - out.settings_creationSkip = "Das Erstellungsdialg für neue Dokumente vermeiden"; - out.settings_creationSkipHint = "Dieses Erstellungsdialog erlaubt Einstellungen vorzunehmen, um mehr Sicherheit und Kontroll für deine Dokumente zu geben. Aber es kann manchaml dir verlangsam, da es eine zusätzliche Stufe verlange. Mit dieser Option kannst du die dieses Dialog vermeiden und die default-Einstellungen wählen."; - out.settings_creationSkipTrue = "vermeiden"; - out.settings_creationSkipFalse = "anzeigen"; + out.settings_creationSkip = "Den Erstellungsdialg für neue Dokumente überspringen"; + out.settings_creationSkipHint = "Dieser Erstellungsdialog erlaubt Einstellungen für mehr Kontrolle und Sicherheit bei deinen Dokumenten. Aber der zusätzliche Dialog verlangsamt die Arbeit. Mit dieser Option kannst du diese Dialog überspringen und die Standard-Einstellungen wählen."; + out.settings_creationSkipTrue = "Überspringen"; + out.settings_creationSkipFalse = "Anzeigen"; - out.settings_templateSkip = "Die Wahl der Vorlage vermeiden"; - out.settings_templateSkipHint = "Wenn du ein neues Dokument erstellt, und wenn Vorlagen da sind, erscheint ein Dialog, wo du die Vorlage wählen kannst. Hier kannst du dieses Dialog vermeiden und somit keine Vorlage verwenden."; + out.settings_templateSkip = "Die Wahl der Vorlage überspringen"; + out.settings_templateSkipHint = "Wenn du ein neues Dokument erstellst und Vorlagen vorhanden sind, erscheint ein Dialog, wo du die Vorlage wählen kannst. Hier kannst du diesen Dialog überspringen und somit keine Vorlage verwenden."; + + out.settings_changePasswordTitle = "Ändere dein Passwort"; + out.settings_changePasswordHint = "Ändere das Passwort deines Kontos ohne deine Daten zu verlieren. Du mußt einmal das jetzige Passwort eintragen und dann das gewünschte neue Passwort zweimal.
" + + "Wir können das Passwort nicht zurücksetzen, wenn du es vergisst, also sei besonders sorgfältig!"; + out.settings_changePasswordButton = "Passwort ändern"; + out.settings_changePasswordCurrent = "Jetziges Passwort"; + out.settings_changePasswordNew = "Neues Passwort"; + out.settings_changePasswordNewConfirm = "Neues Passwort bestätigen"; + out.settings_changePasswordConfirm = "Bist du sicher?"; out.upload_title = "Datei hochladen"; out.upload_rename = "Willst du einen neuen Name für {0} geben, bevor es zum Server hochgeladen wird?
" + "Die Dateieendung ({1}) wird automatisch hinzugefügt. "+ "Dieser Name bleibt für immer und wird für die andere Benutzer sichtbar."; - out.upload_serverError = "Serverfehler: Die Datei kann nicht aktuell hochgeladen werden. "; - out.upload_uploadPending = "Ein anderes Hochladen passiert gerade. Willst du es abbrechen und deine neue Datei hochladen?"; + out.upload_serverError = "Serverfehler: Die Datei kann aktuell nicht hochgeladen werden. "; + out.upload_uploadPending = "Ein anderes Hochlade-Vorgang läuft gerade. Willst du den abbrechen und deine neue Datei hochladen?"; out.upload_success = "Deine Datei ({0}) wurde erfolgreich hochgeladen und in deinem CryptDrive hinzugefügt."; out.upload_notEnoughSpace = "Der verfügbare Speicherplatz auf deinem CryptDrive reicht leider nicht für diese Datei."; - out.upload_notEnoughSpaceBrief = "Unsaureichende Volumen"; + out.upload_notEnoughSpaceBrief = "Unzureichender Speicherplatz"; out.upload_tooLarge = "Diese Datei ist zu gross, um hochgeladen zu werden."; out.upload_tooLargeBrief = 'Datei zu gross'; out.upload_choose = "Eine Datei wählen"; @@ -624,7 +651,7 @@ out.pad_hideToolbar = "Werkzeugsleiste verbergen"; // markdown toolbar - out.mdToolbar_button = "Die Markdown Werkzeugsleiste anzeigen oder verbergen"; + out.mdToolbar_button = "Die Markdown-Werkzeugsleiste anzeigen oder verbergen"; out.mdToolbar_defaultText = "Dein Text hier"; out.mdToolbar_help = "Hilfe"; out.mdToolbar_tutorial = "http://www.markdowntutorial.com/"; @@ -635,49 +662,32 @@ out.mdToolbar_link = "Link"; out.mdToolbar_quote = "Zitat"; out.mdToolbar_nlist = "Nummerierte Liste"; - out.mdToolbar_list = "Aufählung"; + out.mdToolbar_list = "Aufzählung"; out.mdToolbar_check = "Aufgabenliste"; out.mdToolbar_code = "Code"; - // index.html + // index.html //about.html - out.main_about_p2 = 'Dieses Projekt verwendet CKEditor WYSIWYG Editor, CodeMirror, sowie das ChainPad echtzeit Engine.'; - - out.main_howitworks_p1 = 'CryptPad verwendet ein alternative Operational transformation Algorithmus, der verteilt Konsens mit einem Nakamoto Blockchain erreicht, eine Informationskonstrukt, was für Bitcoin bekannt wurde. Damit kann der Algorithmus ohne die Mitarbeit eines zentrales Server die Konflikte von Operational Transform lösen; dadurch kann der Server auch ohne Kenntnisse des Inhalts der Dokumente bleiben.'; + out.about_intro = 'CryptPad wurde erstellt im Research Team von XWiki SAS, einem kleinen Unternehmen in Paris, Frankreich, und Iasi, Rumänien. Das kernteam hat 3 Mitglieder, die an CryptPad arbeiten, sowie einige Mitwirkende innerhalb von XWiki SAS und außerhalb.'; + out.about_core = 'Core Developers'; + out.about_contributors = 'Key Contributors'; // contact.html - out.main_about_p2 = 'Wenn du Fragen oder Kommentare hast, hören wir sie gern!
Du kannst uns antweeten, ein Issue öffnen on GitHub. Komm und sag hallo auf our der Matrix Kanal or IRC (#cryptpad on irc.freenode.net), or schick uns ein Email.'; out.main_about_p22 = 'Uns antweeten'; - out.main_about_p23 = 'ein Issue auf GitHub aufnehmen'; + out.main_about_p23 = 'Eine Issue auf GitHub erstellen'; out.main_about_p24 = 'Hallo sagen (Matrix)'; out.main_about_p25 = 'uns ein Email schicken'; - out.main_about_p26 = 'Wenn du Fragen oder Kommentare hast, freuen wir davon zu hören!'; - - out.main_info = "

Vertrauenswürdige Kollaboration

Lass deine Ideen wachsen während die ohne Preisgabe deiner Informationen Technologie deinen Datenschutz sogar gegenüber uns sichert."; - out.main_catch_phrase = "Das Cloud ohne Preisgabe deiner Informationen"; - - out.main_howitworks = 'Wie fukntioniert es'; - out.main_zeroKnowledge = 'Ohne Preisgabe deiner Informationen'; - out.main_zeroKnowledge_p = "Du brauchst nicht uns dein Vertrauen geben, dass wir deine Dokumente nicht angucken werden: Mit der Technologie können wir das einfach nicht. Erfahre mehr, wie wir dein Datenschutz und Sicherheit sichern."; - - out.main_writeItDown = 'Runterschreiben'; - - out.main_writeItDown_p = "Die grösste Projekte stammen aus den kleinsten Ideen. Schreibe runter deine Inspirationsmomente und unerwartete Ideen, da du nie weisst, welche ein Durchbruch sein wird."; - out.main_share = 'Teile das Link, teile das Dokument'; - out.main_share_p = "Lasse deine Ideen gemeinsam wachsen: Führe effektive Treffen, kooperiere auf ToDo-Listen und mache kurze Vorträge mit alle deinen Bekannten und mit alle deinen Geräten."; - out.main_organize = 'Organisiere dich'; - out.main_organize_p = "Mit CryptPad Drive kannst du deinen Übersicht auf das Wichtiges behalten. Ordnern erlauben, deine Projekte zu organisieren und einen Übersicht behalten, über was geht wo."; - out.tryIt = 'Versuche es!'; - out.main_richText = 'Rich Text Editor'; - out.main_richText_p = 'Bearbeite Rich-Text kollaborativ mit unserem echtzeit CkEditor ohne Preisgabe deiner Informationen app.'; - out.main_code = 'Code Editor'; - out.main_code_p = 'Bearbeite Code kollaborativ mit unseren echtzeit CodeMirror app ohne Preisgabe deiner Informationen.'; - out.main_slide = 'Präsentationeneditor'; - out.main_slide_p = 'Gestalte Präsentationen mit der Markdown Syntax und zeige sid im Browser an.'; + out.main_about_p26 = 'Wenn Du Fragen oder Kommentare hast, freuen wir uns, von dir zu hören!'; + + out.main_info = "

Vertrauenswürdige Kollaboration

Lass deine Ideen gemeinsam wachsen, während die ohne Preisgabe deiner Daten-Technologie deinen Datenschutz sogar uns gegenüber sichert."; + out.main_catch_phrase = "Die Cloud ohne Preisgabe deiner Daten"; + + out.main_richText = 'Text-Editor'; + out.main_code = 'Code-Editor'; + out.main_slide = 'Präsentations-Editor'; out.main_poll = 'Umfragen'; - out.main_poll_p = 'Plane ein Treffen oder ein Event, und lass die beste Wahl online treffen.'; out.main_drive = 'CryptDrive'; out.main_richTextPad = 'Rich Text Dokument'; @@ -685,9 +695,10 @@ out.main_slidePad = 'Markdown Präsentation'; out.main_pollPad = 'Umfrage oder Terminabstimmung'; out.main_whiteboardPad = 'Whiteboard'; + out.main_kanbanPad = 'Kanban-Board'; out.main_localPads = 'Lokale Dokumente'; out.main_yourCryptDrive = 'Dein CryptDrive'; - out.main_footerText = "Mit CryptPad, du kannst schnell kollaborative Dokumente erstellen, um Notizzen oder Ideen zusammen runterzuschreiben."; + out.main_footerText = "Mit CryptPad kannst du schnell kollaborative Dokumente erstellen, um Notizen oder Ideen zusammen mit anderen zu bearbeiten."; out.footer_applications = "Apps"; out.footer_contact = "Kontakt"; @@ -696,52 +707,49 @@ out.about = "Über uns"; out.privacy = "Datenschutz"; out.contact = "Kontakt"; - out.terms = "Servicebendingungen"; + out.terms = "Nutzungsbedingungen"; out.blog = "Blog"; out.topbar_whatIsCryptpad = "Was ist CryptPad"; // what-is-cryptpad.html - out.whatis_title = 'Was ist CryptPad'; - out.whatis_collaboration = 'Effektive und und leichte Kollaboration'; - out.whatis_collaboration_p1 = 'Mit CryptPad kannst du kollaborative Dokumente erstellen, um Notizzen und Ideen zusammen runterzuschreiben. Wenn du dich registrierst und loggst dich ein, kriegst die Möglichkeit Dateien hochzuladen, und Ordnern um alle deine Dokumente zu organisieren.'; - out.whatis_collaboration_p2 = 'Du kannst Zugang zu einem CryptPad teilen, indem du das Link teilst. Du kannst auch einen schreibgeschützten Zugang, um die Ergebnisse deiner kollaborativen Arbeit zu veröffentlichen, während du sie noch bearbeiten kannst.'; - out.whatis_collaboration_p3 = 'Du kannst Rich-Text Dokumente mit dem CKEditor sowie Markdown Dokumente, die in Echtzeit angezeigt werden, während du tipps. Du kannst auch die Umfrage App verwenden, um Ereignisse unter mehrere Teilnehmern zu synchroniseren.'; - out.whatis_zeroknowledge = 'Ohne Preisgabe von Informationen'; - out.whatis_zeroknowledge_p1 = "Wir wollen nicht wissen, was du gerade tippst. Und mit modernen Verschlüsselungstechnologie, du kannst sicher sein, dass wir nicht es nicht können. CryptPad verwendet 100% Clientseitige Verschlüsselung, um den Inhalt von uns zu schützen, wir die Personen die das Website hosten."; - out.whatis_zeroknowledge_p2 = 'Wenn du dich registrierst und logge dich ein, dein Benutzername und Passwort sind in einem Schlüssel umgerechnet mit einer Scrypt Ableitungsfunktion. Weder ist dieser Schlüssel noch der Benutzername oder Passwort sind zum Server geschickt. Anstatt dessen sind sie benutzt clientseitig, um den Inhalt deinese CryptDrives zu entschlüsseln. Dieses beinhaltet alle Dokumente, die die zugänglich sind.'; - out.whatis_zeroknowledge_p3 = 'Wenn du ein Dokument teilst, teilst auch den kryptografischen Schlüssel, der Zugang zu diesem Dokument gibt. Da dieser Schlüssel im fragment identifier ist, ist das nie direkt zum Server geschickt. Bitte lese unsere Blogeintrag über Datenschutz um mehr zu erfahren, welche Typen von Kontextinformation wir zugänglich und nicht zugänglich haben.'; + out.whatis_collaboration = 'Effektive und und leichte Zusammenarbeit'; + out.whatis_collaboration_p1 = 'Mit CryptPad kannst Du kollaborative Dokumente erstellen, um Notizen und Ideen gemeinsam zu bearbeiten. Wenn du dich registrierst und dich einloggst, bekommst du die Möglichkeit, Dateien hochzuladen und Ordner einzurichten, um alle deine Dokumente zu organisieren.'; + out.whatis_collaboration_p2 = 'Du kannst Zugang zu einem CryptPad teilen, indem du den Link teilst. Du kannst auch einen schreibgeschützten Zugang erstellen, um die Ergebnisse deiner Arbeit zu teilen, während du sie noch bearbeitest.'; + out.whatis_collaboration_p3 = 'Du kannst Rich-Text Dokumente mit dem CKEditor sowie Markdown Dokumente erstellen, die in Echtzeit angezeigt werden, während du tippst. Du kannst auch die Umfrage-App verwenden, um Termine unter mehrere Teilnehmern zu abzustimmen.'; + out.whatis_zeroknowledge = 'Zero Knowledge - Ohne Preisgabe deiner Daten'; + out.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 100% Clientseitige Verschlüsselung, um den Inhalt vor uns, den Hostern dieser Website, zu schützen."; + out.whatis_zeroknowledge_p2 = 'Wenn du dich registrierst und dich einloggst, werden dein Benutzername und Passwort in einen Schlüssel umgerechnet mit einer Scrypt Schlüssel-Ableitungsfunktion. 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.'; + out.whatis_zeroknowledge_p3 = 'Wenn du ein Dokument teilst, teilst du auch den kryptografischen Schlüssel, der Zugang zu diesem Dokument gibt. Da dieser Schlüssel im fragment identifier liegt, wird er nie direkt zum Server geschickt. Bitte lese unsere Blogeintrag über Datenschutz um mehr zu erfahren, welche Typen von Kontextinformation wir zugänglich und nicht zugänglich haben.'; out.whatis_drive = 'Organisieren mit CryptDrive'; - out.whatis_drive_p1 = 'Sobald ein Dokument mit CryptPad zugegriffen wird, ist deses automatisch zu deinem CryptDrive hinzugefügt, im Stamm Ordner. Später kannst du diese Dokumente in Ordnern organisieren oder du kannst es im Papierkorb verschieben. CryptDrive erlaubt die Suche durch deine Dokumente, wie und wann du willst.'; - out.whatis_drive_p2 = 'Mit dem einfachsten Ziehen und Schieben Gesten kannst du die Dokumente herum von deinem Drive umplatzieren. Die Links zu diesen Dokumenten bleiben erhalten damit Kollaboratoren nie Zugang verlieren.'; + out.whatis_drive_p1 = 'Sobald auf ein Dokument mit CryptPad zugegriffen wird, wird deses automatisch zu deinem CryptDrive hinzugefügt, im Stamm-Ordner. Später kannst du diese Dokumente in eigenen Ordnern organisieren oder du kannst es in den Papierkorb verschieben. CryptDrive erlaubt die Suche durch deine Dokumente, wie und wann Du willst.'; + out.whatis_drive_p2 = 'Mit dem einfachem Ziehen und Ablegen kannst Du die Dokumente auf deinem CryptDrive umplatzieren. Die Links zu diesen Dokumenten bleiben erhalten, damit Kollaboratoren nie Zugang verlieren.'; out.whatis_drive_p3 = 'Du kannst auch Dateien in dein CryptDrive hochladen und mit deinen Kollegen teilen. Hochgeladene Dateien können genau so wie kollaborative Dokumente organisiert werden.'; out.whatis_business = 'CryptPad im Business'; - out.whatis_business_p1 = 'Der Grundprinzip von CryptPad (Verschlüsselung ohne Preisgabe der Information) ist ausgezeichnet, um die Effektivität von existierenden Protokolle, indem die Zugangsberechtigungen des Unternehmens in die Kryptografie umgesetzt werden. Weil hochsensible Medien nur mit Angestelltenzugang entschlüsselt werden kann, kann CryptPad das Jackpot der Hackers wegnehmen, was in der Natur von tradionellen IT Servers liegt. Lese das CryptPad Whitepaper, um mehr zu erfahren, wir CryptPad dein Unternehmen helfen kann.'; - out.whatis_business_p2 = 'CryptPad kann auf eigenen Rechnern installiert werden. CryptPad Entwicklers at XWiki SAS können kommerzielle Unterstützung, Customisierung und Entwicklung anbieten. Bitte schicke ein Email zu sales@cryptpad.fr, um mehr zu erfahren.'; - - // privacy.html - - out.policy_title = 'Cryptpad Datenschutzbestimmungen'; - out.policy_whatweknow = 'Was wir über dich wissen'; - out.policy_whatweknow_p1 = 'Als Programm, das im Web gehostet wird, hat Cryptpad Zugriff auf die Metadaten, die vom HTTP-Protokoll exponiert werden. Inbegriffen ist deine IP-Adresse und diverse andere HTTP-Header, die es ermöglichen deinen Browser zu identifizieren. Um zu sehen welche Daten dein Browser preis gibt kanst du die Seite WhatIsMyBrowser.com besuchen.'; - out.policy_whatweknow_p2 = 'Wir nutzen Piwik, eine open source Analyseplatform um mehr über unsere Nutzer*innen zu lernen. Piwik teilt uns mit, wie du Cryptpad gefunden hast — durch direkten Zugriff, mit Hilfe eine Suchmaschine oder über einen Link auf einer anderen Seite wie z.B. Reddit oder Twitter. Außerdem lernen wir mehr über deinen Besuch, welchen Link du auf den Informationsseiten klickst und wie lange du auf diesen Seiten verweilst.'; - out.policy_howweuse = 'Wie wir das Wissen anwenden'; - out.policy_howweuse_p1 = 'Wir nutzen diese Informationen um besser entscheiden zu können wie Cryptpad beworben werden kann und um genutzte Strategien zu evaluieren. Informationen über deinen Standort helfen uns abzuschätzen welche Sprachen wir besser unterstützen sollten.'; - out.policy_howweuse_p2 = "Informationen zu deinem Browser (ob du auf einem Desktop oder Smartphone arbeitest) hilft uns außerdem dabei zu entscheiden, welche Features priorisiert werden sollen. Unser Entwicklerteam ist klein, deshalb ist es uns wichtig Entscheidungen derart zu treffen, dass die Erfahrung der größten Zahl von Nutzer*innen verbessert wird."; - out.policy_whatwetell = 'Was wir anderen über die erzählen'; - out.policy_whatwetell_p1 = 'Wir reichen keine von uns gesammelten Daten weiter, außer im Falle einer gerichtlichen Anordnung.'; - out.policy_links = 'Links zu anderen Seiten'; - out.policy_links_p1 = 'Diese Seite beinhaltet Links zu anderen Seiten, teilweise werden diese von anderen Organisationen verwaltet. Wir sind nicht für den Umgang mit der Privatsphäre und die Inhalte der anderen Seiten verantwortlich. Generell werden Links zu externen Seiten in einem neuem Fenster geöffnet, um zu verdeutlichen, dass du Cryptpad.fr verlässt.'; - out.policy_ads = 'Werbung'; - out.policy_ads_p1 = 'Wir zeigen keine Onlinewerbung, können aber zu Organisationen verlinken, die unsere Forschung finanzieren.'; - out.policy_choices = 'Deine Möglichkeiten'; - out.policy_choices_open = 'Unser Code ist open source, deshalb kannst du jederzeit deine eigene Cryptpad-Instanz hosten.'; - out.policy_choices_vpn = 'Wenn du unsere gehostete Instanz nutzen möchtest bitten wir dich darum IP-Adresse zu verschleiern, das geht zum Beispiel mit dem Tor browser bundle, oder einem VPN-Zugang.'; - out.policy_choices_ads = 'Wenn du unsere Analysesoftware blockieren möchtest kannst du Adblock-Software wie Privacy Badger verwenden.'; + out.whatis_business_p1 = 'Die Verschlüsselung ohne Preisgabe der Daten von CryptPad ist ausgezeichnet, um die Effektivität von existierenden Sicherheitsverfahren zu verbessern, indem die Zugangsberechtigungen des Unternehmens in der Kryptografie gespiegelt werden. Weil hochsensible Medien nur mit Angestelltenzugang entschlüsselt werden können, kann CryptPad das Jackpot der Hackers wegnehmen, was in der Natur von tradioneller IT liegt. Lese das CryptPad Whitepaper, um mehr zu erfahren, wie CryptPad deinem Unternehmen helfen kann.'; + out.whatis_business_p2 = 'CryptPad kann auf eigenen Rechnern installiert werden. CryptPad\'s Entwickler von XWiki SAS können kommerzielle Unterstützung, Customisierung und Entwicklung anbieten. Bitte schicke eine Email an sales@cryptpad.fr, um mehr zu erfahren.'; + + // privacy.html + out.policy_title = 'Cryptpad Datenschutzbestimmungen'; + out.policy_whatweknow = 'Was wir über dich wissen'; + out.policy_whatweknow_p1 = 'Als Programm, das im Web gehostet wird, hat Cryptpad Zugriff auf die Metadaten, die vom HTTP-Protokoll übertragen werden. Inbegriffen ist 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 WhatIsMyBrowser.com besuchen.'; + out.policy_whatweknow_p2 = 'Wir nutzen Piwik, eine Open-Source Analyseplattform, um mehr über unsere Nutzer*innen zu erfahren. Piwik teilt uns mit, wie du Cryptpad gefunden hast — durch direkten Zugriff, mit Hilfe einer Suchmaschine oder über einen Link auf einer anderen Seite wie z.B. Reddit oder Twitter. Außerdem lernen wir mehr über deinen Besuch, welchen Link Du auf den Informationsseiten klickst und wie lange du auf diesen Seiten verweilst.'; + out.policy_howweuse = 'Wie wir das Wissen anwenden'; + out.policy_howweuse_p1 = 'Wir nutzen diese Informationen um besser entscheiden zu können, wie Cryptpad beworben werden kann und um derzeit genutzte Strategien zu evaluieren. Informationen über deinen Standort helfen uns, abzuschätzen welche Sprachen wir besser unterstützen sollten.'; + out.policy_howweuse_p2 = "Informationen zu Deinem Browser (ob Du auf einem Desktop oder Smartphone arbeitest) helfen uns außerdem dabei, zu entscheiden, welche Features priorisiert werden sollen. Unser Entwicklerteam ist klein, deshalb ist es uns wichtig, Entscheidungen derart zu treffen, dass möglichst viele Nutzer*innen davon profitieren."; + out.policy_whatwetell = 'Was wir anderen über dich (nicht) erzählen'; + out.policy_whatwetell_p1 = 'Wir reichen keine von uns gesammelten Daten weiter, außer im Falle einer gerichtlichen Anordnung.'; + out.policy_links = 'Links zu anderen Seiten'; + out.policy_links_p1 = 'Diese Seite beinhaltet Links zu anderen Seiten, teilweise werden diese von anderen Organisationen verwaltet. Wir sind nicht für den Umgang mit der Privatsphäre und die Inhalte der anderen Seiten verantwortlich. Generell werden Links zu externen Seiten in einem neuem Fenster geöffnet, um zu verdeutlichen, dass du Cryptpad.fr verlässt.'; + out.policy_ads = 'Werbung'; + out.policy_ads_p1 = 'Wir zeigen keine Onlinewerbung, können aber zu Organisationen verlinken, die unsere Forschung finanzieren.'; + out.policy_choices = 'Deine Möglichkeiten'; + out.policy_choices_open = 'Unser Code ist frei und offengelegt, deshalb kannst du jederzeit deine eigene Cryptpad-Instanz hosten.'; + out.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 geht zum Beispiel mit dem Tor browser bundle, oder einem VPN-Zugang.'; + out.policy_choices_ads = 'Wenn du unsere Analysesoftware blockieren möchtest kannst du Block-Software wie Privacy Badger verwenden.'; // features.html - out.features = "Funktionen"; out.features_title = "Tabelle der Funktionen"; out.features_feature = "Funktion"; @@ -776,174 +784,175 @@ out.features_f_storage = "Speicherplatz"; out.features_f_storage_anon = "Dokumente sind nach 3 Monate gelöscht"; out.features_f_storage_registered = "Frei: 50MB
Premium: 5GB/20GB/50GB"; + out.features_f_register = "Kostenlose Anmeldung"; // faq.html - out.faq_link = "FAQ"; - out.faq_title = "Häufigste Fragen"; + out.faq_title = "Häufige Fragen"; out.faq_whatis = "Was ist CryptPad?"; out.faq = {}; out.faq.keywords = { title: 'Schlüsselkonzepte', pad: { q: "Was ist ein CryptPad Dokument?", - a: "Ein CryptPad Dokument ist manchmal als Pad genannt. Diese Bennung wurde von Etherpad bekannt gemacht, ein kollaboratives Editor in Echtzeit\n"+ - "Es beschreibt ein Dokument, das du in deinem Browser bearbeiten kannst, normalerweise mit der Möglichkeit für andere Personen, die Veränderungen nah zu direkt zu sehen." + a: "Ein CryptPad Dokument wird manchmal einfach Pad genannt, übernommen von Etherpad, einem kollaborativen Echtzeit-Editor\n"+ + "Es beschreibt ein Dokument, das du in deinem Browser bearbeiten kannst, normalerweise mit der Möglichkeit für andere Personen, die Veränderungen gleichzeitig direkt zu sehen." }, owned: { q: "What ist ein eigenes Dokument?", - a: "Ein eigenes Dokument ist ein Dokument mit einem definierten Eigentümer, der anhand ein einer Unterschrift mit öffentlichen Schlüssel erkannt wird." + + a: "Ein eigenes Dokument ist ein Dokument mit einem definierten Eigentümer, der anhand einer Unterschrift mit öffentlichen Schlüssel erkannt wird." + "Der Eigentümer eines Dokuments kann entscheiden, das Dokument zu löschen. In diesem Fall macht er das Dokument unverfügbar für weitere Kollaboration, egal ob das Dokument in deinem CryptDrive war oder nicht." }, expiring: { - q: "What is der Ablaufsdatum eines Dokuments?", + q: "Was ist das Ablaufsdatum eines Dokuments?", a: "Ein Dokument kann mit einem Ablaufsdatum versehen werden. Nach diesem Datum wird es automatisch vom Server gelöscht" + - " Das Ablaufdatum kann sowohl sehr nah (ein Paar Stunden) als sehr weit sein (hunterte Monate)." + - " Das Dokument und sein gesamter Verlauf wird dauerhaut unverfügbar werden, auch wenn er gerade noch bearbeitet wird.

" + - " Wenn ein Dokument ein Ablaufsadtum hat, kann mann dieses Datum in der Eigenschaften lesen: Entweder mit einem Recht-klick in CryptDrive oder mit der Properties Ansicht, wenn das Dokument geöffnet ist." + " Das Ablaufdatum kann sowohl sehr nah (ein Paar Stunden) als sehr weit sein (hunderte Monate)." + + " Das Dokument und sein gesamter Verlauf wird nach dem Ablaufdatum dauerhauft unverfügbar, auch wenn es gerade noch bearbeitet wird.

" + + " Wenn ein Dokument ein Ablaufsadtum hat, kann mann dieses Datum in den Eigenschaften sehen: Entweder mit einem Rechtklick in CryptDrive oder mit der Eigenschaften-Ansicht, wenn das Dokument geöffnet ist." }, tag: { q: "Wie kann ich Tags verwenden?", - a: "Du kannst Dokumente und CryptDrive-hochgeladene Dateien taggen. Das heisst mit einem Tag zu versehen. In Bearbeitung ist es durch das tag Knopf (" + - " Suche die Dokumente und Dateien in deinem CryptDrive mithilfe der Suchfunktion mit Suchterme, die mit einem Hashtag starten, zB #crypto." + a: "Du kannst Dokumente und auf CryptDrive hochgeladene Dateien taggen, das heisst mit einem Stichwort (Tag) versehen. Während der Bearbeitung gibt es dafür den Tag Knopf ()" + + " Wenn du die Dokumente und Dateien in deinem CryptDrive nach einem Tag durchsuchen willst, beginne den Suchbegriff mit einem Hashtag, zB #crypto." }, template: { q: "Was ist eine Vorlage?", - a: "Eine Vorlage ist ein Dokument, dass du benutzen kannst, um der Anfangsinhalt für zukünftige Dokumente zu definieren." + - " Jedes existes existierende Dokument kan eine Vorlage werden, indem es zum Vorlagen Abschnitt des CryptDrives geschoben wird." + - " Du kannst auch eine Kopie eines Dokuments erstellen, die ales Vorlage wird, indem du auf der Vorlagen Knop () des Toolbars des Editors druckst." + a: "Eine Vorlage ist ein Dokument, dass du benutzen kannst, um den Anfangsinhalt für zukünftige Dokumente zu definieren." + + " Jedes existes existierende Dokument kann eine Vorlage werden, indem es in den Vorlagen Abschnitt des CryptDrives geschoben wird." + + " Du kannst auch eine Kopie eines Dokuments erstellen, die zur Vorlage wird, indem du auf der Vorlagen-Knopf () der Werkzeugleiste des Editors drückst." }, }; out.faq.privacy = { title: 'Privacy', different: { - q: "Wie unterscheidet sich CryptPad von anderen online kollaborative Editoren?", + q: "Wie unterscheidet sich CryptPad von anderen online kollaborativen Editoren?", a: "CryptPad verschlüsselt Veränderungen deiner Dokumente, bevor diese Information zum Server geschickt wird. Somit können wir nicht lesen, was du getippt hast." }, me: { - q: "Welche Information kennt der Server über mich?", + q: "Welche Informationen erhält 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 besucht welches Dokument, aber wir konnten es tun, auch ohne Zugang zu den Inhalt des Dokuments zu kennen." + - " Wenn du besorgt bist, dass wir diese Information analysieren, ist es am sichersten davon auszugehen, dass wir es tun, da wir nicht beweisen können, dass wir es nicht tun.

" + + " Wir speichern nicht, welche Adresse welches Dokument besucht, aber wir könnten es tun, aber immer nur ohne den Inhalt des Dokuments zu kennen." + + " Wenn Du besorgt bist, dass wir diese Information analysieren, ist es am sichersten davon auszugehen, dass wir es tun, da wir nicht beweisen können, dass wir es nicht tun.

" + - " Wir sammeln elementare technische Informationen über wie CryptPad benutzt wird, wie die Grösse des Bildschirms auf der Gerät und welche Knöpfe werden meist geklickt." + - " Das hilft uns, unser Software besser zu machen. Aber du kannst die diese Sammlung für dich vermeiden, in dem du Rückmeldung aktivieren kein Haken setzt.

" + + " Wir sammeln elementare technische Informationen darüber, wie CryptPad benutzt wird, wie die Grösse des Bildschirms auf dem Gerät und welche Knöpfe am meisten geklickt werden." + + " Das hilft uns, unsere Software besser zu machen. Aber diese Sammlung unterbleibt, solange Du bei Rückmeldung aktivieren keinen Haken setzt.

" + - " Die Speicherungsgrössen und deren Grenzen sind mit dem öffentlichen Schlüssel eines Benutzers verbunden, aber wir verbinden nicht Namen oder Emailadressen mit dieser öffentlichen Schlüsseln.

" + + " Die Speicherungsgrössen und deren Grenzen sind mit dem öffentlichen Schlüssel eines Benutzers verbunden, aber wir verbinden nicht Namen oder Emailadressen mit diesen öffentlichen Schlüsseln.

" + - " Du kannst mehr Informationen darüber auf diesem Blogeintrag lesen." + " Du kannst mehr Informationen darüber in diesem Blogeintrag lesen." }, register: { q: "Weisst der Server mehr über mich, wenn ich registriere?", - a: "Wir verlangen nicht deine Emailadresse zu bestätigen und der Server kennt der Benutzername und Passwort nicht, wenn du dich regstriests. " + - " Anstatt dessen, der Registrierungs- und Anmeldeformular generiert ein Schlüsselpaar mit deiner Eingabe. Nur der öffentliche Schlüssel dieses Schlüsselpaars wird zum Server geschickt." + - " Mit diesem öffentlichen Schlüssel könenn wir Informationen kontrollieren wie die Menge der Daten, die du benutzt; damit können wir den Verbrauch von jedem Benutzer im Quota beschränken.

" + + a: "Wir verlangen nicht Deine Emailadresse und der Server kennt Benutzername und Passwort auch dann nicht, wenn du dich registrierst. " + + " Statt dessen generiert das Registrierungs- und Anmeldeformular ein Schlüsselpaar mit deiner Eingabe. Nur der öffentliche Schlüssel dieses Schlüsselpaars wird zum Server geschickt." + + " Mit diesem öffentlichen Schlüssel könenn wir z.B. die Menge der Daten, die du benutzt, kontrollieren, denn jeder Benutzer hat eine beschränkte Quota.

" + - " Wir benutzen die Rückmeldung Funktion, um den Server zu informieren, dass jemand mit deinem IP ein Konto registriert hat." + - " Damit können wir messen, wie viele Benutzer CryptPad Konten registrieren registrieren, und von welchen Regionen. Somit können wir wissen, welche Sprache braucht ein besseres Support.

" + + " Wir benutzen die Rückmeldungs-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 besseren Support braucht.

" + - " Wenn du registrierst, du erstellest einen öffentlichen Schlüssel, das benutzt wird, um den Server zu informieren, dass die Dokumente nicht löschen sollte, wenn sie nicht aktiv benutzt werden." + - " Diese Information zeigt mehr zum Server, über wie du CryptPad benutzt, aber das System erlaubt uns, die Dokumente zu löschen, wofür keine sich die Mühe gegeben hat, was zu tun, um sie zu behalten." + " Wenn Du registrierst, erstellst Du einen öffentlichen Schlüssel, der benutzt wird, um den Server zu informieren, dass er Dokumente auch dann nicht löschen sollte, wenn sie nicht aktiv benutzt werden." + + " Diese Information zeigt dem Server, wie Du CryptPad benutzt, und dieses System erlaubt uns, die Dokumente zu löschen, wofür sich keiner mehr interessiert." }, other: { q: "Was können andere Benutzer über micht erfahren?", - a: "Wenn die ein Dokument jemanden anderen bearbeitest, du kommunizierst mit dem Server. Nur wir kennen deine IP-Adresse. " + - " Andere Benutzern können dein Benutzername, dein Benutzerbild, das Link deines Profils (wenn du ein hast), und deinen öffentlichen Schlüssel (um die Nachrichten zu den Benutzern zu verschlüsseln)." + a: "Wenn du ein Dokument von jemand anderen bearbeitest, kommunizierst Du mit dem Server. Nur wir kennen Deine IP-Adresse. " + + " Andere Benutzern sehen deinen Benutzernamen, dein Benutzerbild, das Link deines Profils (wenn du eins hast), und deinen öffentlichen Schlüssel (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 dicht kenn, es liefert keine strenge Anonymität" + - " Unsere Servers haben einen Zugang zu deiner IP-Adresse, allerdings kannst du diese Information verbergen, indem du Tor verwendets." + - " Einfach Tor zu verwenden, ohne dein Verhältnis zu ändern, garnatiert auch nicht deine Anonymität, da der Server Benutzern noch mit deren einzige öffentlichen Schlüsseln identifizeren kann." + - " Wenn du denselben Schlüssel benutzt, wenn du nicht Tor benutzt. Es wird möglich, deine Sitzung zu de-anonimisieren.

" + + a: "Auch wenn CryptPad so konzipiert wurde, dass es so wenig wie möglich über dich kennt, es liefert keine strenge Anonymität" + + " Unsere Server haben einen Zugang zu deiner IP-Adresse, allerdings kannst du diese Information verbergen, indem du Tor verwendest." + + " Einfach Tor zu verwenden, ohne dein Verhalten zu ändern, garantiert auch keine Anonymität, da der Server Benutzer noch mit deren öffentlichen Schlüsseln identifizeren kann." + + " Wenn du denselben Schlüssel mit und ohne Tor benutzt, wird es möglich, deine Sitzung zu de-anonimisieren.

" + - " Für Benutzer die einen niedrigeren Grad Datenschutz brauchen, CryptPad, im Gegenteil zu anderen Onlinservers, verlangt sein Benutzer nicht, sich mit Namen, Telefonnummer oder Emailadressen zu identifizieren." + " Für Benutzer, die Datenschutz im normalen Umfang brauchen, ist wichtig, daß CryptPad, im Gegenteil zu anderen Onlinediensten, nicht verlangt, daß der Benutzer sich mit Namen, Telefonnummer oder Emailadressen identifiziert." }, policy: { q: "Habt ihr eine Datenschutzerklärung?", - a: "Ja! Es ist hier verfügbar." + a: "Ja! Sie ist hier verfügbar." } }; out.faq.security = { title: 'Sicherheit', proof: { q: "Wie benutzt ihr Zero Knowledge Beweise?", - a: "Wir benutzen das Term Ohne Preisgabe von Informationen (Zero knowledge) nicht im Sinn eines Zero knowledge Beweis aber im Sinn eines Zero Knowledge Webdienst " + - " Zero Knowledge Webdienst verschlüsseln die Benutzerdaten im Browser, ohne dass der Server je Zugang zu den unverschlüsselten Daten oder zu dem Verschlüsselungschlüsseln hat.

" + - " Wir haben eine kurze Liste von Zero-Knowledge Webdienste hier gesammelt." + a: "Wir benutzen den Begriff Ohne Preisgabe von Daten (Zero Knowledge) nicht im Sinn eines Zero Knowledge Beweises aber im Sinn eines Zero Knowledge Webdienstes " + + " Ein Zero Knowledge Webdienst verschlüsselt die Benutzerdaten im Browser, ohne dass der Server je Zugang zu den unverschlüsselten Daten oder zu den Verschlüsselungschlüsseln hat.

" + + " Wir haben hier eine kurze Liste von Zero-Knowledge Webdiensten erstellt." }, why: { - q: "Wieso soll ich CryptPad verwenden?", - a: "Unsere Position ist, dass Clouddienst nicht Zugang zu deinen Daten verlangen sollten, damit du sie zu deinen Kontakten und Mitarbeitern teilen kannst. " + - " Wenn du ein Webdienst benutzt, der nicht explizit eine Ankündigung macht, dass die keinen Zugang zu deinen Information haben, ist es sehr wahrscheinlich, dass sie diese Information für andere Zwecke verwerten." + 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 eine Ankündigung macht, dass die keinen Zugang zu Deinen Information haben, ist es sehr wahrscheinlich, dass sie diese Information für andere Zwecke verwerten." }, compromised: { - q: "Liefert mich CryptPad einen Schutz, wenn mein Gerät zugegriffen wird?", - a: "Im Fall, dass dein Gerät gestolen wird, erlaubt CryptPad ein Knopf zu drucken, damit alle Geräte, ausser das wo du gerade geloggt bist, ausgeloggt wird. " + - " Alle andere Geräten, die mit diesem Konto verbunden sind, werden auch ausgeloggt. " + - " Alle früher verbundene Geräte, werden ausgeloggt, sobald sie CryptPad besuchen.

" + - - " Die Fernlogout Funktion, wie oben beschrieben, ist im Browser implementiert und nicht im Server. " + - " Somit schützt diese nicht von Regierungsagenturen. Aber es sollte ausreichend sein, wenn du ein Logout vergessen hast, wenn du auf einem geteiltes Rechner warst." + q: "Liefert mir CryptPad einen Schutz, wenn auf mein Gerät zugegriffen wird?", + a: "Für den Fall, dass ein Gerät gestohlen wird, ermöglicht CryptPad, das Ausloggen aller Geräte - ausser dem, wo du gerade eingeloggt bist, zu erzwingen. " + + " Dafür gehe auf die Seite mit Deinen Einstellungen and drücke Überall ausloggen." + + " Alle andere Geräte, die mit diesem Konto verbunden sind, werden dann ausgeloggt. " + + " Alle früher verbundenen Geräte werden ausgeloggt, sobald sie CryptPad besuchen.

" + + + " Die Fernlogout Funktion, wie oben beschrieben, ist im Browser implementiert und nicht im Server. " + + " Somit schützt diese nicht von Regierungsagenturen. Aber es sollte ausreichend sein, wenn Du ein Logout vergessen hast, wenn Du auf einem mit anderen Benutzern geteilten Rechner warst." }, crypto: { q: "Welche Kryptografie benutzt ihr?", - a: "CryptPad basiert auf zwei open-source Kryptografiebibliotheken: " + + a: "CryptPad basiert auf zwei quelloffenen Kryptografiebibliotheken: " + " tweetnacl.js und scrypt-async.js.

" + - " Scrypt ist ein Passwort-basiert Schlüsselableitungsalgorithmus. Wir benutzen es, um dein Benutzername und Kennwort in einem Schlüsselpaar umzuwandeln, das deinen Zugang zum CryptDrive, und daher deine gesamte Dokumente, sichert.

" + + " Scrypt ist ein Passwort-basierter Schlüsselableitungsalgorithmus. Wir benutzen es, um Deinen Benutzernamen und Kennwort in einem Schlüsselpaar umzuwandeln, das Deinen Zugang zum CryptDrive, und daher Deine gesamten Dokumente, sichert.

" + - " Wir verwenden die Verschlüsselung xsalsa20-poly1305 und x25519-xsalsa20-poly1305 von tweetnacl, um, bzw, Dokumente und Chat-Historie zu verschlüsseln." + " Wir verwenden die Verschlüsselung xsalsa20-poly1305 und x25519-xsalsa20-poly1305 von tweetnacl, um Dokumente und Chat-Historie zu verschlüsseln." } }; out.faq.usability = { title: 'Usability', register: { q: "Was kriege ich, wenn ich registriere?", - a: "Registrierte Benutzer können eine Menge Funktionen verwenden, die unregistrierten nicht verwenden können. Es gibt eine Tabelle hier." + a: "Registrierte Benutzer können eine Menge Funktionen verwenden, die unregistrierte nicht nutzen können. Es gibt hier eine Tabelle." }, share: { - q: "Wie kann ich Zugang zu einem verschlüsselten Dokument mit Freunden teilen?", - a: "CryptPad macht den Verschlüsselungsschlüssel zu deinem Pad nach dem # Buchstabe in dem URL." + - " Alles was nach diesem Buchstabe kommt, ist nicht zum Server geschickt; also haben wir nie Zugang zu deinem Verschlüsselungsschlüssel." + - " Wenn du das Link deines Dokuments teilst, teilst du auch die Fähigkeit zum Lesen und zum Bearbeiten." + q: "Wie kann ich den Zugang zu einem verschlüsselten Dokument mit Freunden teilen?", + a: "CryptPad legt den Verschlüsselungsschlüssel zu deinem Pad nach dem # Buchstabe in dem URL." + + " Alles was nach diesem Buchstaben kommt, wird nicht zum Server geschickt; also haben wir nie Zugang zu deinem Verschlüsselungsschlüssel." + + " Wenn du den Link deines Dokuments teilst, teilst Du auch die Fähigkeit zum Lesen und zum Bearbeiten." }, remove: { - q: "Ich habe ein Dokument aus meinem CryptDrive gelöst, aber den Inhalt ist noch verfügbar. Wie kann ich es entfernen?", - a: "Nur eigene Dokumente, die erst in Februar 2018 eingeführt wurden, können gelöscht werden. Dazu können diese Dokument nur von deren Eigentümer gelöscht werden" + - " (der Benutzer, der das Dokument original gestaltet hat). Wenn du nicht der Eigentümer eines Dokuments bist, musst du noch den Eigentümer bitten, dass er dieses löscht." + - " Für ein Dokument, wovon du den Eigentümer bist, kannst du auf dem Dokument in CryptDrive rechtsklicken und Vom Server löschen wählen. " + q: "Ich habe ein Dokument aus meinem CryptDrive gelöscht, aber der Inhalt ist noch verfügbar. Wie kann ich es entfernen?", + a: "Nur eigene Dokumente, die erst in Februar 2018 eingeführt wurden, können gelöscht werden und zwar nur von deren Eigentümer" + + " (der Benutzer, der das Dokument original gestaltet hat). Wenn Du nicht der Eigentümer eines Dokuments bist, musst du den Eigentümer bitten, dass er dieses löscht." + + " Für ein Dokument, dessen Eigentümer du bist, kannst du auf dem Dokument in CryptDrive rechtsklicken und Vom Server löschen wählen. " }, forget: { q: "Was passiert, wenn ich mein Passwort vergesse?", a: " Leider: Wenn wir dein Passwort zurückerstellen könnten, könnten wir auch Zugang zu deinen Daten selber haben. " + - " Wenn du dein Passwort nicht registriert hast, und kann es auch nicht erinnern, kannst du vielleicht die vergangene Dokumente von deinem Browserverlauf zurück gewinnen. " + " Wenn du dein Passwort nicht aufgeschrieben und vergessen hast, kannst Du vielleicht die vergangenen Dokumente aus deinem Browserverlauf zurückgewinnen. " }, change: { q: "Was ist, wenn ich mein Passwort wechseln möchte?", a: "Es ist aktuell nicht möglich, dein CryptPad Passwort zu wechseln, obwohl wir diese Funktion bald planen." }, devices: { - q: "Ich bin auf zwei Geräte eingeloggt und sehe zwei unterschiedliche CryptDrives. Wie ist das möglich?", - a: "Es ist möglich, dass du zweimal derselben Name registriert hast, mit unterschiedlichen Passwörter." + - " Weil der CyrptPad Server dicht mit deinem kryptografische Unterschrift identifiziert, es kann nicht dich verhindern, mit demselben Name einzuloggen." + - " Somit hat jede Benutzerkonto ein einzigartiges Beutzername und Passwortkombination. " + - " Angemeldete Benutzer können ihre Benutzername im oberen Teil der Einstellungsseite sehen." + 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 denselben Namen registriert hast, mit unterschiedlichen Passwörtern." + + " Weil der CyrptPad Server dich mit deiner kryptografischen Unterschrift und nicht mit deinem Namen identifiziert, kann er nicht verhindern, daß derselbe Name von mehreren verwendet wird." + + " Somit hat jede Benutzerkonto eine einzigartige Beutzername- und Passwortkombination. " + + " Angemeldete Benutzer können ihren Benutzernamen im oberen Teil der Einstellungsseite sehen." }, folder: { - q: "Kann ich meine ganze Ordnern in CryptDrive teilen?", - a: "Wir arbeiten daran, eine Arbeitgruppenfunktion anzubieten, die Mitglieder erlauben würde, ganze Ordnern sowie alle Dokumente darin, zu teilen." + q: "Kann ich ganze Ordner in CryptDrive teilen?", + a: "Wir arbeiten daran, eine Arbeitgruppenfunktion anzubieten, die Mitgliedern erlauben würde, ganze Ordnern sowie alle Dokumente darin zu teilen." }, feature: { - q: "Könnt ihr diese Funktion hinzufügen, das ich brauche?", - a: "Viele Funktionen existieren in CryptPad, weil Benutzern haben dafür gebeten." + - " Unsere Kontaktseite gibt eine Liste de Methoden, um mit uns in Kontakt zu treten.

" + + q: "Könnt ihr diese eine Funktion hinzufügen, die ich brauche?", + a: "Viele Funktionen existieren in CryptPad, weil Benutzern darum gebeten haben." + + " Unsere Kontaktseite hat eine Liste der Möglichkeiten, wie man mit uns in Kontakt treten kann.

" + - "Leider können wir aber nicht garantieren, dass wir alle Funktionen entwickeln, die Benutzern bitten." + - " Wenn eine Funktion kritisch für ihre Organisation ist, kannst du Sponsor der Entwicklung dieser Funktion werden, und somit deren Realisierung sichern." + + "Leider können wir aber nicht garantieren, dass wir alle Funktionen entwickeln, um die Benutzer bitten." + + " Wenn eine Funktion kritisch für deine Organisation ist, kannst du Sponsor der Entwicklung dieser Funktion werden, und somit deren Realisierung sichern." + " Bitte kontaktiere sales@cryptpad.fr für mehr Informationen.

" + - "Auch wenn du nicht die Entwicklung einer Funktion sponsorieren kannst, sind wir zu Rückmeldungen interessiert, damit es uns hilft CryptPad zu verbessern." + - " Du bist willkommen, mit uns in Kontakt zu treten, mit eine der Methoden oben." + "Auch wenn du nicht die Entwicklung einer Funktion sponsoren kannst, sind wir an Rückmeldungen interessiert, damit es uns hilft CryptPad zu verbessern." + + " Kontaktiere uns jederzeit mit einer der oben angegebenen Methoden." } }; @@ -951,58 +960,54 @@ title: "Andere Fragen?", pay: { q: "Wieso soll ich zahlen, wenn so viele Funktionen sowieso kostenfrei sind?", - a: "Wir geben Sponsoren zusätzliche Speicherplatzmöglichkeiten sowie die Möglichkeit, die Speicherplatzgrenzen ihrer Freunde zu erhören (lese mehr).

" + + a: "Wir geben Sponsoren zusätzlichen Speicherplatz sowie die Möglichkeit, die Speicherplatzgrenzen ihrer Freunde zu erhöhen (lese mehr).

" + - " Weiter als diese kurzfristige Vorteile kannst du, wenn du ein Premiumangebot annimmst, die aktive Weiterentwicklung von CryptPad. Dieses beinhaltet Bugs reparieren, neue Funktionen gestalten, und es leichter für andere zu machen, dass sie CryptPad auf eigenen Servers installieren." + - " Zusätzlich hilfst du das den Anderen zu beweisen, dass Leute datenschutzschonende Technologien verbessern wollen. Wir hoffen, dass am Ende Geschäftmodelle ein Aspekt der vergangene Geschichte ist.

" + + " Über diese diese kurzfristigen Vorteile hinaus kannst Du, wenn Du ein Premiumangebot annimmst, die aktive Weiterentwicklung von CryptPad fördern. Dieses beinhaltet Fehler zu beseitigen, neue Funktionen zu gestalten, und es erleichtern, CryptPad auf eigenen Servern zu installieren." + + " Zusätzlich hilfst du, anderen Anbiertern zu beweisen, dass Leute datenschutzschonende Technologien unterstützen. Wir hoffen, dass am Ende Geschäftmodelle, die auf dem Verkauf von Benutzerdaten basieren, Vergangenheit werden.

" + - " Am Ende glauben wir, dass es gut ist, die Funktionen von CryptPad kostenfrei anzubieten, weil jeder persönlichen Datenschutz braucht, nicht nur diejenige mit Extraeinkommen." + - " Durch ihre Unterstützung hilfst du uns, zu ermöglichen, dass Bevölkerung mit weniger Einkommen diese grundlegende Funktionen geniessen können, ohne dass ein Preisetikette daran klebt." + " Außerdem glauben wir, dass es gut ist, die Funktionen von CryptPad kostenfrei anzubieten, weil jeder persönlichen Datenschutz braucht, nicht nur diejenige mit Extraeinkommen." + + " Durch deine Unterstützung hilfst Du uns, zu ermöglichen, dass auch Menschen mit weniger Einkommen diese grundlegenden Funktionen geniessen können, ohne dass ein Preisetikett daran klebt." }, goal: { - q: "Was ist ihr Ziel?", - a: "Durch die Verbesserung von Datenschutzschonende Technologie möchten wir die Erwartungen der Benutzern erhöhen, was der Datenschutz auf Cloudplattformen angeht." + - "Wir hoffen, dass unsere Arbeit andere Dienstanbietern in allen Domänen ähnliche oder bessere Dienste anbieten können. " + - "Trotz unser Optimismu wissen wir, dass vieles vom Web aus gezielte Werbung gesponsert wird. " + - "Es gibt viel mehr Arbeit in der Richtung zu tun, als wir selber schaffen, und wir erkennen die Unterstützung der Gemeinschaft für Promotion, Support und andere Beiträge für dieses Zweck." + q: "Was ist euer Ziel?", + a: "Durch die Verbesserung von datenschutzschonenden Technologien 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. " + + "Trotz unser Optimismus wissen wir, dass ein grosser Teil des Netztes durch gezielte Werbung finanziert wird. " + + "Es gibt viel mehr Arbeit in der Richtung, als wir jemals schaffen können, und wir freuen uns über die Förderung, Unterstützung und Beiträge aus unserer Community." }, jobs: { - q: "Stellt ihr an?", - a: "Ja! Bitte schicke eine kurze Einführung zu dir auf jobs@xwiki.com." + q: "Sucht Ihr Mitarbeiter*innen?", + a: "Ja! Bitte schicke eine kurze Vorstellung an jobs@xwiki.com." }, host: { - q: "Könnt ihr mich helfen, meine eigene Installation von CryptPad zu erledigen?", - a: "Wir sind froh, dich zu unterstützen, das interne CryptPad deiner Firma zu installieren. Setze dich bitte mit sales@cryptpad.fr in Kontakt für mehr Information.", + q: "Könnt ihr mir helfen, meine eigene Installation von CryptPad aufzubauen?", + a: "Wir bieten gerne Support für das Aufsetzen eines internen CryptPads für deine Organisation. Setze dich bitte mit sales@cryptpad.fr in Kontakt für mehr Information.", }, revenue: { - q: "Wie kann ich ein geteilttes Einkommen Modell erreichen?", - a: " Wenn du deine eigene Installation von CrytPad betreibst, und du möchtests die Einkommen für deine bezahlte Konten mit Entwicklern teilen, wird dein Server als Partnerservice konfugriert werden müssen.

" + + 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 Entwicklern teilen möchtest, muß dein Server als Partnerservice konfiguriert werden.

" + - "In deinem CryptPad Verzeichnis befinden sich config.example.js, die eine Erklärung liefert, wie du dein Server dafür konfigurieren muss. "+ - "Danakch solltest du sales@cryptpad.fr ein Email schicken, damit es geprüft wird, dass dein Server richtig mit HTTPS konfiguriert wird und damit die Bezahlungsmethoden diskutiert werden. " + "In Deinem CryptPad Verzeichnis befindet sich config.example.js, die erklärt, wie du deinen Server dafür konfigurieren musst. "+ + "Danach solltest du sales@cryptpad.fr kontaktieren, damit geprüft wird, dass dein Server richtig mit HTTPS konfiguriert ist und die Bezahlungsmethoden abgesprochen werden können. " }, }; - - - - // terms.html - - out.tos_title = "Cryptpad Nutzungsbedingungen"; - out.tos_legal = "Sei nicht bösartig, missbrauchend und mach nichts illegales."; - out.tos_availability = "Wir hoffen, dass dir dieser Service nützt, aber Erreichbarkeit und Performanz können nicht garantiert werden. Bitte exportiere deine Daten regelmäßig."; - out.tos_e2ee = "Cryptpad Dokumente können von allen gelesen oder bearbeitet werden, die den \"fragment identifier\" des Dokuments erraten oder auf eine andere Art davon erfahren. Wir empfehlen dir Ende-Zu-Ende verschlüsselte Nachrichtentechnik (e2ee) zum Versenden der URLs zu nutzen. Wir übernehmen keine Haftung falls eine URL erschlichen oder abgegriffen wird."; - out.tos_logs = "Metadaten, die dein Browser bereitstellt, können geloggt werden, um den Service aufrechtzuerahlten."; - out.tos_3rdparties = "Wir geben keine Individualdaten an dritte Weiter, außer auf richterliche Anordnung."; + + // terms.html 995 + out.tos_title = "Cryptpad Nutzungsbedingungen"; + out.tos_legal = "Sei nicht bösartig oder missbrauchend und mach nichts illegales."; + out.tos_availability = "Wir hoffen, dass dir dieser Service nützt, aber Erreichbarkeit und Performanz können nicht garantiert werden. Bitte exportiere deine Daten regelmäßig."; + out.tos_e2ee = "Cryptpad Dokumente können von allen gelesen oder bearbeitet werden, die den \"fragment identifier\" des Dokuments erraten oder auf eine andere Art davon erfahren. Wir empfehlen dir Ende-Zu-Ende verschlüsselte Nachrichtentechnik (e2ee) zum Versenden der URLs zu nutzen. Wir übernehmen keine Haftung, falls eine URL erschlichen oder abgegriffen wird."; + out.tos_logs = "Metadaten, die dein Browser übermittelt, können geloggt werden, um den Service aufrechtzuerhalten."; + out.tos_3rdparties = "Wir geben keine Individualdaten an Dritte Weiter, außer auf richterliche Anordnung."; // 404 page - out.four04_pageNotFound = "Wir konnten nicht die Seite finden, die du angefordert hast."; + out.four04_pageNotFound = "Wir konnten die Seite, die du angefordert hast, nicht finden."; // BottomBar.html - // out.bottom_france = 'Mit in gemacht'; // out.bottom_support = 'Ein XWiki SAS Labs Project mit Hilfe von OpenPaaS-ng'; - // Header.html + // Header.html out.updated_0_header_logoTitle = 'Zu deinem CryptDrive'; out.header_logoTitle = out.updated_0_header_logoTitle; @@ -1012,129 +1017,134 @@ out.help = {}; - out.help.title = "Mit CryptPad anfängen"; + out.help.title = "Mit CryptPad anfangen"; out.help.generic = { more: 'Erfahre mehr wie CryptPad für dich arbeiten kann, indem du unsere FAQ liest.', - share: 'Benutze das Teilen Menü (), um Links zu schicken, die zu Kooperationen im Lesen oder Bearbeiten einladen.', + share: 'Benutze das Teilen-Menü (), um Links zu schicken, die zur Mitarbeit beim Lesen oder Bearbeiten einladen.', stored: 'Jedes Dokument, dass du besuchst, ist automatisch in deinem CryptDrive gespeichert.', }; out.help.text = { - formatting: 'Du kannst das Toolbar anzeigen oder verbergen indem du auf oder klickst.', - embed: 'Registrierte Benutzern können mit Bilder oder Dateien einbetten, die in deren CryptDrive gespeichert sind.', + formatting: 'Du kannst die Werkzeugleiste anzeigen oder verbergen indem du auf oder klickst.', + embed: 'Registrierte Benutzer können mit Bilder oder Dateien einbetten, die in deren CryptDrive gespeichert sind.', history: 'Du kannst das Menü Verlauf benutzen, um frühere Version anzusehen oder zurückbringen.', }; out.help.pad = { - export: 'Du kannst export als PDF benutzen, indem du auf dem Knopf in dem Formattierungstoolbar druckst.', + export: 'Du kannst den Export als PDF benutzen, indem Du auf dem Knopf in dem Formatierungs-Werkzeugleiste drückst.', }; out.help.code = { - modes: 'Benutze das Dropdown Menü im Submenü , um die Syntaxherhorhebung oder das Farbschema zu wechseln.', + modes: 'Benutze das Dropdown Menü im Untermenü , um die Syntaxhervorhebung oder das Farbschema zu wechseln.', }; out.help.slide = { markdown: 'Schreibe Folien in Markdown and separiere sie mit der Zeile ---.', - present: 'Starte die Präsentation mit dem Knopf .', - settings: 'Verändere die Präsentationseinstellung (Hintergrund, Transition, Anzeige der Seitenummer, etc) mit dem Knopf in dem Submenü .', + present: 'Starte die Präsentation mit dem Knopf .', + settings: 'Verändere die Präsentationseinstellungen (Hintergrund, Transition, Anzeige der Seitenummer, etc) mit dem Knopf in dem Submenü .', colors: 'Verändere Text- und Hintergrundfarbe mit den Knöpfen und .', }; out.help.poll = { - decisions: 'Treffen Entscheidung privat, unter Bekannte', - options: 'Schlage zuätzliche Optionen, und mache deine bevorzugte Optionen laut', - choices: 'Klicke Zellen in deiner Spalte, um zwischen ja (), viellecht (~), oder nein () zu wählen', - submit: 'Klicke auf schicken, damit deine Wahlen anderen Sichtbar wird', + decisions: 'Treffe Entscheidungen gemeinsam mit deinen Bekannten', + options: 'Mache Vorschläge und teile deine Präferenzen mit', + choices: 'Klicke die Zellen in deiner Spalte, um zwischen ja (), viellecht (~), oder nein () zu wählen', + submit: 'Klicke auf Schicken, damit deine Entscheidung für andere sichtbar wird', }; out.help.whiteboard = { - colors: 'Ein Doppelklick auf Farben erlaubt die Palette zu verändern', - mode: 'Deaktiviere das Zeichenmodus, um die Strichen zu ziehen und verlängern', - embed: 'Einbette Bilder von deiner Festplatte oder von deinem CryptDrive und exportiere sie als PNG zu deiner Festplatte oder zu deinem CryptDrive oder von deinem CryptDrive und exportiere sie als PNG zu deiner Festplatte oder zu deinem CryptDrive Knopf in der rechten oberen Ecke', + task: 'Verschiebe Items von einem Bord zum anderen durch Ziehen und Ablegen', + color: 'Ändere die Farben durch Klicken auf den farbigen Teil neben dem Bordtitel', + }; out.initialState = [ '

', - 'Hier ist is CryptPad, das Echtzeit kollaboratives Editor ohne Preisgabe deiner Informationen. Alles wird beim Tippen direkt gespeichert.', + 'Dies ist is CryptPad, der Echtzeit-Kollaborativ-Editor ohne Preisgabe deiner Daten. Alles wird beim Tippen direkt gespeichert.', '
', - 'Teile das Link zu diesem, um mit Bekannten zu kooperieren, oder verwende den Knopf , um ein schreibgeschütztes Link  zu teilen. Es erlaubt der Ansicht ohne die Bearbeitung.', + 'Teile den Link zu diesem Pad, um mit Bekannten zusammen zu arbeiten, oder verwende den Knopf , um einen schreibgeschützten Link  zu teilen, der die Ansicht, aber nicht die Bearbeitung erlaubt.', '

', ].join(''); out.codeInitialState = [ - '# CryptPad: Kollaboratives Code Editor ohne Preisgabe deiner Information\n', + '# CryptPad\'s Zero Knowledge Kollaborativer Code Editor ohne Preisgabe deiner Daten\n', '\n', - '* Was du hier tippst, ist Verschlüsselt. Nur Personen die das vollen Link haben können es zugreifen.\n', + '* Was du hier tippst, ist verschlüsselt. Nur Personen die das vollen Link haben können es zugreifen.\n', '* Du kannst die Programmierungsprache für die Syntaxhervorhebung sowie das Farbschema oben rechts wählen.' ].join(''); out.slideInitialState = [ '# CryptSlide\n', - '1. SChreibe deine Präsentation mit der Markdown Syntax\n', - ' - Mehr über Markdwon [hier](http://www.markdowntutorial.com/) erfahren\n', + '1. Schreibe deine Präsentation mit der Markdown Syntax\n', + ' - Mehr über Markdown [hier](http://www.markdowntutorial.com/) erfahren\n', '2. Trenne deine Folien mit ---\n', - '3. Klicke auf dem "Abspielen" Knopf, um das Ergebnis zu sehen.', - ' - Deine Folien sind in Echtzeit aktualisiert' + '3. Klicke auf den "Abspielen" Knopf, um das Ergebnis zu sehen.', + ' - Deine Folien werden in Echtzeit aktualisiert' ].join(''); // Readme - out.driveReadmeTitle = "Was ist CryptPad?"; out.readme_welcome = "Willkommen zu CryptPad !"; - out.readme_p1 = "Willkommen zu CryptPad, hier kannst du deine Notizzen runterschreiben, allein oder mit Bekannten."; - out.readme_p2 = "Dieses Dokument gibt dir einen kurzen Durchblick, wie du CryptPad verwenden kann, um Notizzen zu schreiben und zusammen zu arbeiten."; - out.readme_cat1 = "Kenne CryptDrive lernen"; - out.readme_cat1_l1 = "Ein Dokument erstellen: In deinem CryptDrive, klicke {0} dann {1} und kannst ein ein Dokuemnt erstellen."; // 0: New, 1: Rich Text - out.readme_cat1_l2 = "Ein Dokument deines CryptDrives öffnen: Doppelklick auf der Ikone eines Dokument, um es zu öffnen."; - out.readme_cat1_l3 = "Deine Dokumente organisieren: Wenn du eingeloggst bist, wird jedes Dokument, das du beuuchst in {0} Abschnitt deines CryptDrive"; - out.readme_cat1_l3_l1 = "Du kannst Dateien zwischen Ordnern Ziehen und Schieben in dem Abschnitt {0} deines CryptDrives oder neue Ordnern gestalten."; // 0: Documents - out.readme_cat1_l3_l2 = "Erinnere dich daran, ein Rechtklick auf Ikonen zu geben, da es zusätzlichen Menüfunktionen gibt."; - out.readme_cat1_l4 = "Verschiebe deine alte Dokumente zum Papierkorb: Du kannst deine Dokumente zu {0} verschieben, genauso, wie du es zu einem Ordner machst."; // 0: Trash + out.readme_p1 = "Willkommen zu CryptPad, hier kannst du deine Notizen aufschreiben, allein oder mit Bekannten."; + out.readme_p2 = "Dieses Dokument gibt dir einen kurzen Überblick, wie du CryptPad verwenden kann, um Notizen zu schreiben und und mit anderen zusammen zu arbeiten."; + out.readme_cat1 = "Lerne CryptDrive kennen"; + out.readme_cat1_l1 = "Ein Dokument erstellen: Klicke in Deinem CryptDrive {0}, dann {1} und Du kannst ein Dokuemnt erstellen."; // 0: New, 1: Rich Text + out.readme_cat1_l2 = "Ein Dokument Deines CryptDrives öffnen: Doppelklicke auf das Symbol eines Dokument, um es zu öffnen."; + out.readme_cat1_l3 = "Deine Dokumente organisieren: Wenn du eingeloggst bist, wird jedes Dokument, das du besuchst, im {0} Bereich deines CryptDrives angezeigt"; + out.readme_cat1_l3_l1 = "Im Abschnitt {0} deines CryptDrives kannst du Dateien zwischen Ordnern ziehen und ablegen oder neue Ordner anlegen."; // 0: Documents + out.readme_cat1_l3_l2 = "Ein Rechtklick auf Symbole kann zusätzliche Menüfunktionen anbieten."; + out.readme_cat1_l4 = "Verschiebe deine alten Dokumente in den Papierkorb: Du kannst Deine Dokumente zu {0} verschieben, genauso, wie du es zu einem Ordner machst."; // 0: Trash out.readme_cat2 = "Dokumente wie ein Profi gestalten"; out.edit = "bearbeiten"; out.view = "ansehen"; - out.readme_cat2_l1 = "Der Knopf {0} in deinem Dokument erlaubt dich, anderen eine Mitarbeitzugang zu geben (entweder zu {1} oder {2})."; - out.readme_cat2_l2 = "Der Titel eines Dokuments kann mit einem Klick auf dem Stift verändert werden."; - out.readme_cat3 = "Entdecke CryptPad apps"; - out.readme_cat3_l1 = "Mit dem CryptPad Codeeditor kannst du auf Code wie JavaScript, Markdown, oder HTML"; - out.readme_cat3_l2 = "Mit dem CryptPad Präsentationseditor kannst du schnelle Vorträge mithilfe von Markdwon gestalten"; - out.readme_cat3_l3 = "Mit der CryptPad Umfrage kannst du schnell Abstrimmungen treffen, insbesonders, um Meetings zu planen, die dem Kalender von allen passen."; + out.readme_cat2_l1 = "Der Knopf {0} in deinem Dokument erlaubt dir, anderen einen Mitbearbeitungszugang zu geben (entweder zu {1} oder {2})."; + out.readme_cat2_l2 = "Der Titel eines Dokuments kann mit einem Klick auf den Stift geändert werden."; + out.readme_cat3 = "Entdecke CryptPad Apps"; + out.readme_cat3_l1 = "Mit dem CryptPad Codeeditor kannst du Code wie JavaScript, Markdown, oder HTML bearbeiten"; + out.readme_cat3_l2 = "Mit dem CryptPad Präsentationseditor kannst du schnell Vorträge mit Hilfe von Markdwon gestalten"; + out.readme_cat3_l3 = "Mit der CryptPad Umfrage kannst du schnell Abstimmungen durchführen, insbesondere, um Meetings zu planen, die in den Kalender von allen passen."; // Tips out.tips = {}; out.tips.shortcuts = "`ctrl+b`, `ctrl+i` and `ctrl+u` sind Tatstenkürzeln um fett, kurziv, oder unterschrieben zu markieren."; - out.tips.indent = "In gezifferten oder einfache Listen kannst du TAB und SHIFT-TAB benutzen, um die Identierung zu erhöhen oder reduzieren."; - out.tips.store = "Jedes Mal, dass du ein Dokument besuchsts, und eingeloggt bist, wird es in deinem CryptDrive gespeichert."; + out.tips.indent = "In bezifferten oder einfache Listen kannst du TAB und SHIFT-TAB benutzen, um den Einzug zu erhöhen oder reduzieren."; + out.tips.store = "Jedes Mal, wenn du ein Dokument besuchst und eingeloggt bist, wird es in deinem CryptDrive gespeichert."; out.tips.marker = "Du kannst Text in einem Dokument mit \"Marker\" Menü in dem Stilmenü markieren."; - out.tips.driveUpload = "Registrierte Benutzer können verschlüsselte Dateien aus ihrer Festplatten hochladen, indem sie einfach Schieben und in ihrem CryptDrive ablegen."; + out.tips.driveUpload = "Registrierte Benutzer können verschlüsselte Dateien aus ihrer Festplatte hochladen, indem sie sie einfach verschieben und in ihrem CryptDrive ablegen."; out.tips.filenames = "Du kannst Dateien in deinem CryptDrive neubenennen. Dieser Name ist nur für dich."; - out.tips.drive = "Eingeloggte Benutzern können ihre Dateien in ihrem CryptDrive organisieren. Dieses ist mit einem Klick auf der CryptPad Ikone oben links erreichbar, wenn mann in einem Dokument ist."; - out.tips.profile = "Registrierte Benuzter können ein Profil gestalten mit dem Benutzer Menü oben rechts."; - out.tips.avatars = "Du kannst ein Benutzerbild in deinem Profil hochladen. Andere sehen es, wenn die in einem Dokument zusammenarbeiten."; - out.tips.tags = "Bringe Tags auf deinen Dokumenten und starte eine Suche-bei-Tags mit dem # Zeichen in dem CryptDrive Suche."; + out.tips.drive = "Eingeloggte Benutzern können ihre Dateien in ihrem CryptDrive organisieren. Dieses ist mit einem Klick auf das CryptPad Symbol oben links erreichbar, wenn man in einem Dokument ist."; + out.tips.profile = "Registrierte Benutzer können ihr Profil mit dem Benutzer Menü oben rechts bearbeiten."; + out.tips.avatars = "Du kannst ein Benutzerbild in dein Profil hochladen. Andere sehen es, wenn sie in einem Dokument zusammenarbeiten."; + out.tips.tags = "Bringe Tags auf deinen Dokumenten an und starte eine Suche-nach-Tags mit dem # Zeichen in dem CryptDrive Suche."; - out.feedback_about = "Wenn du das liest, fragst du dich weshalb Anfragen an Webseiten schickt, wenn manche Aktionen geführt werden."; - out.feedback_privacy = "Wir wollen deinen Datenschutz schonen, aber gleichzeitig wollen wir, dass die Benutzung von CryptPad sehr leicht ist, zB indem wir erfahren, welche UI-Funktion am wichtigsten für unsere Benutzen ist. Dieses wird nachgefragt mit einer genauen Parameterbeschreibung, welche Aktion war gemacht."; - out.feedback_optout = "Wenn du es aber nicht möchtest. besuche deine Einstellungen, dort findest du ein Haken, wo du es deaktivieren kannst."; + out.feedback_about = "Wenn Du das liest, fragst du dich, weshalb dein Browser Anfragen an Webseiten schickt, wenn manche Aktionen ausgeführt werden."; + out.feedback_privacy = "Wir kümmern uns um deinen Datenschutz, aber gleichzeitig wollen wir, dass die Benutzung von CryptPad sehr leicht ist. Deshalb wollen wir erfahren, welche UI-Funktion am wichtigsten für unsere Benutzer ist, indem wir diese mit einer genauen Parameterbeschreibung anfordern."; + out.feedback_optout = "Wenn du das aber nicht möchtest. besuche Deine Einstellungen, dort findest du ein Haken, wo du es deaktivieren kannst."; // Creation page out.creation_404 = "Dieses Dokument existiert nicht mehr. Benutze das folgende Formular, um ein neues Dokument zu gestalten."; out.creation_ownedTitle = "Dokumenttyp"; out.creation_owned = "Eigenes Dokument"; // Creation page out.creation_ownedTrue = "Eigenes Dokument"; // Settings - out.creation_ownedFalse = "Dokument von jemanden anders"; - out.creation_owned1 = "Ein eigenes Dokument kann vom Server gelöscht werden, wenn der Eigentümer es entscheidet. Die Löschung eines eigenes Dokuments verursacht die Löschung aus allen anderen CryptDrives. "; - out.creation_owned2 = "Ein offenes Dokument hat kein Eigentümer, also kann es nicht löschen, ausser es hat sein Auslaufdatum erreicht."; - out.creation_expireTitle = "Lebenszyklus"; - out.creation_expire = "Auslaufende Dokument"; - out.creation_expireTrue = "Ein Lebenszyklus hinzufügen"; - out.creation_expireFalse = "Unbegrenz"; + out.creation_ownedFalse = "Dokument von jemand anderem"; + out.creation_owned1 = "Ein eigenes Dokument kann vom Server gelöscht werden, wenn der Eigentümer so entscheidet. Die Löschung eines eigenes Dokuments bewirkt die Löschung aus allen anderen CryptDrives. "; + out.creation_owned2 = "Ein offenes Dokument hat keinen Eigentümer, also kann es nicht gelöscht werden, ausser es hat sein Ablaufdatum erreicht."; + out.creation_expireTitle = "Ablaufdatum"; + out.creation_expire = "Auslaufendes Dokument"; + out.creation_expireTrue = "Ein Ablaufdatum hinzufügen"; + out.creation_expireFalse = "Unbegrenzt"; out.creation_expireHours = "Stunde(n)"; - out.creation_expireDays = "Tag(en)"; + out.creation_expireDays = "Tag(e)"; out.creation_expireMonths = "Monat(e)"; - out.creation_expire1 = "An unlimited pad will not be removed from the server until its owner deletes it."; - out.creation_expire2 = "An expiring pad has a set lifetime, after which it will be automatically removed from the server and other users' CryptDrives."; + out.creation_expire1 = "Ein unbegrenztes Dokument wird nicht vom Server entfernt solange der Eigentümer es nicht löscht."; + out.creation_expire2 = "Ein auslaufendes Dokument hat eine begrenzte lebensdauer, nach der es automatisch vom Server und aus den CryptDrives anderer Leute entfernt wird."; + out.creation_password = "Passwort hinzufügen"; out.creation_noTemplate = "Keine Vorlage"; out.creation_newTemplate = "Neue Vorlage"; out.creation_create = "Erstellen"; @@ -1146,11 +1156,29 @@ out.creation_ownedByOther = "Eigentum eines anderen Benutzer"; out.creation_noOwner = "Kein Eigentümer"; out.creation_expiration = "Auslaufdatum"; + out.creation_passwordValue = "Passwort"; out.creation_propertiesTitle = "Verfügbarkeit"; out.creation_appMenuName = "Fortgeschrittenes Modus (Ctrl + E)"; - out.creation_newPadModalDescription = "Klicke auf einem Padtyp, um es zu erstellen. Du kannst auch die Tab-Taste benutzen, um zu navigieren, und die Enter-Taste zu bestätigen. "; - out.creation_newPadModalDescriptionAdvanced = "Du kannst das Kästchen ticken (oder auf der Leertaste drucken um den Wert zu ändern), um das Einstellungsdialog bei der Dokumenterstellung anzuzeigen (für eigene oder auslaufende Dokumente)."; - out.creation_newPadModalAdvanced = "Das Einstellungdialog bei der Dokumenterstellung anzeigen"; + out.creation_newPadModalDescription = "Klicke auf einen Padtyp, um es zu erstellen. Du kannst auch die Tab-Taste benutzen, um zu navigieren, und die Enter-Taste zum Bestätigen. "; + out.creation_newPadModalDescriptionAdvanced = "Du kannst das Kästchen markieren (oder auf die Leertaste drücken, um den Wert zu ändern), um den Einstellungsdialog bei der Dokumenterstellung anzuzeigen (für eigene oder auslaufende Dokumente)."; + out.creation_newPadModalAdvanced = "Den Einstellungdialog bei der Dokumenterstellung anzeigen"; + + // Password prompt on the loading screen + out.password_info = "Das Pad, das du öffnen möchtest, ist mit einem Passowrt geschützt. Gib das richtige Passwort ein, um den Inhalt anzuzeigen."; + out.password_error = "Pad nicht gefunden!
Dieser Fehler kann zwei Ursachen haben: entweder ist das Passwort ungültig oder das Pad wurde vom Server gelöscht."; + out.password_placeholder = "Gib das Passwort hier ein..."; + out.password_submit = "Abschicken"; + out.password_show = "Anzeigen"; + + // Change password in pad properties + out.properties_addPassword = "Passwort hinzufügen"; + out.properties_changePassword = "Passwort ändern"; + out.properties_confirmNew = "Bist du sicher? Das Hinzufügen eines Passworts wird die URL dieses Pads ändern und die Chronik entfernen. Benutzer ohne Passwort werden den Zugang zu diesem Pad verlieren."; + out.properties_confirmChange = "Bist du sicher? Das Ändern des Passworts wird die Chronik entfernen. Benutzer ohne das neue Passwort werden den Zugang zu diesem Pad verlieren."; + out.properties_passwordError = "Ein Fehler ist aufgetreten beim Versuch das Passwort zu ändern. Bitte versuche es nochmal."; + out.properties_passwordWarning = "Das Password wurde erfolgreich geändert, aber dein CryptDrive konnte nicht aktualisiert werden. Du mußt möglicherweise die alte Version des Pads manuell entfernen.
Bitte klicke OK um die Seite neu zu laden und die Zugeriffsrechte zu aktualisieren."; + out.properties_passwordSuccess = "Das Password wurde erfolgreich geändert.
Bitte klicke OK um die Seite neu zu laden und die Zugeriffsrechte zu aktualisieren."; + out.properties_changePasswordButton = "Abschicken"; // New share modal out.share_linkCategory = "Link teilen"; @@ -1158,12 +1186,20 @@ out.share_linkEdit = "Bearbeiten"; out.share_linkView = "Ansehen"; out.share_linkOptions = "Linkoptionen"; - out.share_linkEmbed = "Einbettungsmodus (Toolbar und Benutzerliste sind verborgen)"; - out.share_linkPresent = "Anzeigemodus (Bearbeitbare Abschnuttte sind verborgen)"; + out.share_linkEmbed = "Einbettungsmodus (Werkzeugleiste und Benutzerliste sind verborgen)"; + out.share_linkPresent = "Anzeigemodus (Bearbeitbare Abschnittte sind verborgen)"; out.share_linkOpen = "In einem neuen Tab öffnen"; - out.share_linkCopy = "Zur Zwischenablage kopieren."; + out.share_linkCopy = "In die Zwischenablage kopieren."; out.share_embedCategory = "Einbetten"; - out.share_mediatagCopy = "Mediatag zur Zwischenablage kopieren"; + out.share_mediatagCopy = "Mediatag in die Zwischenablage kopieren"; + + // Loading info + out.loading_pad_1 = "Initialisiere Pad"; + out.loading_pad_2 = "Lade Padinhalt"; + out.loading_drive_1 = "Lade Daten"; + out.loading_drive_2 = "Aktualisiere Datenformat"; + out.loading_drive_3 = "Verifiziere Datenintegrität"; - return out; + return out; }); + diff --git a/customize.dist/translations/messages.fr.js b/customize.dist/translations/messages.fr.js index 851d3648b..60744fc8e 100644 --- a/customize.dist/translations/messages.fr.js +++ b/customize.dist/translations/messages.fr.js @@ -386,6 +386,7 @@ define(function () { out.fm_newFolder = "Nouveau dossier"; out.fm_newFile = "Nouveau pad"; out.fm_folder = "Dossier"; + out.fm_sharedFolder = "Dossier partagé"; out.fm_folderName = "Nom du dossier"; out.fm_numberOfFolders = "# de dossiers"; out.fm_numberOfFiles = "# de fichiers"; @@ -435,6 +436,7 @@ define(function () { out.fm_viewListButton = "Liste"; out.fm_viewGridButton = "Grille"; out.fm_renamedPad = "Vous avez renommé ce pad dans votre Drive. Son titre est:
{0}"; + out.fm_canBeShared = "Ce dossier peut être partagé"; out.fm_prop_tagsList = "Mots-clés"; out.fm_burnThisDriveButton = "Effacer toutes les informations stockées par CryptPad dans votre navigateur"; out.fm_burnThisDrive = "Êtes-vous sûr de vouloir supprimmer tout ce qui est stocké par CryptPad dans votre navigateur ?
" + @@ -444,8 +446,11 @@ define(function () { out.fm_deletedPads = "Ces pads n'existent plus sur le serveur, ils ont été supprimés de votre CryptDrive: {0}"; out.fm_tags_name = "Mot-clé"; out.fm_tags_used = "Nombre d'utilisations"; + out.fm_restoreDrive = "Restauration de votre CryptDrive à une version antérieure. Pour de meilleurs résultats, veuillez éviter de modifier votre CryptDrive avant que cette restauration ne soit terminée."; + out.fm_moveNestedSF = "Vous ne pouvez pas placer un dossier partagé dans un autre. Le dossier {0} n'a pas été déplacé."; // File - Context menu out.fc_newfolder = "Nouveau dossier"; + out.fc_newsharedfolder = "Nouveau dossier partagé"; out.fc_rename = "Renommer"; out.fc_open = "Ouvrir"; out.fc_open_ro = "Ouvrir (lecture seule)"; @@ -453,12 +458,13 @@ define(function () { out.fc_delete_owned = "Supprimer du serveur"; out.fc_restore = "Restaurer"; out.fc_remove = "Supprimer de votre CryptDrive"; + out.fc_remove_sharedfolder = "Supprimer"; out.fc_empty = "Vider la corbeille"; out.fc_prop = "Propriétés"; out.fc_hashtag = "Mots-clés"; out.fc_sizeInKilobytes = "Taille en kilo-octets"; // fileObject.js (logs) - out.fo_moveUnsortedError = "La liste des éléments non triés ne peut pas contenir de dossiers."; + out.fo_moveUnsortedError = "La liste des modèles ne peut pas contenir de dossiers."; out.fo_existingNameError = "Ce nom est déjà utilisé dans ce répertoire. Veuillez en choisir un autre."; out.fo_moveFolderToChildError = "Vous ne pouvez pas déplacer un dossier dans un de ses descendants"; out.fo_unableToRestore = "Impossible de restaurer ce fichier à son emplacement d'origine. Vous pouvez essayer de le déplacer à un nouvel emplacement."; @@ -606,6 +612,7 @@ define(function () { out.settings_changePasswordConfirm = "Êtes-vous sûr de vouloir changer votre mot de passe ? Vous devrez vous reconnecter sur tous vos appareils."; out.settings_changePasswordError = "Une erreur est survenue. Si vous n'êtes plus en mesure de vous connecter à votre compte utilisateur ou de changer votre mot de passe, veuillez contacter l'administrateur de votre CryptPad."; out.settings_changePasswordPending = "Votre mot de passe est en train d'être modifié. Veuillez ne pas fermer ou recharger cette page avant que le traitement soit terminé."; + out.settings_changePasswordNewPasswordSameAsOld = "Votre nouveau mot de passe doit être différent de votre mot de passe actuel."; out.upload_title = "Hébergement de fichiers"; out.upload_modal_title = "Options d'importation du fichier"; @@ -1161,5 +1168,14 @@ define(function () { out.loading_drive_2 = "Mise à jour du format des données"; out.loading_drive_3 = "Vérification de l'intégrité des données"; + // Shared folders + out.sharedFolders_forget = "Ce pad est stocké uniquement dans un dossier partagé. Vous ne pouvez pas le déplacer dans votre corbeille. Si vous souhaitez le supprimer, vous pouvez utiliser l'application CryptDrive."; + out.sharedFolders_duplicate = "Certains pads que vous essayez de déplacer sont déjà partagés dans le dossier de destination."; + out.sharedFolders_create = "Créer un dossier partagé"; + out.sharedFolders_create_name = "Nom du dossier"; + out.sharedFolders_create_owned = "Être propriétaire du dossier"; + out.sharedFolders_create_password = "Mot de passe du dossier"; + out.sharedFolders_share = "Partager cette URL avec d'autres utilisateurs enregistrés leur donne accès au dossier partagé. Une fois l'URL ouverte, le dossier partagé sera ajouté au répertoire racine de leur CryptDrive."; + return out; }); diff --git a/customize.dist/translations/messages.js b/customize.dist/translations/messages.js index ac3ba63fd..f29290bff 100644 --- a/customize.dist/translations/messages.js +++ b/customize.dist/translations/messages.js @@ -387,6 +387,7 @@ define(function () { out.fm_newFolder = "New folder"; out.fm_newFile = "New pad"; out.fm_folder = "Folder"; + out.fm_sharedFolder = "Shared folder"; out.fm_folderName = "Folder name"; out.fm_numberOfFolders = "# of folders"; out.fm_numberOfFiles = "# of files"; @@ -436,6 +437,7 @@ define(function () { out.fm_viewListButton = "List view"; out.fm_viewGridButton = "Grid view"; out.fm_renamedPad = "You've set a custom name for this pad. Its shared title is:
{0}"; + out.fm_canBeShared = "This folder can be shared"; out.fm_prop_tagsList = "Tags"; out.fm_burnThisDriveButton = "Erase all information stored by CryptPad in your browser"; out.fm_burnThisDrive = "Are you sure you want to remove everything stored by CryptPad in your browser?
" + @@ -445,8 +447,11 @@ define(function () { out.fm_deletedPads = "These pads no longer exist on the server, they've been removed from your CryptDrive: {0}"; out.fm_tags_name = "Tag name"; out.fm_tags_used = "Number of uses"; + out.fm_restoreDrive = "Resetting your drive to an earlier state. For best results, avoid making changes to your drive until this process is complete."; + out.fm_moveNestedSF = "You can't place one shared folder within another. The folder {0} was not moved."; // File - Context menu out.fc_newfolder = "New folder"; + out.fc_newsharedfolder = "New shared folder"; out.fc_rename = "Rename"; out.fc_open = "Open"; out.fc_open_ro = "Open (read-only)"; @@ -454,12 +459,13 @@ define(function () { out.fc_delete_owned = "Delete from the server"; out.fc_restore = "Restore"; out.fc_remove = "Remove from your CryptDrive"; + out.fc_remove_sharedfolder = "Remove"; out.fc_empty = "Empty the trash"; out.fc_prop = "Properties"; out.fc_hashtag = "Tags"; out.fc_sizeInKilobytes = "Size in Kilobytes"; // fileObject.js (logs) - out.fo_moveUnsortedError = "You can't move a folder to the list of unsorted pads"; + out.fo_moveUnsortedError = "You can't move a folder to the list of templates"; out.fo_existingNameError = "Name already used in that directory. Please choose another one."; out.fo_moveFolderToChildError = "You can't move a folder into one of its descendants"; out.fo_unableToRestore = "Unable to restore that file to its original location. You can try to move it to a new location."; @@ -615,6 +621,7 @@ define(function () { out.settings_changePasswordConfirm = "Are you sure you want to change your password? You will need to log back in on all your devices."; out.settings_changePasswordError = "An unexpected error occurred. If you are unable to login or change your password, contact your CryptPad administrators."; out.settings_changePasswordPending = "Your password is being updated. Please do not close or reload this page until the process has completed."; + out.settings_changePasswordNewPasswordSameAsOld = "Your new password must be different than your current password."; out.upload_title = "File upload"; out.upload_modal_title = "File upload options"; @@ -1210,5 +1217,14 @@ define(function () { out.loading_drive_2 = "Updating data format"; out.loading_drive_3 = "Verifying data integrity"; + // Shared folders + out.sharedFolders_forget = "This pad is only stored in a shared folder, you can't move it to the trash. You can use your CryptDrive if you want to delete it."; + out.sharedFolders_duplicate = "Some of the pads you were trying to move were already shared in the destination folder."; + out.sharedFolders_create = "Create a shared folder"; + out.sharedFolders_create_name = "Folder name"; + out.sharedFolders_create_owned = "Owned folder"; + out.sharedFolders_create_password = "Folder password"; + out.sharedFolders_share = "Share this URL with other registered users to give them access to the shared folder. Once they open this URL, the shared folder will be added to the root directory of their CryptDrive."; + return out; }); diff --git a/package.json b/package.json index aa61b9f49..23e848602 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "cryptpad", "description": "realtime collaborative visual editor with zero knowlege server", - "version": "2.5.0", + "version": "2.6.0", "license": "AGPL-3.0+", "repository": { "type": "git", @@ -10,7 +10,7 @@ "dependencies": { "chainpad-server": "~2.1.0", "express": "~4.16.0", - "mkdirp": "^0.5.1", + "fs-extra": "^7.0.0", "nthen": "~0.1.0", "pull-stream": "^3.6.1", "replify": "^1.2.0", diff --git a/readme.md b/readme.md index 150d21bba..d12e2e376 100644 --- a/readme.md +++ b/readme.md @@ -35,7 +35,7 @@ As such, it is possible for a collaborator on the pad to include some silly/ugly in a CryptPad such as an image which reveals your IP address when your browser automatically loads it or a script which plays Rick Astleys's greatest hits. It is possible for anyone who does not have the key to be able to change anything in the pad or add anything, even the -server, however the clients will notice this because the content hashes in ChainPad will fail to +server, however the clients will notice this because the content hashes in CryptPad will fail to validate. The server does have a certain power, it can send you evil javascript which does the wrong @@ -82,4 +82,4 @@ any later version. If you wish to use this technology in a proprietary product, sales@xwiki.com. [ChainPad]: https://github.com/xwiki-contrib/chainpad -[active attack]: https://en.wikipedia.org/wiki/Attack_(computing)#Types_of_attacks +[active attack]: https://en.wikipedia.org/wiki/Attack_(computing)#Types_of_attack diff --git a/rpc.js b/rpc.js index 54739b78e..f64fddd48 100644 --- a/rpc.js +++ b/rpc.js @@ -7,13 +7,14 @@ var Nacl = require("tweetnacl"); /* globals process */ var Fs = require("fs"); + +var Fse = require("fs-extra"); var Path = require("path"); var Https = require("https"); const Package = require('./package.json'); const Pinned = require('./pinned'); const Saferphore = require("saferphore"); const nThen = require("nthen"); -const Mkdirp = require("mkdirp"); var RPC = module.exports; @@ -1054,7 +1055,7 @@ var upload_complete = function (Env, publicKey, id, cb) { } // lol wut handle ur errors - Fs.rename(oldPath, newPath, function (e) { + Fse.move(oldPath, newPath, function (e) { if (e) { WARN('rename', e); return void cb('RENAME_ERR'); @@ -1146,7 +1147,7 @@ var owned_upload_complete = function (Env, safeKey, cb) { // flow is dumb and I need to guard against this which will never happen // / *:: if (typeof(oldPath) === 'object') { throw new Error('should never happen'); } * / - Fs.rename(oldPath, finalPath, w(function (e) { + Fs.move(oldPath, finalPath, w(function (e) { if (e) { w.abort(); return void cb(e.code); @@ -1218,13 +1219,13 @@ var owned_upload_complete = function (Env, safeKey, id, cb) { var finalOwnPath; nThen(function (w) { // make the requisite directory structure using Mkdirp - Mkdirp(filePath, w(function (e /*, path */) { + Fse.mkdirp(filePath, w(function (e /*, path */) { if (e) { // does not throw error if the directory already existed w.abort(); return void cb(e.code); } })); - Mkdirp(ownPath, w(function (e /*, path */) { + Fse.mkdirp(ownPath, w(function (e /*, path */) { if (e) { // does not throw error if the directory already existed w.abort(); return void cb(e.code); @@ -1254,7 +1255,7 @@ var owned_upload_complete = function (Env, safeKey, id, cb) { // flow is dumb and I need to guard against this which will never happen /*:: if (typeof(oldPath) === 'object') { throw new Error('should never happen'); } */ - Fs.rename(oldPath, finalPath, w(function (e) { + Fse.move(oldPath, finalPath, w(function (e) { if (e) { // Remove the ownership file Fs.unlink(finalOwnPath, function (e) { @@ -1398,7 +1399,7 @@ var writeLoginBlock = function (Env, msg, cb) { nThen(function (w) { // make sure the path to the file exists - Mkdirp(parsed.dir, w(function (e) { + Fse.mkdirp(parsed.dir, w(function (e) { if (e) { w.abort(); cb(e); diff --git a/www/code/app-code.less b/www/code/app-code.less index f4153e95d..37a18b4ee 100644 --- a/www/code/app-code.less +++ b/www/code/app-code.less @@ -1,16 +1,14 @@ -@import (once) "../../customize/src/less2/include/browser.less"; -@import (once) "../../customize/src/less2/include/markdown.less"; -@import (once) "../../customize/src/less2/include/framework.less"; +@import (reference) "../../customize/src/less2/include/browser.less"; +@import (reference) "../../customize/src/less2/include/markdown.less"; +@import (reference) "../../customize/src/less2/include/framework.less"; - -.framework_main( - @bg-color: @colortheme_code-bg, - @warn-color: @colortheme_code-warn, - @color: @colortheme_code-color -); - -// body &.cp-app-code { + .framework_main( + @bg-color: @colortheme_code-bg, + @warn-color: @colortheme_code-warn, + @color: @colortheme_code-color + ); + display: flex; flex-flow: column; max-height: 100%; diff --git a/www/code/inner.js b/www/code/inner.js index afb4cdcd0..9b52f9806 100644 --- a/www/code/inner.js +++ b/www/code/inner.js @@ -37,6 +37,8 @@ define([ 'cm/addon/fold/comment-fold', 'cm/addon/display/placeholder', + 'less!/code/app-code.less' + ], function ( $, DiffMd, diff --git a/www/common/LessLoader.js b/www/common/LessLoader.js index 8846000f0..d9e7d3078 100644 --- a/www/common/LessLoader.js +++ b/www/common/LessLoader.js @@ -4,9 +4,11 @@ const define = (x:any, y:any) => {}; const require = define; */ define([ - '/api/config' -], function (Config) { /*::});module.exports = (function() { + '/api/config', + '/bower_components/nthen/index.js' +], function (Config, nThen) { /*::});module.exports = (function() { const Config = (undefined:any); + const nThen = (undefined:any); */ var module = { exports: {} }; @@ -100,6 +102,10 @@ define([ require(['/bower_components/less/dist/less.min.js'], function (Less) { if (lessEngine) { return void cb(lessEngine); } lessEngine = Less; + Less.functions.functionRegistry.add('LessLoader_currentFile', function () { + return new Less.tree.UnicodeDescriptor('"' + + fixURL(this.currentFileInfo.filename) + '"'); + }); var doXHR = lessEngine.FileManager.prototype.doXHR; lessEngine.FileManager.prototype.doXHR = function (url, type, callback, errback) { url = fixURL(url); @@ -133,24 +139,38 @@ define([ }); }; - module.exports.load = function (url /*:string*/, cb /*:()=>void*/) { - var btime = +new Date(); + var loadSubmodulesAndInject = function (css, url, cb, stack) { + inject(css, url); + nThen(function (w) { + css.replace(/\-\-LessLoader_require\:\s*"([^"]*)"\s*;/g, function (all, u) { + u = u.replace(/\?.*$/, ''); + module.exports.load(u, w(), stack); + return ''; + }); + }).nThen(function () { cb(); }); + }; + + module.exports.load = function (url /*:string*/, cb /*:()=>void*/, stack /*:?Array*/) { + var btime = stack ? null : +new Date(); + stack = stack || []; + if (stack.indexOf(url) > -1) { return void cb(); } + var timeout = setTimeout(function () { console.log('failed', url); }, 10000); var done = function () { - console.log("Compiling [" + url + "] took " + (+new Date() - btime) + "ms"); + clearTimeout(timeout); + if (btime) { + console.log("Compiling [" + url + "] took " + (+new Date() - btime) + "ms"); + } cb(); }; + stack.push(url); cacheGet(url, function (css) { - if (css) { - inject(css, url); - return void done(); - } + if (css) { return void loadSubmodulesAndInject(css, url, done, stack); } console.log('CACHE MISS ' + url); ((/\.less([\?\#].*)?$/.test(url)) ? loadLess : loadCSS)(url, function (err, css) { if (!css) { return void console.error(err); } var output = fixAllURLs(css, url); cachePut(url, output); - inject(output, url); - done(); + loadSubmodulesAndInject(output, url, done, stack); }); }); }; diff --git a/www/common/application_config_internal.js b/www/common/application_config_internal.js index e3ab72b91..7539fb0db 100644 --- a/www/common/application_config_internal.js +++ b/www/common/application_config_internal.js @@ -126,5 +126,11 @@ define(function() { // Warning: This is an experimental feature. It will be enabled by default once we're sure it's stable. config.disableWorkers = true; + // Shared folder are in a beta-test state. They are likely to disappear from a user's drive + // spontaneously, resulting in the deletion of the entire folder's content. + // We highly recommend to keep them disabled until they are stable enough to be enabled + // by default by the CryptPad developers. + config.disableSharedFolders = true; + return config; }); diff --git a/www/common/common-hash.js b/www/common/common-hash.js index 4b0c2c607..d5066b757 100644 --- a/www/common/common-hash.js +++ b/www/common/common-hash.js @@ -398,10 +398,16 @@ Version 1 Hash.findWeaker = function (href, channel, recents) { var parsed = parsePadUrl(href); if (!parsed.hash) { return false; } + // We can't have a weaker hash if we're already in view mode + if (parsed.hashData && parsed.hashData.mode === 'view') { return; } var weaker; Object.keys(recents).some(function (id) { var pad = recents[id]; - var p = parsePadUrl(pad.href); + if (pad.href || !pad.roHref) { + // This pad has an edit link, so it can't be weaker + return; + } + var p = parsePadUrl(pad.roHref); if (p.type !== parsed.type) { return; } // Not the same type if (p.hash === parsed.hash) { return; } // Same hash, not stronger if (channel !== pad.channel) { return; } // Not the same channel @@ -430,6 +436,10 @@ Version 1 var stronger; Object.keys(recents).some(function (id) { var pad = recents[id]; + if (!pad.href) { + // This pad doesn't have an edit link, so it can't be stronger + return; + } var p = parsePadUrl(pad.href); if (p.type !== parsed.type) { return; } // Not the same type if (p.hash === parsed.hash) { return; } // Same hash, not stronger diff --git a/www/common/common-interface.js b/www/common/common-interface.js index 7b05d22fe..a6bc0aec3 100644 --- a/www/common/common-interface.js +++ b/www/common/common-interface.js @@ -1,3 +1,12 @@ +if (!document.querySelector("#alertifyCSS")) { + // Prevent alertify from injecting CSS, we create our own in alertify.less. + // see: https://github.com/alertifyjs/alertify.js/blob/v1.0.11/src/js/alertify.js#L414 + var head = document.getElementsByTagName("head")[0]; + var css = document.createElement("span"); + css.id = "alertifyCSS"; + css.setAttribute('data-but-why', 'see: common-interface.js'); + head.insertBefore(css, head.firstChild); +} define([ 'jquery', '/customize/messages.js', @@ -665,7 +674,7 @@ define([ // Update the current state loading.driveState = data.state; data.progress = data.progress || 100; - data.msg = Messages['loading_drive_'+data.state] || ''; + data.msg = Messages['loading_drive_'+ Math.floor(data.state)] || ''; $progress.html(data.msg); if (data.progress) { $progress.append(h('div.cp-loading-progress-bar', [ @@ -761,7 +770,7 @@ define([ UI.getFileIcon = function (data) { var $icon = UI.getIcon(); if (!data) { return $icon; } - var href = data.href; + var href = data.href || data.roHref; var type = data.type; if (!href && !type) { return $icon; } @@ -826,13 +835,13 @@ define([ var out = false; var xId = $(x).attr('aria-describedby'); if (xId) { - if (xId.indexOf('tippy-tooltip-') === 0) { + if (xId.indexOf('tippy-') === 0) { return true; } } $(x).find('[aria-describedby]').each(function (i, el) { var id = el.getAttribute('aria-describedby'); - if (id.indexOf('tippy-tooltip-') !== 0) { return; } + if (id.indexOf('tippy-') !== 0) { return; } out = true; }); return out; diff --git a/www/common/common-ui-elements.js b/www/common/common-ui-elements.js index 16b45c4f8..fc54da947 100644 --- a/www/common/common-ui-elements.js +++ b/www/common/common-ui-elements.js @@ -13,6 +13,7 @@ define([ '/customize/messages.js', '/customize/application_config.js', '/bower_components/nthen/index.js', + 'css!/customize/fonts/cptools/style.css' ], function ($, Config, Util, Hash, Language, UI, Constants, Feedback, h, MediaTag, Clipboard, Messages, AppConfig, NThen) { var UIElements = {}; @@ -73,26 +74,14 @@ define([ data.password = val; })); }).nThen(function (waitFor) { + var base = common.getMetadataMgr().getPrivateData().origin; common.getPadAttribute('href', waitFor(function (err, val) { - var base = common.getMetadataMgr().getPrivateData().origin; - - var parsed = Hash.parsePadUrl(val); - if (parsed.hashData.mode === "view") { - data.roHref = base + val; - return; - } - - // We're not in a read-only pad + if (!val) { return; } data.href = base + val; - - // Get Read-only href - if (parsed.hashData.type !== "pad") { return; } - var i = data.href.indexOf('#') + 1; - var hBase = data.href.slice(0, i); - var hrefsecret = Hash.getSecrets(parsed.type, parsed.hash, data.password); - if (!hrefsecret.keys) { return; } - var viewHash = Hash.getViewHashFromKeys(hrefsecret); - data.roHref = hBase + viewHash; + })); + common.getPadAttribute('roHref', waitFor(function (err, val) { + if (!val) { return; } + data.roHref = base + val; })); common.getPadAttribute('channel', waitFor(function (err, val) { data.channel = val; @@ -137,82 +126,86 @@ define([ id: 'cp-app-prop-owners', })); - var expire = Messages.creation_expireFalse; - if (data.expire && typeof (data.expire) === "number") { - expire = new Date(data.expire).toLocaleString(); - } - $('