mirror of
https://github.com/spacedeck/spacedeck-open.git
synced 2026-01-30 06:55:26 +01:00
Compare commits
3 Commits
a5914ab600
...
feature-to
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
386d784952 | ||
|
|
352b01569f | ||
|
|
82515e3a8e |
3
.gitignore
vendored
3
.gitignore
vendored
@@ -5,5 +5,4 @@ public/stylesheets/*.css
|
||||
database.sqlite
|
||||
*.swp
|
||||
*~
|
||||
storage/
|
||||
.DS_Store
|
||||
|
||||
|
||||
@@ -1,44 +0,0 @@
|
||||
variables:
|
||||
CONTAINER_IMAGE: git.universe.io:4567/$CI_PROJECT_PATH
|
||||
DOCKER_HOST: tcp://docker:2376
|
||||
stages:
|
||||
- build
|
||||
- deploy_dev
|
||||
- deploy
|
||||
build:
|
||||
stage: build
|
||||
image: docker:stable
|
||||
services:
|
||||
- docker:19.03.12-dind
|
||||
variables:
|
||||
DOCKER_TLS_CERTDIR: "/certs"
|
||||
script:
|
||||
- docker image build -t $CONTAINER_IMAGE:$CI_BUILD_REF -t $CONTAINER_IMAGE:latest .
|
||||
- docker login -u gitlab-ci-token -p $CI_JOB_TOKEN git.universe.io:4567
|
||||
- docker image push $CONTAINER_IMAGE:latest
|
||||
- docker image push $CONTAINER_IMAGE:$CI_BUILD_REF
|
||||
only:
|
||||
- mnt
|
||||
- custom/freiwerkb
|
||||
deploy_dev:
|
||||
stage: deploy
|
||||
image: alpine
|
||||
script:
|
||||
- apk add --update curl
|
||||
- curl -XPOST $WWW_WEBHOOK
|
||||
only:
|
||||
- mnt
|
||||
- custom/freiwerkb
|
||||
deploy:
|
||||
when: manual
|
||||
stage: deploy
|
||||
image: alpine
|
||||
script:
|
||||
- apk add --update curl
|
||||
- |
|
||||
curl -XPOST -K - <<URL
|
||||
$WWW_WEBHOOKS
|
||||
URL
|
||||
only:
|
||||
- master
|
||||
- custom/freiwerkb
|
||||
@@ -1 +0,0 @@
|
||||
nodejs 10.23.1
|
||||
29
.vscode/launch.json
vendored
29
.vscode/launch.json
vendored
@@ -1,29 +0,0 @@
|
||||
{
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"type": "node",
|
||||
"request": "launch",
|
||||
"name": "Launch debug",
|
||||
"runtimeExecutable": "${workspaceFolder}/node_modules/nodemon/bin/nodemon.js",
|
||||
"skipFiles": ["<node_internals>/**"],
|
||||
"program": "${workspaceFolder}/spacedeck.js",
|
||||
"cwd": "${workspaceFolder}",
|
||||
"env": {
|
||||
"NODE_APP_INSTANCE" :"dev"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "node",
|
||||
"request": "launch",
|
||||
"name": "Launch ldap",
|
||||
"runtimeExecutable": "${workspaceFolder}/node_modules/nodemon/bin/nodemon.js",
|
||||
"skipFiles": ["<node_internals>/**"],
|
||||
"program": "${workspaceFolder}/spacedeck.js",
|
||||
"cwd": "${workspaceFolder}",
|
||||
"env": {
|
||||
"NODE_APP_INSTANCE" :"ldap"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
# Changelog
|
||||
|
||||
## [X.X.X] - 2021-03-23
|
||||
|
||||
### Changes
|
||||
|
||||
- Replaced phantomjs with puppeteer #169
|
||||
- Create Hungarian language pack #174
|
||||
31
Dockerfile
31
Dockerfile
@@ -1,20 +1,25 @@
|
||||
FROM node:18-alpine
|
||||
FROM node:10-alpine3.11
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
# install chromium
|
||||
RUN apk add --no-cache \
|
||||
chromium \
|
||||
nss \
|
||||
freetype \
|
||||
freetype-dev \
|
||||
harfbuzz \
|
||||
ca-certificates \
|
||||
ttf-freefont
|
||||
# build audiowaveform from source
|
||||
|
||||
# Tell Puppeteer to skip installing Chrome. We'll be using the installed package.
|
||||
ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true \
|
||||
PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium-browser
|
||||
RUN apk add git make cmake gcc g++ libmad-dev libid3tag-dev libsndfile-dev gd-dev boost-dev libgd libpng-dev zlib-dev
|
||||
RUN apk add zlib-static libpng-static boost-static
|
||||
|
||||
RUN apk add autoconf automake libtool gettext
|
||||
RUN wget https://github.com/xiph/flac/archive/1.3.3.tar.gz
|
||||
RUN tar xzf 1.3.3.tar.gz
|
||||
RUN cd flac-1.3.3/ && ./autogen.sh
|
||||
RUN cd flac-1.3.3/ && ./configure --enable-shared=no
|
||||
RUN cd flac-1.3.3/ && make
|
||||
RUN cd flac-1.3.3/ && make install
|
||||
|
||||
RUN git clone https://github.com/bbc/audiowaveform.git
|
||||
RUN mkdir audiowaveform/build/
|
||||
RUN cd audiowaveform/build/ && cmake -D ENABLE_TESTS=0 -D BUILD_STATIC=1 ..
|
||||
RUN cd audiowaveform/build/ && make
|
||||
RUN cd audiowaveform/build/ && make install
|
||||
|
||||
# install other requirements
|
||||
|
||||
|
||||
10
Gulpfile.js
10
Gulpfile.js
@@ -1,15 +1,13 @@
|
||||
const gulp = require('gulp');
|
||||
const sass = require('gulp-sass');
|
||||
const concat = require('gulp-concat');
|
||||
const cleanCSS = require('gulp-clean-css');
|
||||
const gulp = require('gulp')
|
||||
const sass = require('gulp-sass')
|
||||
const concat = require('gulp-concat')
|
||||
|
||||
gulp.task('styles', function(done) {
|
||||
gulp.src('styles/**/*.scss')
|
||||
.pipe(sass({
|
||||
errLogToConsole: true
|
||||
}))
|
||||
.pipe(cleanCSS())
|
||||
.pipe(gulp.dest('./public/stylesheets/'))
|
||||
.pipe(concat('style.css'))
|
||||
done()
|
||||
});
|
||||
})
|
||||
|
||||
84
README.md
84
README.md
@@ -12,7 +12,7 @@ We appreciate filed issues, pull requests and general discussion.
|
||||
|
||||
# Features
|
||||
|
||||
- Create virtual whiteboards called _Spaces_ with virtually unlimited size
|
||||
- Create virtual whiteboards called *Spaces* with virtually unlimited size
|
||||
- Drag & drop images, videos and audio from your computer or the web
|
||||
- Write and format text with full control over fonts, colors and style
|
||||
- Draw, annotate and highlight with included graphical shapes
|
||||
@@ -31,13 +31,13 @@ We appreciate filed issues, pull requests and general discussion.
|
||||
|
||||
Spacedeck requires:
|
||||
|
||||
- Node.js 18.x: Web Server / API. Download: https://nodejs.org
|
||||
- Node.js 10.x: Web Server / API. Download: https://nodejs.org
|
||||
- Graphicsmagick. On non-Linux, Download: http://www.graphicsmagick.org/ On Linux, install via package manager.
|
||||
- Optionally ffmpeg, audiowaveform and ghostscript. See "Optional Dependencies" below.
|
||||
|
||||
To run Spacedeck, you only need Node.JS 10.x.
|
||||
|
||||
To install all node dependencies, run (do this once) after cloning the repository:
|
||||
To install all node dependencies, run (do this once):
|
||||
|
||||
npm install
|
||||
|
||||
@@ -45,52 +45,6 @@ To install all node dependencies, run (do this once) after cloning the repositor
|
||||
|
||||
See [config/default.json](config/default.json). Set `storage_local_path` for a local sqlite database or `storage_region`, `storage_bucket`, `storage_cdn` and `storage_endpoint` for AWS S3. `mail_provider` may be one of `console` or `smtp`. Also, omit a trailing `/` for the `endpoint`.
|
||||
|
||||
## Disable DB logs
|
||||
|
||||
```json
|
||||
...
|
||||
"db_logs_disabled": true
|
||||
...
|
||||
```
|
||||
|
||||
## Configure color swatches
|
||||
|
||||
Add a custom array of swatches to your config/default.json.
|
||||
|
||||
**You should include the swatch transparent (rgba(0,0,0,0)) so users can remove the color applied.**
|
||||
|
||||
## Configure default colors
|
||||
|
||||
You can define text, stroke and fill color in your config/default.json.
|
||||
|
||||
**You also should include the default colors in your custom swatches palette.**
|
||||
|
||||
```json
|
||||
...
|
||||
"spacedeck": {
|
||||
"default_text_color": "#E11F26",
|
||||
"default_stroke_color": "#9E0F13",
|
||||
"default_fill_color": "#64BCCA",
|
||||
"swatches": [
|
||||
{"id":8, "hex":"#000000"},
|
||||
{"id":30, "hex":"rgba(0,0,0,0)"},
|
||||
{"id":31, "hex": "#E11F26"},
|
||||
{"id":32, "hex": "#9E0F13"},
|
||||
{"id":33, "hex": "#64BCCA"},
|
||||
{"id":34, "hex": "#40808A"},
|
||||
{"id":35, "hex": "#036492"},
|
||||
{"id":36, "hex": "#005179"},
|
||||
{"id":37, "hex": "#84427E"},
|
||||
{"id":38, "hex": "#6C3468"},
|
||||
{"id":39, "hex": "#F79B84"},
|
||||
{"id":40, "hex": "#B57362"},
|
||||
{"id":41, "hex": "#E7D45A"},
|
||||
{"id":42, "hex": "#ACA044"}
|
||||
]
|
||||
}
|
||||
...
|
||||
```
|
||||
|
||||
# Run (web server)
|
||||
|
||||
node spacedeck.js
|
||||
@@ -107,34 +61,18 @@ For advanced media conversion:
|
||||
|
||||
# Data Storage
|
||||
|
||||
By default, media files are uploaded to the `storage` folder.
|
||||
The database is stored in `database.sqlite` by default.
|
||||
|
||||
# Other databases (Not officially supported)
|
||||
|
||||
## Postgres
|
||||
|
||||
Add the [pg](https://www.npmjs.com/package/pg) module and change the config/default.json to
|
||||
|
||||
```
|
||||
"storage_dialect": "postgres",
|
||||
```
|
||||
|
||||
Adapt the other values as needed
|
||||
|
||||
```
|
||||
"storage_host": "localhost",
|
||||
"storage_database": "spacedeck",
|
||||
"storage_username": "username",
|
||||
"storage_password": "password",
|
||||
```
|
||||
By default, media files are uploaded to the ```storage``` folder.
|
||||
The database is stored in ```database.sqlite``` by default.
|
||||
|
||||
# Run with Docker
|
||||
|
||||
- configure `config/default.json`
|
||||
- adapt your `docker-compose.yml` if needed.
|
||||
- start the container with `docker-compose up`
|
||||
(use `-d` for background process and `--build` for rebuilding the image)
|
||||
- configure `volumes` section inside `docker-compose.yml`
|
||||
- point to `database.sqlite` on the host system
|
||||
- `touch database.sqlite` if it not exists
|
||||
- point to `storage/` on the host system
|
||||
- `mkdir storage/` if it not exists
|
||||
- start the container with `sudo docker-compose up -f docker-compose.yml -d --build`
|
||||
|
||||
# Hacking
|
||||
|
||||
|
||||
@@ -7,15 +7,8 @@
|
||||
"endpoint": "http://localhost:9666",
|
||||
"invite_code": "top-sekrit",
|
||||
|
||||
"storage_dialect": "sqlite",
|
||||
|
||||
"storage_host": "localhost",
|
||||
"storage_database": "spacedeck",
|
||||
"storage_username": "username",
|
||||
"storage_password": "password",
|
||||
|
||||
"storage_local_path": "./storage",
|
||||
"storage_local_db": "./database/database.sqlite",
|
||||
"storage_local_db": "./database.sqlite",
|
||||
"storage_region": "eu-central-1",
|
||||
"storage_endpoint": "http://localhost:4572",
|
||||
"storage_bucket": "my_spacedeck_bucket",
|
||||
@@ -25,7 +18,7 @@
|
||||
"redis_mock": true,
|
||||
"redis_host": "localhost",
|
||||
|
||||
"export_api_secret": "very_secret_export_password",
|
||||
"phantom_api_secret": "very_secret_phantom_password",
|
||||
|
||||
"mail_provider": "smtp",
|
||||
"mail_smtp_host": "your.smtp.host",
|
||||
@@ -33,6 +26,5 @@
|
||||
"mail_smtp_secure": true,
|
||||
"mail_smtp_require_tls": true,
|
||||
"mail_smtp_user": "your.smtp.user",
|
||||
"mail_smtp_pass": "your.secret.smtp.password",
|
||||
"spacedeck": {}
|
||||
"mail_smtp_pass": "your.secret.smtp.password"
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
version: "2.0"
|
||||
|
||||
services:
|
||||
spacedeck:
|
||||
build: .
|
||||
@@ -6,5 +7,6 @@ services:
|
||||
ports:
|
||||
- "9666:9666"
|
||||
volumes:
|
||||
- ./storage:/app/storage
|
||||
- ./database:/app/database
|
||||
- /absolute/path/to/storage:/app/storage
|
||||
- /absolute/path/to/database.sqlite:/app/database.sqlite
|
||||
|
||||
|
||||
@@ -1,32 +0,0 @@
|
||||
# Configuring Emails
|
||||
|
||||
There are several configuration options in `config/default.json`
|
||||
|
||||
## Email Relay Configuration
|
||||
- mail_provider:
|
||||
* `console`
|
||||
* `smtp`
|
||||
- mail_smtp_host:
|
||||
* the IP address or FQDN of your SMTP email relay
|
||||
- mail_smtp_port:
|
||||
* the port used to connect to the email relay
|
||||
- mail_smtp_secure: true
|
||||
* whether to use TLS when connecting to the SMTP email relay
|
||||
- mail_smtp_require_tls:
|
||||
* `true`: attempt to use TLS even if the email relay doesn't advertise it, don't send the email if TLS isn't supported
|
||||
* `false`: permits emails to be sents without using TLS
|
||||
- mail_smtp_user:
|
||||
* the username for the SMTP email relay.
|
||||
* comment out this line for an email relay that doesn't use authentication
|
||||
- mail_smtp_pass
|
||||
* the password for the SMTP email relay
|
||||
* comment out this line for an email relay that doesn't use authentication
|
||||
|
||||
## Content of Emails
|
||||
|
||||
- teamname:
|
||||
* the team name appears on the emails sent by your spacedeck
|
||||
- contact_email:
|
||||
* the email address that appears on emails being sent by your spacedeck
|
||||
- endpoint:
|
||||
* the URL that users click on in the emails being sent by your spacedeck
|
||||
@@ -12,7 +12,7 @@ server {
|
||||
listen 80;
|
||||
listen [::]:80;
|
||||
|
||||
server_name spacedeck.domain.de
|
||||
servername spacedeck.domain.de
|
||||
|
||||
return 301 https://$server_name$request_uri;
|
||||
}
|
||||
|
||||
@@ -50,8 +50,6 @@ const convertableAudioTypes = [
|
||||
"audio/x-hx-aac-adts",
|
||||
"audio/aac"];
|
||||
|
||||
// ffmpeg progress
|
||||
var duration = 0, time = 0, progress = 0;
|
||||
|
||||
function getDuration(localFilePath, callback){
|
||||
exec.execFile("ffprobe", ["-show_format", "-of", "json", localFilePath], function(error, stdout, stderr) {
|
||||
@@ -60,40 +58,6 @@ function getDuration(localFilePath, callback){
|
||||
});
|
||||
}
|
||||
|
||||
function getConversionProgress(content){
|
||||
// get duration of source
|
||||
var matches = (content) ? content.match(/Duration: (.*?), start:/) : [];
|
||||
if( matches && matches.length>0 ){
|
||||
var rawDuration = matches[1];
|
||||
// convert rawDuration from 00:00:00.00 to seconds.
|
||||
var ar = rawDuration.split(":").reverse();
|
||||
duration = parseFloat(ar[0]);
|
||||
if (ar[1]) duration += parseInt(ar[1]) * 60;
|
||||
if (ar[2]) duration += parseInt(ar[2]) * 60 * 60;
|
||||
}
|
||||
// get the time
|
||||
matches = content.match(/time=(.*?) bitrate/g);
|
||||
if( matches && matches.length>0 ){
|
||||
var rawTime = matches.pop();
|
||||
// needed if there is more than one match
|
||||
if (Array.isArray(rawTime)){
|
||||
rawTime = rawTime.pop().replace('time=','').replace(' bitrate','');
|
||||
} else {
|
||||
rawTime = rawTime.replace('time=','').replace(' bitrate','');
|
||||
}
|
||||
|
||||
// convert rawTime from 00:00:00.00 to seconds.
|
||||
ar = rawTime.split(":").reverse();
|
||||
time = parseFloat(ar[0]);
|
||||
if (ar[1]) time += parseInt(ar[1]) * 60;
|
||||
if (ar[2]) time += parseInt(ar[2]) * 60 * 60;
|
||||
|
||||
//calculate the progress
|
||||
progress = Math.round((time/duration) * 100);
|
||||
}
|
||||
return progress;
|
||||
}
|
||||
|
||||
function createWaveform(fileName, localFilePath, callback){
|
||||
var filePathImage = localFilePath + "-" + (new Date().getTime()) + ".png";
|
||||
|
||||
@@ -171,7 +135,7 @@ function convertVideo(fileName, filePath, codec, callback, progressCallback) {
|
||||
ff.stderr.on('data', function (data) {
|
||||
console.log('[ffmpeg-video] stderr: ' + data);
|
||||
if (progressCallback) {
|
||||
progressCallback(getConversionProgress(""+data)+"%");
|
||||
progressCallback(data);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -1,58 +0,0 @@
|
||||
'use strict';
|
||||
|
||||
const db = require('../models/db');
|
||||
const config = require('config');
|
||||
const puppeteer = require('puppeteer');
|
||||
const os = require('os');
|
||||
|
||||
module.exports = {
|
||||
// type = "pdf" or "png"
|
||||
takeScreenshot: function(space,type,on_success,on_error) {
|
||||
var spaceId = space._id;
|
||||
var space_url = config.get("endpoint")+"/api/spaces/"+spaceId+"/html";
|
||||
|
||||
var export_path = os.tmpdir()+"/"+spaceId+"."+type;
|
||||
|
||||
var timeout = 5000;
|
||||
if (type=="pdf") timeout = 30000;
|
||||
|
||||
space_url += "?api_token="+config.get("export_api_secret");
|
||||
|
||||
console.log("[space-screenshot] url: "+space_url);
|
||||
console.log("[space-screenshot] export_path: "+export_path);
|
||||
|
||||
(async () => {
|
||||
let browser;
|
||||
let page;
|
||||
try {
|
||||
browser = await puppeteer.launch(
|
||||
{
|
||||
headless: true,
|
||||
args: ['--disable-dev-shm-usage', '--no-sandbox']
|
||||
}
|
||||
);
|
||||
page = await browser.newPage();
|
||||
|
||||
page.setDefaultTimeout(timeout);
|
||||
await page.setJavaScriptEnabled(false);
|
||||
await page.goto(space_url, {waitUntil: 'networkidle2'});
|
||||
await page.emulateMediaType('screen');
|
||||
|
||||
if (type=="pdf") {
|
||||
let margin = 2;
|
||||
await page.pdf({path: export_path, printBackground: true, width: space.width+margin+'px', height: space.height+margin+'px' });
|
||||
}else{
|
||||
await page.screenshot({path: export_path, printBackground: true});
|
||||
}
|
||||
|
||||
await browser.close();
|
||||
on_success(export_path);
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
console.error("[space-screenshot] puppeteer abnormal exit for url "+space_url);
|
||||
on_error();
|
||||
}
|
||||
|
||||
})();
|
||||
}
|
||||
};
|
||||
@@ -8,8 +8,7 @@ const path = require('path')
|
||||
const db = require('../models/db')
|
||||
const Sequelize = require('sequelize')
|
||||
const Op = Sequelize.Op
|
||||
const { v4: uuidv4 } = require('uuid');
|
||||
|
||||
const uuidv4 = require('uuid/v4')
|
||||
|
||||
require('../models/db')
|
||||
|
||||
|
||||
70
helpers/phantom.js
Normal file
70
helpers/phantom.js
Normal file
@@ -0,0 +1,70 @@
|
||||
'use strict';
|
||||
|
||||
const db = require('../models/db');
|
||||
const config = require('config');
|
||||
const phantom = require('node-phantom-simple');
|
||||
const os = require('os');
|
||||
|
||||
module.exports = {
|
||||
// type = "pdf" or "png"
|
||||
takeScreenshot: function(space,type,on_success,on_error) {
|
||||
var spaceId = space._id;
|
||||
var space_url = config.get("endpoint")+"/api/spaces/"+spaceId+"/html";
|
||||
|
||||
var export_path = os.tmpdir()+"/"+spaceId+"."+type;
|
||||
|
||||
var timeout = 5000;
|
||||
if (type=="pdf") timeout = 30000;
|
||||
|
||||
space_url += "?api_token="+config.get("phantom_api_secret");
|
||||
|
||||
console.log("[space-screenshot] url: "+space_url);
|
||||
console.log("[space-screenshot] export_path: "+export_path);
|
||||
|
||||
var on_success_called = false;
|
||||
|
||||
var on_exit = function(exit_code) {
|
||||
if (exit_code>0) {
|
||||
console.error("phantom abnormal exit for url "+space_url);
|
||||
if (!on_success_called && on_error) {
|
||||
on_error();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
phantom.create({ path: require('phantomjs-prebuilt').path }, function (err, browser) {
|
||||
if (err) {
|
||||
console.error(err);
|
||||
} else {
|
||||
return browser.createPage(function (err, page) {
|
||||
console.log("page created, opening ",space_url);
|
||||
|
||||
if (type=="pdf") {
|
||||
var psz = {
|
||||
width: space.width+"px",
|
||||
height: space.height+"px"
|
||||
};
|
||||
page.set('paperSize', psz);
|
||||
}
|
||||
|
||||
page.set('settings.resourceTimeout',timeout);
|
||||
page.set('settings.javascriptEnabled',false);
|
||||
|
||||
return page.open(space_url, function (err,status) {
|
||||
page.render(export_path, function() {
|
||||
on_success_called = true;
|
||||
if (on_success) {
|
||||
on_success(export_path);
|
||||
}
|
||||
page.close();
|
||||
browser.exit();
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
}, {
|
||||
onExit: on_exit
|
||||
});
|
||||
}
|
||||
};
|
||||
332
locales/cs.js
332
locales/cs.js
@@ -1,332 +0,0 @@
|
||||
{
|
||||
"ok": "OK",
|
||||
"cancel": "Storno",
|
||||
"close": "Zavřít",
|
||||
"open": "Otevřít",
|
||||
"folder": "Složka",
|
||||
"save": "Uložit",
|
||||
"saved": "Uloženo",
|
||||
"created": "vytvořeno",
|
||||
"duplicate": "Zduplikovat",
|
||||
"delete": "Smazat",
|
||||
"remove": "Odebrat",
|
||||
"set": "nastavit",
|
||||
"reset": "resetovat",
|
||||
"thanks": "Díky",
|
||||
"share": "Sdílet",
|
||||
"signup": "Zaregistrovat se",
|
||||
"login": "Přihlásit se",
|
||||
"logout": "Odhlásit se",
|
||||
"email": "E-mailová adresa",
|
||||
"password": "Heslo",
|
||||
"forgot_password": "Zapomenuté heslo",
|
||||
"width": "Šířka",
|
||||
"height": "Výška",
|
||||
"nick": "Název",
|
||||
"role": "Role",
|
||||
"members": "Členové",
|
||||
"actions": "Akce",
|
||||
"or": "nebo",
|
||||
"you": "vy",
|
||||
"via": "prostřednictvím",
|
||||
"by": "od",
|
||||
"zero": "Nula",
|
||||
"page": "Stránka",
|
||||
"new": "Nevé",
|
||||
"copy": "Zkopírovat",
|
||||
"home": "Domů",
|
||||
"owner": "Vlastník",
|
||||
"space": "Prostor",
|
||||
"second": "Druhé",
|
||||
"not_found": "Nenalezeno.",
|
||||
"untitled_space": "Prostor bez názvu",
|
||||
"untitled_folder": "Složka bez názvu",
|
||||
"untitled": "bez názvu",
|
||||
"sure": "Opravdu to chcete?",
|
||||
"specify": "Zadejte prosím",
|
||||
"confirm": "Potvrďte prosím",
|
||||
"error_unknown_email": "Tato kombinace e-mail/heslo není známa.",
|
||||
"error_password_confirmation": "Zadání hesla se neshodují.",
|
||||
"error_domain_blocked": "Doména, ze které přistupujete, je blokována.",
|
||||
"error_user_email_already_used": "Tato e-mailová adresa už je používána.",
|
||||
"support": "Podpora pro Spacedeck",
|
||||
"offline": "Bez připojení k Internetu. Pokud chcete získat další, klikněte.",
|
||||
"error": "Je nám líto, ale něco se pokazilo. Obraťte se na support@spacedeck.com",
|
||||
"welcome": "Vítejte",
|
||||
"claim": "Vaše digitální tabule.",
|
||||
"trynow": "Vyzkoušet nyní.",
|
||||
"about": "O nás",
|
||||
"terms": "Všeobecné podmínky",
|
||||
"contact": "Kontakt",
|
||||
"privacy": "Soukromí",
|
||||
"business_adress": "Adresa firmy",
|
||||
"post_adress": "Poštovní adresa",
|
||||
"phone": "Telefon",
|
||||
"ceo": "Generální ředitel",
|
||||
"name": "Název",
|
||||
"confirm_subject": "Potvrzení e-mailu pro Spacedeck",
|
||||
"confirm_body": "Děkujeme, že jste se zaregistrovali u Spacedeck.\nPokud chcete potvrdit svou e-mailovou adresu, klikněte na následující odkaz.\n",
|
||||
"confirm_action": "Potvrdit nyní",
|
||||
"team_invite_membership_subject": "Pozvánka do týmu pro %s",
|
||||
"team_invite_membership_body": "Byli jste pozváni do %s na Spacedeck. Pokud chcete pozvání přijmout, klikněte na následující odkaz.",
|
||||
"team_invite_user_body": "Byli jste pozvání do %s na Spacedeck.\nVaše dočasné heslo je „%s“.\nPokud chcete pozvání přijmout, klikněte na následující odkaz.",
|
||||
"team_invite_admin_body": "%s byl(a) pozván(a) do vašeho týmu: %s. Dočasné heslo je „%s“.",
|
||||
"team_invite_membership_acction": "Přijmout",
|
||||
"team_new_member_subject": "Nový člen týmu pro %s zaregistrován",
|
||||
"team_new_member_body": "%s se právě přidal k týmu %s na Spacedeck.",
|
||||
"space_invite_membership_subject": "%s vás pozval(a) do prostoru %s ",
|
||||
"space_invite_membership_body": "Byli jste pozvání %s, abyste se připojili do prostoru %s na Spacedeck. Pokud chcete pozvání přijmout, klikněte na následující odkaz.",
|
||||
"space_invite_membership_action": "Přijmout",
|
||||
"folder_invite_membership_subject": "Prostor",
|
||||
"folder_invite_membership_body": "Byli jste pozvání do týmu na Spacedeck. Pokud chcete pozvání přijmout, kliněte na následující odkaz.",
|
||||
"folder_invite_membership_acction": "Přijmout",
|
||||
"login_google": "Přihlásit se Google účtem",
|
||||
"save_changes": "Uložit změny",
|
||||
"upgrade": "Přejít na vyšší variantu",
|
||||
"upgrade_now": "Přejí na vyšší variantu nyní",
|
||||
"create_space": "Vytvořit prostor",
|
||||
"create_folder": "Vytvořit složku",
|
||||
"email_unconfirmed": "E-mail nepotvrzen",
|
||||
"confirmation_sent": "E-mail odeslán",
|
||||
"folder_filter": "Filtrovat",
|
||||
"sort_by": "Seřadit podle",
|
||||
"last_modified": "Naposledy změněno",
|
||||
"last_opened": "Naposledy otevřeno",
|
||||
"title": "Nadpis",
|
||||
"edit_team": "Upravit tým",
|
||||
"edit_account": "Upravit účet",
|
||||
"log_out": "Odhlásit se",
|
||||
"no_spaces_yet": "Vítejte! Prostory a složky zde můžete vytvářet pomocí tlačítek v levé horním rohu.",
|
||||
"new_folder_title": "Nový název složky",
|
||||
"folder_settings": "Nastavení složky",
|
||||
"upload_cover_image": "Nahrát obrázek pro desky",
|
||||
"spacedeck_pro_ad_folders": "Se Spacedeck Pro, je možné ve složkách organizovat neomezené množství prostorů a spravovat přístup pro každou ze složek. Chcete se dozvědět víc o funkcích této vyšší varianty?",
|
||||
"spacedeck_pro_ad_versions": "Se Spacedeck Pro, je možné ukládat neomezený počet verzí každého prostoru a sledovat tak svůj postup nebo si tak ukládat průběžné stavy. Chcete se dozvědět víc o funkcích této vyšší varianty?",
|
||||
"spacedeck_pro_ad_pdf": "Se Spacedeck Pro, je možné exportovat vaše prostory jako PDF soubory pro účely archivace, odesílání e-mailem nebo tisk. Chcete se dozvědět víc o funkcích této vyšší varianty?",
|
||||
"spacedeck_pro_ad_zip": "Se Spacedeck Pro, je možné exportovat obsah prostoru jako ZIP balíček. Chcete se dozvědět víc o funkcích této vyšší varianty?",
|
||||
"spacedeck_pro_ad_colors": "Se Spacedeck Pro, je možné míchat své vlastní barvy pomocí profesionálního voliče barev.",
|
||||
"profile_caption": "Profil",
|
||||
"upload_avatar": "Nahrát profilový obrázek",
|
||||
"uploading_avatar": "Nahrát profilový obrázek…",
|
||||
"avatar_dimensions": "Doporučené rozměry: 200×200 pixelů.",
|
||||
"profile_name": "Jméno",
|
||||
"profile_email": "E-mailová adresa",
|
||||
"send_again": "Poslat znovu",
|
||||
"confirmation_sent_long": "E-mail s odkazem pro potvrzení odeslán. Podívejte se do své schránky.",
|
||||
"confirmation_sent_another": "Odeslán další odkaz pro potvrzení.",
|
||||
"confirmation_sent_dialog_text": "Poslali jsme vám e-mail vysvětlující jak potvrdit svou e-mailovou adresu.",
|
||||
"payment_caption": "Platba",
|
||||
"language_caption": "Jazyk",
|
||||
"notifications_caption": "Upozornění",
|
||||
"notifications_option_chat": "E-mailem mne informujte o nových komentářích",
|
||||
"notifications_option_spaces": "Posílejte mi denní souhrn dění v mých prostorech a složkách",
|
||||
"password_caption": "Heslo",
|
||||
"current_password": "Stávající heslo",
|
||||
"new_password": "Nové heslo",
|
||||
"verify_password": "Ověřit si heslo",
|
||||
"change_password": "Změnit si heslo",
|
||||
"reset_password": "Resetovat heslo",
|
||||
"terminate_caption": "Smazat účet",
|
||||
"terminate_warning": "Pokud svůj účet smažete, budou veškeré prostory, složky a zprávy, včetně obsahu, který jste vy a další lidé vytvořili ve vašich prostorech ZLIKVIDOVÁNY.",
|
||||
"terminate_warning2": "Toto už nepůjde napravit.",
|
||||
"terminate_reason": "Zpráva",
|
||||
"terminate_reason_caption": "Pomozte nám zlepšit se sdělením vašeho dúvodu pro zrušení.",
|
||||
"terminate_terminate": "Ukončit",
|
||||
"space_blank1": "Vítejte v novém prostoru!",
|
||||
"space_blank2": "Přetáhněte sem soubory, vkládejte odkazy",
|
||||
"space_blank3": "nebo použijte níže uvedené nástroje",
|
||||
"space_blank4": "a zaplňte tento prostor obsahem.",
|
||||
"draft": "Koncept",
|
||||
"publish": "Zveřejnit",
|
||||
"published": "Zveřejněno",
|
||||
"save_version": "Uložit verzi",
|
||||
"version_saved": "Verze uložena",
|
||||
"post": "Odeslat zprávu",
|
||||
"chat_invite_cta1": "Spolupráce je zábava!",
|
||||
"chat_invite_cta2": "Proč ",
|
||||
"chat_invite_cta3": "nepozvat nějaké lidi",
|
||||
"chat_invite_cta4": "ke společné práci?",
|
||||
"chat_message_placeholder": "Napiště zprávu od vás…",
|
||||
"view": "Zobrazit",
|
||||
"edit": "Upravit",
|
||||
"present": "Přezentovat",
|
||||
"chat": "Chat",
|
||||
"meta": "Meta",
|
||||
"tool_search": "Hledat",
|
||||
"tool_upload": "Nahrát",
|
||||
"tool_text": "Text",
|
||||
"tool_shape": "Tvar",
|
||||
"tool_zones": "Oblasti",
|
||||
"tool_canvas": "Plátno",
|
||||
"search_media": "Hledat média…",
|
||||
"type_here": "Pište sem",
|
||||
"text_formats": "Formáty",
|
||||
"format_p": "Odstavec",
|
||||
"format_bullets": "Seznam s odrážkami",
|
||||
"format_numbers": "Číslovaný seznam",
|
||||
"format_h1": "Nadpis 1",
|
||||
"format_h2": "Nadpis 2",
|
||||
"format_h3": "Nadpis 3",
|
||||
"font_size": "Velikost písma",
|
||||
"line_height": "Výška řádku",
|
||||
"tool_align": "Zarovnat",
|
||||
"tool_styles": "Styly",
|
||||
"tool_bullets": "Odrážky",
|
||||
"tool_numbers": "Čísla",
|
||||
"tool_font": "Písmo",
|
||||
"color_fill": "Vyplnit",
|
||||
"color_stroke": "Čára",
|
||||
"color_text": "Text",
|
||||
"tool_type": "Typ",
|
||||
"tool_box": "Box",
|
||||
"tool_link": "Odkaz",
|
||||
"tool_layout": "Rozvržení",
|
||||
"tool_options": "Předvolby",
|
||||
"tool_stroke": "Čára",
|
||||
"tool_delete": "Smazat",
|
||||
"tool_lock": "Uzamknout",
|
||||
"tool_copy": "Zkopírovat",
|
||||
"stack": "Na sebe",
|
||||
"tool_circle": "Kruh",
|
||||
"tool_hexagon": "Šestiúhelník",
|
||||
"tool_square": "Čtverec",
|
||||
"tool_diamond": "Diamant",
|
||||
"tool_bubble": "Bublina",
|
||||
"tool_cloud": "Mrak",
|
||||
"tool_burst": "Dávka",
|
||||
"tool_star": "Hvězda",
|
||||
"tool_heart": "Srdce",
|
||||
"tool_scribble": "Kreslení",
|
||||
"tool_line": "Čára",
|
||||
"tool_arrow": "Šipka",
|
||||
"search_media_placeholder": "HLedat webová média…",
|
||||
"add_zone": "Nová oblast",
|
||||
"palette": "Paleta",
|
||||
"picker": "Volič",
|
||||
"background_image_caption": "Obrázek",
|
||||
"background_color_caption": "Barva",
|
||||
"upload_background_caption": "Obrázek pro pozadí nahrajete kliknutím",
|
||||
"upload_background": "Nahrát pozadí",
|
||||
"access_caption": "Přístup",
|
||||
"versions_caption": "Verze",
|
||||
"info_caption": "Informace",
|
||||
"mode_private": "Soukromé: Upravovat mohou pouze členové",
|
||||
"mode_public": "Veřejné: Zobrazit si může kdokoli, kdo má odkaz",
|
||||
"invite_collaborators": "Pozvat spolupracovníky",
|
||||
"revoke_access": "Zrušit přístup",
|
||||
"invite": "Odeslat pozvánky",
|
||||
"invitee_email_address": "E-mailová adresa nového člena",
|
||||
"optional_message": "Volitelná zpráva",
|
||||
"role_viewer": "Prohlížející si",
|
||||
"role_editor": "Editor",
|
||||
"role_admin": "Správce",
|
||||
"new_space_title": "Nový název pro prostor",
|
||||
"team": "Tým",
|
||||
"search": "Hledat",
|
||||
"search_no_results": "nic nenalezeno",
|
||||
"search_clear": "vyčistit hledání",
|
||||
"rename": "přejmenovat",
|
||||
"mobile": "mobilní",
|
||||
"image": "obrázek",
|
||||
"tool_filter": "filtrovat",
|
||||
"canel": "kanál",
|
||||
"invite_membership_action": "akce pozvání člena",
|
||||
"viewer": "prohlížející si",
|
||||
"editor": "editor",
|
||||
"admin": "správce",
|
||||
"logging_in": "přihlašování se",
|
||||
"password_confirmation": "Potvrzení hesla",
|
||||
"confirm_again": "Poslali jsme vám e-mail vysvětlující jak potvrdit svou e-mailovou adresu.",
|
||||
"confirmed": "Váš účet byl úspěšně potvrzen. Děkujeme.",
|
||||
"signing_up": "Registrace",
|
||||
"password_check_inbox": "Podívejte se do své schránky",
|
||||
"new_space": "Nový prostor",
|
||||
"tool_more": "Více",
|
||||
"what_is_your_name": "Vítejte v %s! Zvolte si uživatelské jméno.",
|
||||
"lang": "cs",
|
||||
"landing_title": "Vaše tabule na webu.",
|
||||
"landing_claim": "Spacedeck umožňuje snadno kombinovat všechny možné druhy virtuálních tabulí: textové poznámky, fotky, webové odkazy, dokonce video a zvukové nahrávky. ",
|
||||
"landing_example": "Lidé Spacedeck používají pro uspořádávání si svých nápadů, v týmech pro zobrazení přehledu projektů, nebo na školách a univerzitách pro pestřejší, propojené zážitky z učení se.",
|
||||
"spaces": "Mé prostory",
|
||||
"access_editor_link": "Odkaz pro okamžité upravování",
|
||||
"access_editor_link_desc": "Tento odkaz pošlete komukoli, kdo by měl být schopen tento prostor okamžitě upravovat, není zapotřebí žádný účet: ",
|
||||
"access_editor_link_desc_slug": "Tento odkaz obsahuje také název prostoru. ",
|
||||
"access_anonymous_edit_blocking": "Anonymní editoři mohou měnit pouze své vlastní položky",
|
||||
"access_current_members": "Stávající členové",
|
||||
"access_new_members": "Pozvat nové členy",
|
||||
"access_no_members": "Členové tohoto prostoru se zobrazí zde.",
|
||||
"comments": "komentáře",
|
||||
"landing_customers": "Oblíbené u tisíců dalších uživatelů.",
|
||||
"landing_features_title": "Snadno použitelné.",
|
||||
"landing_features_text": "Nový Spacedeck 5 má zjednodušené, hezké uživatelské rozhraní, které usnadňuje a zpříjemňuje práci ještě více, než předtím – a přitom poskytuje ještě výkonnější funkce:",
|
||||
"landing_features_1": "<b>Přetahujte sem</b> obrázky, videa a zvukové soubory ze svého počítače nebo webu",
|
||||
"landing_features_2": "<b>Pište a formátujte text</b>t s úplnou kontrolou nad písmy, barvami a styly",
|
||||
"landing_features_3": "<b>Kreslete, opatřujte poznámkami a zvýrazňujte</b> pomocí poskytovaných grafických tvarů",
|
||||
"landing_features_4": "Udělejte ze své tabule <b>přezentaci s přibližováním</b>",
|
||||
"landing_features_5": "<b>Spolupracujte a chatujte</b> v reálném čase s členy týmu, studenty nebo přáteli.",
|
||||
"landing_features_6": "<b>Sdílejte prostory</b> prostřednictvím webu nebo e-mailu",
|
||||
"landing_features_7": "<b>Exportujte svou práci</b> jako tisknutelné PDF nebo ZIP",
|
||||
"landing_pricing": "Velmi levné.",
|
||||
"landing_pricing_lite": "Zdarma / osobní použití",
|
||||
"landing_pricing_lite_text": "Základní verze pro shromažďování obrázků a uchovávání poznámek.",
|
||||
"landing_pricing_pro_features_list": "<ul><li>Neomezené prostory</li><li>Složky</li><li>Export do PDF a ZIP</li><li>Bez vodoznaků</li><li>Uživatelsky určená pozadí</li><li>Historie aktivit</li><li>20 GB úložiště</li><ul>",
|
||||
"landing_pricing_pro": "4,90 € za uživatele a měsíc. <br><small>nebo 49,90 € za uživatele a rok</small>",
|
||||
"landing_pricing_pro_text": "Nabité všemy schopnostmi, které očekáváte.",
|
||||
"landing_pricing_pro_features": "Nabité všemy schopnostmi, které očekáváte.",
|
||||
"welcome_subject": "Vítejte ve Spacedeck",
|
||||
"welcome_body": "Zdravíme!\nDěkujeme, že jste se zaregistrovali ha Spacedeck.<br>Douváme, že se vám práce v prostorech bude líbit.<br>Pamatujte, že váš účet obsahuje neomezený počet spolupracovníků. Klidně sdílejte své prostory přátelům a kolegům po celém světě.",
|
||||
"invite_emails": "E-mailové adresy (oddělované čárkou)",
|
||||
"history_recently_updated": "Nedávno aktualizováno",
|
||||
"history_recently_empty": "Doposud se nic nestalo.",
|
||||
"parent_folder": "nadřazená složka",
|
||||
"created_by": "Vytvořil(a)",
|
||||
"last_updated": "Naposledy aktualizováno",
|
||||
"feedback_sent": "Děkujeme za zpětnou vazbu!",
|
||||
"role_member": "Člen",
|
||||
"team_invite_membership_action": "Přijmout pozvání",
|
||||
"space_message_subject": "Nová zpráva v prostoru %s",
|
||||
"space_message_body": "%s napsal(a) v %s: \n",
|
||||
"pro_ad_history_headline": "Pokud přejdete na Spacedeck Pro, uvidíte zde historii nedávných aktualizací napříš všemi vašimi (sdílenými) prostory.",
|
||||
"password_reset_subject": "Reset Password for Spacedeck",
|
||||
"password_reset_body": "Vyžádali jste si resetování vašeho hesla do Spacedeck.\nPokud chcete nastavit nové heslo, klikněte na následující odkaz.",
|
||||
"password_reset_action": "Resetovat nyní",
|
||||
"was_offline": "Spojení se Spacedeck bylo přerušeno. Pokud máte neuloženou práci, ponechte tento panel prohlížeče otevřený dokud nebude spojení znovu navázáno, pak znovu proveďte jakoukoli operaci na doposud neuložených objektech.",
|
||||
"subscription_failed_user_subject": "Problém s vaší platbou za Spacedeck",
|
||||
"subscription_failed_user_body": "Je nám líto, nepodařilo se nám zpracovat vaší platební metodu. V nastavení svého účtu můžete snadno vytvořit novou, včetně PayPal.",
|
||||
"subscription_failed_team_subject": "Problém s vaší platbou za Spacedeck",
|
||||
"subscription_failed_team_body": "Je nám líto, ale nepodařilo se zpracovat platební metodu pro váš týmový účet. Prosíme opravte svou platební metodu co možná nejdříve.",
|
||||
"team_name": "Název týmu",
|
||||
"subdomain": "Dílčí doména",
|
||||
"team_adresses": "E-mailová adresa",
|
||||
"add": "Přidat",
|
||||
"invited": "pozván(a)",
|
||||
"duplicate_destination": "Do které složky chcete tento prostor zduplikovat?",
|
||||
"duplicate_confirm": "Zduplikovat %s do %s?",
|
||||
"duplicate_success": "%s bylo zduplikováno do %s.",
|
||||
"goto_space": "Přejít na prostor %s",
|
||||
"goto_folder": "Přejít do složky %s",
|
||||
"stay_here": "Zůstat zde",
|
||||
"sharing": "Sdílení",
|
||||
"list": "Exportovat seznam",
|
||||
"link": "Odkaz",
|
||||
"download_space": "Stáhnout si prostor",
|
||||
"download_as_pdf": "Stáhnout si prostor jako PDF",
|
||||
"type": "Typ",
|
||||
"download": "Stáhnout si",
|
||||
"Previous Zone": "Předchozí oblast",
|
||||
"Next Zone": "Následující oblast",
|
||||
"promote": "Povýšit",
|
||||
"demote": "Degradovat",
|
||||
"more": "Další",
|
||||
"lock": "Zamknout",
|
||||
"unlock": "Odemknout",
|
||||
"follow_present": "Sledovat",
|
||||
"mute_present": "Nesledovat",
|
||||
"follow_present_help": "Pokud tento prostor přezentuje někdo další, ostatní členové automaticky sledují prezentaci. Tímto tlačítkem se toto sledování zapíná a vypíná.",
|
||||
"export": "Export",
|
||||
"media": "Média",
|
||||
"tool_edit_text": "Upravit text",
|
||||
"tool_space_help_part_one": "Pokud chcete přidat obsah, použijte lištu s nástroji.",
|
||||
"tool_space_help_part_two": "Je možné sem přetáhnout také obrázky, zvukové a video soubory.",
|
||||
"tool_delete_space": "Opravdu smazat „%s“?"
|
||||
}
|
||||
@@ -320,6 +320,5 @@
|
||||
"follow_present": "Folgen",
|
||||
"mute_present": "Entfolgen",
|
||||
"follow_present_help": "Wenn jemand den Space präsentiert, folgen die anderen Mitglieder automatisch der Präsentation. Mit diesem Knopf lässt sich das an- oder ausschalten.",
|
||||
"media": "Media",
|
||||
"tool_edit_text": "Text bearbeiten"
|
||||
"media": "Media"
|
||||
}
|
||||
@@ -19,7 +19,6 @@
|
||||
"logout": "Log out",
|
||||
"email": "Email Address",
|
||||
"password": "Password",
|
||||
"forgot_password": "Forgot Password",
|
||||
"width": "Width",
|
||||
"height": "Height",
|
||||
"nick": "Name",
|
||||
@@ -199,7 +198,6 @@
|
||||
"tool_scribble": "Scribble",
|
||||
"tool_line": "Line",
|
||||
"tool_arrow": "Arrow",
|
||||
"tool_pan": "Pan",
|
||||
"search_media_placeholder": "Search web media…",
|
||||
"add_zone": "New Zone",
|
||||
"palette": "Palette",
|
||||
@@ -326,8 +324,5 @@
|
||||
"follow_present_help": "If someone else is presenting this Space, the other members automatically follow the presentation. Switch following on or off with this button.",
|
||||
"export": "Export",
|
||||
"media": "Media",
|
||||
"tool_edit_text": "Edit Text",
|
||||
"tool_space_help_part_one": "Use the toolbar to add content.",
|
||||
"tool_space_help_part_two": "You can also drop images or sound and video files.",
|
||||
"tool_delete_space": "Really delete \"%s\"?"
|
||||
"tool_edit_text": "Edit Text"
|
||||
}
|
||||
@@ -20,7 +20,6 @@
|
||||
"logout": "Se déconnecter",
|
||||
"email": "Adresse email",
|
||||
"password": "Mot de passe",
|
||||
"forgot_password": "Mot de passe oublié",
|
||||
"width": "Largeur",
|
||||
"height": "Hauteur",
|
||||
"nick": "Nom",
|
||||
@@ -40,9 +39,9 @@
|
||||
"space": "Espace",
|
||||
"second": "Seconde",
|
||||
"not_found": "Pas trouvé.",
|
||||
"untitled": "sans titre",
|
||||
"untitled_space": "Espace sans titre",
|
||||
"untitled_folder": "Dossier sans titre",
|
||||
"untitled": "sans titre",
|
||||
"sure": "Êtes-vous sûr?",
|
||||
"specify": "Veuillez préciser:",
|
||||
"confirm": "Veuillez confirmer",
|
||||
@@ -50,7 +49,7 @@
|
||||
"error_unknown_email": "Combinaison inconnue de l'email et mot de passe.",
|
||||
"error_password_confirmation": "Les deux mots de passe ne correspondent pas.",
|
||||
"error_domain_blocked": "Ce domaine a été désactivé.",
|
||||
"error_user_email_already_used": "Cette adresse email est déjà enregistrée.",
|
||||
"error_user_email_already_used": "Cette adresse email est déjà enregistré.",
|
||||
"support": "Aide Spacedeck",
|
||||
"offline": "Désolé , mais les serveurs Spacedeck ne peuvent pas être atteint pour le moment. Plus d' informations ici.",
|
||||
"error": "Désolé, une erreur s'est produite. Veuillez contacter support@spacedeck.com",
|
||||
@@ -58,12 +57,12 @@
|
||||
"claim": "Le tableau blanc partagé pour tout le monde",
|
||||
"trynow": "Essayez-le gratuitement",
|
||||
"about": "de nous",
|
||||
"terms": "Termes",
|
||||
"contact": "Contact",
|
||||
"privacy": "Sphère privée",
|
||||
"terms": "termes",
|
||||
"contact": "contact",
|
||||
"privacy": "sphère privée",
|
||||
"business_adress": "Siège social",
|
||||
"post_adress": "Adresse courrier",
|
||||
"phone": "Téléphone",
|
||||
"phone": "téléphone",
|
||||
"ceo": "Gestionnaire",
|
||||
"name": "name",
|
||||
"confirm_subject": "Confirmation de l'email Spacedeck",
|
||||
@@ -76,10 +75,11 @@
|
||||
"team_invite_membership_acction": "Accept",
|
||||
"team_new_member_subject": "New Team Member",
|
||||
"team_new_member_body": "%s just joined Team %s on Spacedeck.",
|
||||
"invite_emails": "Entrer les adresses email (séparées pas des virgules)",
|
||||
"optional_message": "Message personnel (facultatif)",
|
||||
"space_invite_membership_subject": "Invitation Espace par %s: %s",
|
||||
"space_invite_membership_body": "Vous avez été invité par %s à Espace \"%s\"",
|
||||
"space_invite_membership_action": "Accepter l'invitation",
|
||||
"space_invite_membership_action": "Accepter L'invitation",
|
||||
"folder_invite_membership_subject": "Space",
|
||||
"folder_invite_membership_body": "You have been invited to a Team on Spacedeck. Please click on the following link to accept the invitation.",
|
||||
"folder_invite_membership_acction": "Accept",
|
||||
@@ -99,7 +99,7 @@
|
||||
"edit_team": "Modifier l'équipe",
|
||||
"edit_account": "Modifier le compte",
|
||||
"log_out": "Déconnecter",
|
||||
"no_spaces_yet": "Vous n'avez pas encore créé d'espace.",
|
||||
"no_spaces_yet": "Vous ne avez pas encore créé d'espaces.",
|
||||
"new_folder_title": "Nouveau titre pour le dossier",
|
||||
"folder_settings": "Paramètres du dossier",
|
||||
"upload_cover_image": "Charger image de couverture",
|
||||
@@ -109,10 +109,10 @@
|
||||
"spacedeck_pro_ad_zip": "Avec Spacedeck Pro, vous pouvez exporter le contenu d'un espace comme un paquet ZIP. Voulez-vous en savoir plus sur les fonctionnalités Pro?",
|
||||
"spacedeck_pro_ad_colors": "Avec Spacedeck Pro, vous pouvez mélanger vos propres couleurs en utilisant un sélecteur de couleur professionnelle.",
|
||||
"profile_caption": "Profil",
|
||||
"upload_avatar": "Télécharger l'image de profil",
|
||||
"upload_avatar": "Télécharger l'image profil",
|
||||
"uploading_avatar": "L'image de profil est téléchargée…",
|
||||
"avatar_dimensions": "Format suggéré: 200×200 pixels.",
|
||||
"profile_name": "Nom",
|
||||
"profile_name": "Name",
|
||||
"profile_email": "Email",
|
||||
"send_again": "Renvoyer",
|
||||
"confirmation_sent_long": "Lien de confirmation email envoyé. Se il vous plaît vérifier votre courrier.",
|
||||
@@ -126,7 +126,7 @@
|
||||
"password_caption": "Mot de passe",
|
||||
"current_password": "Ancien mot de passe",
|
||||
"new_password": "Nouveau mot de passe",
|
||||
"verify_password": "Répéter le mot de passe",
|
||||
"verify_password": "Répéter mot de passe",
|
||||
"change_password": "Enregistrer",
|
||||
"reset_password": "Mot de passe oublié?",
|
||||
"terminate_caption": "Supprimer le compte",
|
||||
@@ -208,7 +208,7 @@
|
||||
"picker": "Mélange",
|
||||
"background_image_caption": "Image",
|
||||
"background_color_caption": "Couleur",
|
||||
"upload_background_caption": "Cliquer ici pour télécharger une image de fond.",
|
||||
"upload_background_caption": "Cliquez ici pour télécharger une image de fond.",
|
||||
"upload_background": "Télécharger",
|
||||
"access_caption": "Accès",
|
||||
"versions_caption": "Versions",
|
||||
@@ -222,7 +222,7 @@
|
||||
"role_editor": "Éditeur",
|
||||
"role_admin": "Administrateur",
|
||||
"new_space_title": "Nouveau titre pour l'espace",
|
||||
"invitee_email_address": "Adresse e-mail de l'invité",
|
||||
"invitee_email_address": "Adresse e-mail de invitee",
|
||||
"viewer": "Spectateur",
|
||||
"editor": "Éditeur",
|
||||
"admin": "Administrateur",
|
||||
@@ -237,8 +237,7 @@
|
||||
"logging_in": "Connexion",
|
||||
"password_confirmation": "Confirmation du mot de passe",
|
||||
"confirm_again": "Veuillez consulter votre boîte pour confirmer votre email.",
|
||||
"confirmed": "Adresse email confirmée avec succès. Merci !",
|
||||
"signing_up": "Signing Up",
|
||||
"confirmed": "Adresse email confirmée avec succès. merci!",
|
||||
"password_check_inbox": "password_check_inbox",
|
||||
"what_is_your_name": "Bonjour! Choisir un nom d'utilisateur s'il vous plaît.",
|
||||
"landing_title": "Le tableau blanc partagé pour tout le monde.",
|
||||
@@ -272,16 +271,16 @@
|
||||
"landing_pricing_pro_features": "Avec toute la puissance que vous attendez.",
|
||||
"welcome_subject": "Bienvenue sur Spacedeck",
|
||||
"welcome_body": "Merci pour votre inscription à Spacedeck.\nNous espérons que vous aurez plaisir à travailler dans les Espaces. <br> Rappelez-vous que votre compte comprend un nombre illimité de collaborateurs. <br> N''hésitez pas à partager vos espaces avec des amis et collègues du monde entier.",
|
||||
"invite_emails": "Entrer les adresses email (séparées pas des virgules)",
|
||||
"history_recently_updated": "Nouvelles",
|
||||
"history_recently_empty": "Rien ne se passe",
|
||||
"parent_folder": "Dossier origine",
|
||||
"created_by": "Créé par",
|
||||
"last_updated": "Mis à jour",
|
||||
"history_recently_updated": "Nouvelles",
|
||||
"history_recently_empty": "Rien ne se passe",
|
||||
"signing_up": "Signing Up",
|
||||
"feedback_sent": "Merci pour votre commentaire!",
|
||||
"role_member": "role_member",
|
||||
"space_message_subject": "A posté sur %s",
|
||||
"space_message_body": "%s a commenté dans %s:\n",
|
||||
"role_member": "role_member",
|
||||
"password_reset_subject": "Réinitialiser le Mot de passe pour Spacedeck",
|
||||
"password_reset_body": "Salut!<br><br>Vous avez demandé la réinitialisation de votre Mot de passe.<br>Veuillez cliquer sur le lien suivant pour définir un nouveau Mot de passe.<br>",
|
||||
"password_reset_action": "Définir un nouveau Mot de passe",
|
||||
@@ -302,26 +301,21 @@
|
||||
"goto_space": "Aller à l'espace %s",
|
||||
"goto_folder": "Aller au dossier %s",
|
||||
"stay_here": "Reste ici",
|
||||
"sharing": "Partager",
|
||||
"list": "Exporter la liste",
|
||||
"link": "Link",
|
||||
"download_space": "Télécharger un espace",
|
||||
"download_as_pdf": "Télécharger un espace comme PDF",
|
||||
"download_space": "télécharger un espace",
|
||||
"download_as_pdf": "télécharger un espace comme PDF",
|
||||
"type": "Type",
|
||||
"download": "Télécharger",
|
||||
"Previous Zone": "Zone précédent",
|
||||
"Next Zone": "Zone suivante",
|
||||
"promote": "Promouvoir",
|
||||
"demote": "Rétrograder",
|
||||
"lock": "Bloquer",
|
||||
"unlock": "Déverrouiller",
|
||||
"list": "liste",
|
||||
"promote": "promouvoir",
|
||||
"demote": "rétrograder",
|
||||
"lock": "bloquer",
|
||||
"unlock": "déverrouillage",
|
||||
"link": "link",
|
||||
"download": "download",
|
||||
"more": "plus",
|
||||
"follow_present": "Suivre",
|
||||
"mute_present": "Pas suivre",
|
||||
"follow_present_help": "follow_present_help",
|
||||
"media": "Media",
|
||||
"tool_edit_text": "Modifier le texte",
|
||||
"tool_space_help_part_one": "Utilisez la barre d'outil pour ajouter des éléments.",
|
||||
"tool_space_help_part_two": "Vous pouvez également déposer des fichiers images, son ou video.",
|
||||
"tool_delete_space": "Confirmez-vous la suppression de \"%s\" ?"
|
||||
"media": "Media"
|
||||
}
|
||||
|
||||
328
locales/hu.js
328
locales/hu.js
@@ -1,328 +0,0 @@
|
||||
{
|
||||
"ok": "Rendben",
|
||||
"cancel": "Mégse",
|
||||
"close": "Bezárás",
|
||||
"open": "Megnyitás",
|
||||
"folder": "Mappa",
|
||||
"save": "Mentés",
|
||||
"saved": "Mentve",
|
||||
"created": "létrehozva",
|
||||
"duplicate": "Másolás",
|
||||
"delete": "Törlés",
|
||||
"remove": "Eltávolítás",
|
||||
"set": "készlet",
|
||||
"reset": "alaphelyzet",
|
||||
"thanks": "Köszönöm",
|
||||
"share": "Megosztás",
|
||||
"signup": "Feliratkozás",
|
||||
"login": "Bejelentkezés",
|
||||
"logout": "Kijelentkezés",
|
||||
"email": "E-mail-cím",
|
||||
"password": "Jelszó",
|
||||
"width": "Szélesség",
|
||||
"height": "Magasság",
|
||||
"nick": "Név",
|
||||
"role": "Szerepkör",
|
||||
"members": "Tagok",
|
||||
"actions": "Műveletek",
|
||||
"or": "vagy",
|
||||
"you": "Ön",
|
||||
"via": "ezen keresztül:",
|
||||
"by": "szerző:",
|
||||
"zero": "Nulla",
|
||||
"page": "Oldal:",
|
||||
"new": "Új",
|
||||
"copy": "Másolás",
|
||||
"home": "Kezdőoldal",
|
||||
"owner": "Tulajdonos",
|
||||
"space": "Hely",
|
||||
"second": "másodperc",
|
||||
"not_found": "Nem található.",
|
||||
"untitled_space": "Névtelen hely",
|
||||
"untitled_folder": "Névtelen mappa",
|
||||
"untitled": "névtelen",
|
||||
"sure": "Biztos vagy benne?",
|
||||
"specify": "Kérjük, részletezze",
|
||||
"confirm": "Erősítse meg a műveletet",
|
||||
"error_unknown_email": "Ez az e-mail/jelszó kombináció ismeretlen.",
|
||||
"error_password_confirmation": "A megadott jelszavak nem egyeznek.",
|
||||
"error_domain_blocked": "Tartománya letiltva.",
|
||||
"error_user_email_already_used": "Ez az e-mail cím már használatban van.",
|
||||
"support": "Spacedeck támogatás",
|
||||
"offline": "Kapcsolat nélküli üzemmód. Kattintson további információkért.",
|
||||
"error": "Sajnálom, de valami rosszul ment. Kérjük, lépjen kapcsolatba a support@spacedeck.com-al",
|
||||
"welcome": "Üdvözöljük",
|
||||
"claim": "A digitális rajztáblája.",
|
||||
"trynow": "Próbálja most.",
|
||||
"about": "Rólunk",
|
||||
"terms": "Feltételek",
|
||||
"contact": "Kapcsolat",
|
||||
"privacy": "Adatvédelem",
|
||||
"business_adress": "Üzleti cím",
|
||||
"post_adress": "Posta cím",
|
||||
"phone": "Telefon",
|
||||
"ceo": "Ügyvezető igazgató",
|
||||
"name": "Név",
|
||||
"confirm_subject": "Spacedeck e-mail megerősítés",
|
||||
"confirm_body": "Köszönjük, hogy feliratkozott a Spacedeck-re.\nKérjük, hogy kattintson az alábbi linkre az e-mail cím megerősítéséhez.\n",
|
||||
"confirm_action": "Erősítse meg most",
|
||||
"team_invite_membership_subject": "Csapat meghívó %-s számára",
|
||||
"team_invite_membership_body": "Meghívták a(z) %s oldalra a Spacedeck-en. Kattintson a következő hivatkozásra a meghívás elfogadásához.",
|
||||
"team_invite_user_body": "Meghívták a(z)%s oldalra a Spacedeck-en.\nAz ideiglenes jelszó \"%s\".\n Kérjük, kattintson a következő hivatkozásra a meghívás elfogadásához.",
|
||||
"team_invite_admin_body": "%s meghívást kapott a csapatodba: %s. Az ideiglenes jelszó \"%s\".",
|
||||
"team_invite_membership_acction": "Elfogad",
|
||||
"team_new_member_subject": "A(z) %s új csapattagja feliratkozott",
|
||||
"team_new_member_body": "%s most csatlakozott a(z) %s csoporthoz a Spacedeck-en.",
|
||||
"space_invite_membership_subject": "%s meghívott %s helyre",
|
||||
"space_invite_membership_body": "%s meghívta, hogy csatlakozzon a(z) %s helyre a Spacedecken. Kattintson a következő linkre a meghívás elfogadásához.",
|
||||
"space_invite_membership_action": "Elfogad",
|
||||
"folder_invite_membership_subject": "Hely",
|
||||
"folder_invite_membership_body": "Meghívták a Spacedeck csoportjába. Kérjük, hogy kattintson a következő linkre a meghívás elfogadásához.",
|
||||
"folder_invite_membership_acction": "Elfogad",
|
||||
"login_google": "Bejelentkezés a Google-al",
|
||||
"save_changes": "Változtatások mentése",
|
||||
"upgrade": "Frissítés",
|
||||
"upgrade_now": "Frissítés most",
|
||||
"create_space": "Hely létrehozása",
|
||||
"create_folder": "Mappa létrehozása",
|
||||
"email_unconfirmed": "E-mail nincs megerősítve",
|
||||
"confirmation_sent": "E-mail elküldve",
|
||||
"folder_filter": "Szűrő",
|
||||
"sort_by": "Rendezés",
|
||||
"last_modified": "Utoljára módosítva",
|
||||
"last_opened": "Utoljára nyitva",
|
||||
"title": "Cím",
|
||||
"edit_team": "Csapat szerkesztése",
|
||||
"edit_account": "Fiók szerkesztése",
|
||||
"log_out": "Kijelentkezés",
|
||||
"no_spaces_yet": "Isten hozta! Itt létrehozhat helyeket és mappákat a bal felső sarokban található gombokkal.",
|
||||
"new_folder_title": "Új cím a mappához",
|
||||
"folder_settings": "Mappa beállításai",
|
||||
"upload_cover_image": "Borító kép feltöltése",
|
||||
"spacedeck_pro_ad_folders": "A Spacedeck Pro segítségével korlátlan mennyiségű helyet foglalhat el a mappákban és kezelheti az egyes mappák hozzáférési vezérléseit. Szeretne többet megtudni a Pro funkcióiról?",
|
||||
"spacedeck_pro_ad_versions": "A Spacedeck Pro segítségével korlátlan verziókat menthet az egyes helyekről, hogy nyomon kövesse az előrehaladást vagy biztonságban tartsa a pillanatképeket. Szeretne többet megtudni a Pro funkcióiról?",
|
||||
"spacedeck_pro_ad_pdf": "A Spacedeck Pro segítségével a helyeket éles PDF-fájlokként exportálhatja archiváláshoz, postázáshoz vagy nyomtatáshoz. Szeretne többet megtudni a Pro funkcióiról?",
|
||||
"spacedeck_pro_ad_zip": "A Spacedeck Pro segítségével exportálhatja a hely tartalmát ZIP-csomagként. Szeretne többet megtudni a Pro funkcióiról?",
|
||||
"spacedeck_pro_ad_colors": "A Spacedeck Pro segítségével professzionális színválasztóval keverheti össze saját színeit.",
|
||||
"profile_caption": "Profil",
|
||||
"upload_avatar": "Avatar feltöltése",
|
||||
"uploading_avatar": "Avatar feltöltése…",
|
||||
"avatar_dimensions": "Ajánlott méretek: 200 × 200 képpont.",
|
||||
"profile_name": "Név",
|
||||
"profile_email": "E-mail cím",
|
||||
"send_again": "Küldje újra",
|
||||
"confirmation_sent_long": "E-mail megerősítő hivatkozáds elküldve.Kérjük, ellenőrizze a beérkező leveleket.",
|
||||
"confirmation_sent_another": "Egy másik megerősítő link elküldve.",
|
||||
"confirmation_sent_dialog_text": "E-mailt küldtünk Önnek, amelyben elmagyaráztuk, hogyan erősítse meg e-mail címét.",
|
||||
"payment_caption": "Fizetés",
|
||||
"language_caption": "Nyelv",
|
||||
"notifications_caption": "Értesítések",
|
||||
"notifications_option_chat": "E-mailben értesítsen az új megjegyzésekről",
|
||||
"notifications_option_spaces": "Küldjön napi összefoglalót arról, hogy mi történt a helyeim és mappáim között",
|
||||
"password_caption": "Jelszó",
|
||||
"current_password": "Jelenlegi jelszó",
|
||||
"new_password": "Új jelszó",
|
||||
"verify_password": "Jelszó megerősítése",
|
||||
"change_password": "Jelszó módosítása",
|
||||
"reset_password": "Jelszó visszaállítása",
|
||||
"terminate_caption": "Fiók törlése",
|
||||
"terminate_warning": "Ha törli a fiókját, akkor az összes hely, mappa és üzenet, beleértve az Ön összes tartalmát és a helyeiben létrehozott más embereket megsemmisül.",
|
||||
"terminate_warning2": "Ezt nem lehet visszavonni.",
|
||||
"terminate_reason": "Üzenet",
|
||||
"terminate_reason_caption": "Segítsen nekünk a fejlesztésben, ha megosztja a lemondás okait.",
|
||||
"terminate_terminate": "Leállít",
|
||||
"space_blank1": "Üdvözöljük egy friss, új helyen!",
|
||||
"space_blank2": "Húzza ide a fájlokat, hivatkozások beillesztése",
|
||||
"space_blank3": "vagy használja az alábbi eszközöket",
|
||||
"space_blank4": "hogy ezt a helyet tartalommal töltse meg.",
|
||||
"draft": "Piszkozat",
|
||||
"publish": "Közzététel",
|
||||
"published": "Közzétett",
|
||||
"save_version": "Verzió mentése",
|
||||
"version_saved": "Verzió mentve",
|
||||
"post": "Üzenet küldése",
|
||||
"chat_invite_cta1": "Az együttműködés szórakoztató!",
|
||||
"chat_invite_cta2": "Miért ne",
|
||||
"chat_invite_cta3": "hívjon meg néhány embert",
|
||||
"chat_invite_cta4": "Önnel dolgozni?",
|
||||
"chat_message_placeholder": "Írja meg az üzenetét…",
|
||||
"view": "Nézet",
|
||||
"edit": "Szerkesztés",
|
||||
"present": "Jelen van",
|
||||
"chat": "Csevegés",
|
||||
"meta": "Meta",
|
||||
"tool_search": "Keresés",
|
||||
"tool_upload": "Feltöltés",
|
||||
"tool_text": "Szöveg",
|
||||
"tool_shape": "Forma",
|
||||
"tool_zones": "Zónák",
|
||||
"tool_canvas": "Vászon",
|
||||
"search_media": "Keresés a médiában…",
|
||||
"type_here": "Írja ide",
|
||||
"text_formats": "Formátumok",
|
||||
"format_p": "Bekezdés",
|
||||
"format_bullets": "Listajeles lista",
|
||||
"format_numbers": "Számozott lista",
|
||||
"format_h1": "1. címsor",
|
||||
"format_h2": "2. címsor",
|
||||
"format_h3": "3. címsor",
|
||||
"font_size": "Betűméret",
|
||||
"line_height": "Sormagasság",
|
||||
"tool_align": "Igazítás",
|
||||
"tool_styles": "Stílusok",
|
||||
"tool_bullets": "Felsorolás",
|
||||
"tool_numbers": "Számok",
|
||||
"tool_font": "Betűtípus",
|
||||
"color_fill": "Kitöltés",
|
||||
"color_stroke": "Vonás",
|
||||
"color_text": "Szöveg",
|
||||
"tool_type": "Típus",
|
||||
"tool_box": "Doboz",
|
||||
"tool_link": "Hivatkozás",
|
||||
"tool_layout": "Elrendezés",
|
||||
"tool_options": "Lehetőségek",
|
||||
"tool_stroke": "Vonás ",
|
||||
"tool_delete": "Törlés",
|
||||
"tool_lock": "Lezár",
|
||||
"tool_copy": "Másol",
|
||||
"stack": "Halom",
|
||||
"tool_circle": "Kör",
|
||||
"tool_hexagon": "Hatszög",
|
||||
"tool_square": "Négyzet",
|
||||
"tool_diamond": "Gyémánt",
|
||||
"tool_bubble": "Buborék",
|
||||
"tool_cloud": "Felhő",
|
||||
"tool_burst": "Sorozatfelvétel",
|
||||
"tool_star": "Csillag",
|
||||
"tool_heart": "Szív",
|
||||
"tool_scribble": "Irkál",
|
||||
"tool_line": "Vonal",
|
||||
"tool_arrow": "Nyíl",
|
||||
"search_media_placeholder": "Keresés az internetes médiában…",
|
||||
"add_zone": "Új zóna",
|
||||
"palette": "Paletta",
|
||||
"picker": "Választó",
|
||||
"background_image_caption": "Kép",
|
||||
"background_color_caption": "Szín",
|
||||
"upload_background_caption": "Kattintson egy háttérkép feltöltéséhez",
|
||||
"upload_background": "Háttér feltöltése",
|
||||
"access_caption": "Hozzáférés",
|
||||
"versions_caption": "Verziók",
|
||||
"info_caption": "Információ",
|
||||
"mode_private": "Magán: Csak a tagok tekinthetik meg és szerkeszthetik",
|
||||
"mode_public": "Nyilvános: A hivatkozás birtokában bárki megtekintheti",
|
||||
"invite_collaborators": "Hívjon meg együttműködőket",
|
||||
"revoke_access": "Hozzáférés visszavonása",
|
||||
"invite": "Meghívók küldése",
|
||||
"invitee_email_address": "Az új tag e-mail címe",
|
||||
"optional_message": "Választható üzenet",
|
||||
"role_viewer": "Néző",
|
||||
"role_editor": "Szerkesztő",
|
||||
"role_admin": "Adminisztrátor",
|
||||
"new_space_title": "Új cím a helynek",
|
||||
"team": "Csoport",
|
||||
"search": "Keresés",
|
||||
"search_no_results": "keresés_nincsenek_eredmények",
|
||||
"search_clear": "keresés_törlés",
|
||||
"rename": "Átnevezés",
|
||||
"mobile": "mobil",
|
||||
"image": "kép",
|
||||
"tool_filter": "szűrő",
|
||||
"canel": "mégse",
|
||||
"invite_membership_action": "meghívni_tagságot",
|
||||
"viewer": "néző",
|
||||
"editor": "szerkesztő",
|
||||
"admin": "adminisztrátor ",
|
||||
"logging_in": "bejelentkezés",
|
||||
"password_confirmation": "Jelszó megerősítése",
|
||||
"confirm_again": "E-mailt küldtünk Önnek, amelyben elmagyaráztuk, hogyan erősítse meg e-mail címét.",
|
||||
"confirmed": "Fiókját sikeresen megerősítettük. Köszönjük.",
|
||||
"signing_up": "Feliratkozás",
|
||||
"password_check_inbox": "Kérjük, ellenőrizze a beérkező leveleket",
|
||||
"new_space": "Új hely",
|
||||
"tool_more": "Több",
|
||||
"what_is_your_name": "Üdvözöljük a %s oldalon! Kérjük, hogy válasszon egy felhasználónevet.",
|
||||
"lang": "hu",
|
||||
"landing_title": "Rajztáblája az interneten.",
|
||||
"landing_claim": "A Spacedeck segítségével könnyedén kombinálhat mindenféle típusú médiát a virtuális rajztáblákon: szöveges jegyzeteket, fotókat, internetes linkeket, sőt videókat és hangfelvételeket.",
|
||||
"landing_example": "Az emberek a Spacedeck segítségével szervezik ötleteiket, csoportokban, hogy egy pillantással teljes projekteket láthassanak vagy iskolákban és egyetemeken gazdagabb, összekapcsolt tanulási tapasztalatokkal.",
|
||||
"spaces": "Saját helyek",
|
||||
"access_editor_link": "Azonnali hivatkozás szerkesztése",
|
||||
"access_editor_link_desc": "Adja meg ezt a hivatkozást mindenkinek, akinek képesnek kell lennie a hely azonnali szerkesztésére, nincs szükség fiókra:",
|
||||
"access_editor_link_desc_slug": "Ez a hivatkozás tartalmazza a hely nevét is.",
|
||||
"access_anonymous_edit_blocking": "Névtelen szerkesztők csak a saját tételeiket változtathatják meg",
|
||||
"access_current_members": "Current Members",
|
||||
"access_new_members": "Új tagok meghívása",
|
||||
"access_no_members": "A Hely tagjai itt jelennek meg.",
|
||||
"comments": "hozzászólások",
|
||||
"landing_customers": "Ezrek bíznak benne.",
|
||||
"landing_features_title": "Gyerekjáték használni.",
|
||||
"landing_features_text": "Az új Spacedeck 5 korszerű, gyönyörű felhasználói felülettel rendelkezik, amely minden eddiginél könnyebbé és szórakoztatóbbá teszi munkáját - miközben még erőteljesebb funkciókat kínál:",
|
||||
"landing_features_1": "<b>Fogd és vidd</b> képeket, videókat és hangokat a számítógépről vagy az internetről",
|
||||
"landing_features_2": "<b>Szöveg írása és formázása</b> de a betűtípusok, a színek és a stílus teljes ellenőrzésével",
|
||||
"landing_features_3": "<b>Rajzoljon, kommentáljon és jelöljön ki</b> a mellékelt grafikus alakzatokkal",
|
||||
"landing_features_4": "</b>Kapcsolja tábláját <b>nagyító prezentációvá</b>",
|
||||
"landing_features_5": "<b>Együttműködés és csevegés</b> valós időben csoport társaival, diákjaival vagy barátaival. ",
|
||||
"landing_features_6": "<b>Helyek megosztása</b> az interneten vagy e-mailben",
|
||||
"landing_features_7": "<b>Exportálja munkáját</b> nyomtatható PDF vagy ZIP formátumban",
|
||||
"landing_pricing": "Hihetetlenül megfizethető.",
|
||||
"landing_pricing_lite": "Ingyenes/személyes használat",
|
||||
"landing_pricing_lite_text": "Az alap, átfogó verzió a képek gyűjtésére és a jegyzetek vezetésére.",
|
||||
"landing_pricing_pro_features_list": "<ul><li>Korlátlan helyek</li><li>Mappa struktúrák</li><li>PDF és ZIP exportálás</li><li>Nincs vízjel</li><li>Egyéni hátterek</li><li>Tevékenység előzmények</li><li>20 GB tárhely</li><ul>",
|
||||
"landing_pricing_pro": "€4,90/Felhasználó/hónap. <br><small>or 49,90/Felhasználó /év</small>",
|
||||
"landing_pricing_pro_text": "Turbófeltöltve minden elvárt erővel.",
|
||||
"landing_pricing_pro_features": "Turbófeltöltve minden elvárt erővel.",
|
||||
"welcome_subject": "Üdvözöljük a Spacedeck-en",
|
||||
"welcome_body": "Üdvözlet!\nKöszönjük, hogy feliratkozott a Spacedeck webhelyre.<br>Reméljük, hogy élvezni fogja a Helyek szolgáltatásban való munkát.<br>Ne feledje, hogy fiókjában korlátlan számú munkatárs található. Nyugodtan ossza meg helyeit barátaival és kollégáival a világ minden tájáról.",
|
||||
"invite_emails": "E-mail címek (vesszővel elválasztva)",
|
||||
"history_recently_updated": "Mostanában frissítve",
|
||||
"history_recently_empty": "Még nem történt semmi.",
|
||||
"parent_folder": "szülő_mappa",
|
||||
"created_by": "Készítette",
|
||||
"last_updated": "Utolsó frissítés",
|
||||
"feedback_sent": "Köszönjük a visszajelzését!",
|
||||
"role_member": "Tag",
|
||||
"team_invite_membership_action": "Meghívás elfogadása",
|
||||
"space_message_subject": "Új üzenet a következő helyen % s",
|
||||
"space_message_body": "%s ezt írta %s-ban: \n",
|
||||
"pro_ad_history_headline": "A Spacedeck Pro verzióra való frissítéskor itt láthatja az összes (megosztott) hely legújabb frissítésének előzményeit.",
|
||||
"password_reset_subject": "Spacedeck jelszavának visszaállítása",
|
||||
"password_reset_body": "Ön kérte a Spacedeck jelszavának visszaállítását.\n Kérjük, hogy kattintson a következő hivatkozásra az új jelszó beállításához.",
|
||||
"password_reset_action": "Visszaállítás most",
|
||||
"was_offline": "A Spacedeck-hez való kapcsolat megszakadt. Ha nem mentett munkája van, kérjük, tartsa nyitva ezt a böngészőfület a kapcsolat helyreállításáig, majd érintse meg újra a nem mentett objektumokat.",
|
||||
"subscription_failed_user_subject": "Probléma a Spacedeck fizetésével",
|
||||
"subscription_failed_user_body": "Sajnos nem tudtuk feldolgozni a fizetési módját. A fiók beállításokban könnyedén létrehozhat egy új fizetési módot, beleértve a PayPalt is.",
|
||||
"subscription_failed_team_subject": "Probléma a Spacedeck fizetésével",
|
||||
"subscription_failed_team_body": "Sajnos nem tudtuk feldolgozni a fizetési módját a Team-fiókjához. Kérjük, javítsa ki fizetési módját a lehető leghamarabb.",
|
||||
"team_name": "Csoport név",
|
||||
"subdomain": "altartomány",
|
||||
"team_adresses": "E-mail címek",
|
||||
"add": "Hozzáadás",
|
||||
"invited": "meghívott",
|
||||
"duplicate_destination": "Melyik mappába kívánja másolni ezt a helyet?",
|
||||
"duplicate_confirm": "A(z)% s másolat% s-ra?",
|
||||
"duplicate_success": "% s másolva lett% s-ra.",
|
||||
"goto_space": "Lépjen a(z)% s helyre",
|
||||
"goto_folder": "Lépjen a(z)% s mappába",
|
||||
"stay_here": "Maradjon itt",
|
||||
"sharing": "Megosztás",
|
||||
"list": "Lista exportálása",
|
||||
"link": "Hivatkozás",
|
||||
"download_space": "Hely letöltése ",
|
||||
"download_as_pdf": "Hely letöltése PDF formátumban",
|
||||
"type": "Típus",
|
||||
"download": "Letöltés",
|
||||
"Previous Zone": "Előző zóna",
|
||||
"Next Zone": "Következő zóna",
|
||||
"promote": "Népszerűsít",
|
||||
"demote": "Lefokoz",
|
||||
"more": "Több",
|
||||
"lock": "Lezár",
|
||||
"unlock": "Felold",
|
||||
"follow_present": "Követ",
|
||||
"mute_present": "Követés megszüntetése",
|
||||
"follow_present_help": "Ha valaki más mutatja be ezt a helyet, a többi tag automatikusan követi az előadást. Ezzel a gombbal kapcsolhatja be vagy ki a követést.",
|
||||
"export": "Exportál",
|
||||
"media": "Média",
|
||||
"tool_edit_text": "Szöveg szerkesztése"
|
||||
}
|
||||
@@ -19,7 +19,6 @@
|
||||
"logout": "Se desconnectar",
|
||||
"email": "Adreça electronica",
|
||||
"password": "Senhal",
|
||||
"forgot_password": "Senhal oblidat",
|
||||
"width": "Largor",
|
||||
"height": "Nautor",
|
||||
"nick": "Escais",
|
||||
@@ -174,7 +173,7 @@
|
||||
"tool_bullets": "Bullets",
|
||||
"tool_numbers": "Nombres",
|
||||
"color_fill": "Fill",
|
||||
"tool_font": "Poliça",
|
||||
"tool_font": "Font",
|
||||
"color_stroke": "Traçat",
|
||||
"color_text": "Tèxte",
|
||||
"tool_type": "Tipe",
|
||||
@@ -245,7 +244,7 @@
|
||||
"what_is_your_name": "La benvenguda a %s ! Mercés de causir un escais-nom.",
|
||||
"lang": "en",
|
||||
"landing_title": "Vòstre tablèu blanc sul Web.",
|
||||
"landing_claim": "Spacedeck vos permet de facilament combinar quin tipe que siá de mèdias sus un tablèu virtual : tèxte, nòtas, ligams web, amai vidèos e enregistraments àudio. ",
|
||||
"landing_claim": "Spacedeck vos permet de facilament combinar quin que siá tipe de mèdias sus un tablèu virtual : tèxte, nòtas, ligams web, amai vidèos e enregistraments àudio. ",
|
||||
"landing_example": "Lo monde utiliza Spacedeck per organizar lors idèas, en equipa per veire totes los projèctes en una ulhada, a l’escòla e a l’universitat pels mai rics, experiéncia d’aprendissatge connectat.",
|
||||
"spaces": "Mos espacis",
|
||||
"access_editor_link": "Ligam de modificacion dirècta",
|
||||
@@ -254,7 +253,7 @@
|
||||
"access_anonymous_edit_blocking": "Los convidats pòdon pas modificar los elements qu’an creats.",
|
||||
"access_current_members": "Membres actuals",
|
||||
"access_new_members": "Convidar de novèls membres",
|
||||
"access_no_members": "Los membres d’aqueste Espaci apareisseràn aquí.",
|
||||
"access_no_members": "Los membres d’aqueste Espacii apreissaràn aquí.",
|
||||
"comments": "comentaris",
|
||||
"landing_customers": "La fisança de milièr de personas.",
|
||||
"landing_features_title": "Un jòc d'enfants d’utilizar.",
|
||||
@@ -310,7 +309,7 @@
|
||||
"list": "lista",
|
||||
"link": "Ligam",
|
||||
"download_space": "Telecargar espaci",
|
||||
"download_space_as_pdf": "Telecargar espaci coma PDF",
|
||||
"download_space_as_pdf": "Telecargar espaci PDF",
|
||||
"type": "Tipe",
|
||||
"download": "Telecargar",
|
||||
"Previous Zone": "Zòna precedenta",
|
||||
@@ -322,11 +321,7 @@
|
||||
"unlock": "Desverrolhar",
|
||||
"follow_present": "Seguir",
|
||||
"mute_present": "Quitar de seguir",
|
||||
"follow_present_help": "Se qualqu’un mai presenta aqueste espaci, los demai membres seguiràn automaticament la presentacion. Basculatz l’abonament a la presentacion amb aqueste boton.",
|
||||
"follow_present_help": "follow_present_help",
|
||||
"export": "exportar",
|
||||
"media": "Mèdia",
|
||||
"tool_edit_text": "Editar tèxt",
|
||||
"tool_space_help_part_one": "Utilizar la barra d’aisina per apondre de contengut.",
|
||||
"tool_space_help_part_two": "Podètz tanben lisar d’imatges o de fichièrs sons o vidèos.",
|
||||
"tool_delete_space": "Suprimir « %s » per de bon ?"
|
||||
"media": "Media"
|
||||
}
|
||||
|
||||
@@ -1,59 +1,53 @@
|
||||
"use strict";
|
||||
'use strict';
|
||||
|
||||
const db = require("../models/db");
|
||||
var config = require("config");
|
||||
const db = require('../models/db');
|
||||
var config = require('config');
|
||||
|
||||
module.exports = (req, res, next) => {
|
||||
|
||||
// authentication via API token
|
||||
const api_token = req.headers["x-spacedeck-api-token"];
|
||||
|
||||
if (api_token && api_token.length>7) {
|
||||
db.User.findOne({ where: { api_token: api_token } }).then((user) => {
|
||||
if (user) {
|
||||
db.User.findOne({where: {api_token: api_token}}).then(user => {
|
||||
req.user = user;
|
||||
next();
|
||||
} else {
|
||||
}).error(err => {
|
||||
res.status(403).json({
|
||||
error: "invalid_api-token",
|
||||
"error": "invalid_api-token"
|
||||
});
|
||||
}
|
||||
next();
|
||||
});
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// authentication via session/cookie
|
||||
let token = req.cookies["sdsession"];
|
||||
|
||||
if (!token || token == null) {
|
||||
// authentication via session/header
|
||||
token = req.headers["x-spacedeck-auth"];
|
||||
}
|
||||
const token = req.cookies["sdsession"];
|
||||
|
||||
if (token && token != "null" && token != null) {
|
||||
db.Session.findOne({where: {token: token}})
|
||||
.then((session) => {
|
||||
.then(session => {
|
||||
if (!session) {
|
||||
// session not found
|
||||
next();
|
||||
} else
|
||||
db.User.findOne({ where: { _id: session.user_id } }).then((user) => {
|
||||
}
|
||||
else db.User.findOne({where: {_id: session.user_id}})
|
||||
.then(user => {
|
||||
if (!user) {
|
||||
var domain =
|
||||
process.env.NODE_ENV == "production"
|
||||
? new URL(config.get("endpoint")).hostname
|
||||
: req.headers.hostname;
|
||||
res.clearCookie("sdsession", { domain: domain });
|
||||
var domain = (process.env.NODE_ENV == "production") ? new URL(config.get('endpoint')).hostname : req.headers.hostname;
|
||||
res.clearCookie('sdsession', { domain: domain });
|
||||
|
||||
if (req.accepts("text/html")) {
|
||||
res.send("Please clear your cookies and try again.");
|
||||
} else if (req.accepts("application/json")) {
|
||||
} else if (req.accepts('application/json')) {
|
||||
res.status(403).json({
|
||||
error: "token_not_found",
|
||||
"error": "token_not_found"
|
||||
});
|
||||
} else {
|
||||
res.send("Please clear your cookies and try again.");
|
||||
}
|
||||
|
||||
} else {
|
||||
req["token"] = token;
|
||||
req["user"] = user;
|
||||
@@ -61,11 +55,11 @@ module.exports = (req, res, next) => {
|
||||
}
|
||||
});
|
||||
})
|
||||
.catch((err) => {
|
||||
.error(err => {
|
||||
console.error("Session resolve error",err);
|
||||
next();
|
||||
});
|
||||
} else {
|
||||
next();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@@ -86,7 +86,7 @@ module.exports = (req, res, next) => {
|
||||
// space is private
|
||||
|
||||
// special permission for screenshot/pdf export from backend
|
||||
if (req.query['api_token'] && req.query['api_token'] == config.get('export_api_secret')) {
|
||||
if (req.query['api_token'] && req.query['api_token'] == config.get('phantom_api_secret')) {
|
||||
finalizeReq(space, "viewer");
|
||||
return;
|
||||
}
|
||||
|
||||
26
models/db.js
26
models/db.js
@@ -6,28 +6,24 @@ function sequel_log(a,b,c) {
|
||||
}
|
||||
|
||||
const Sequelize = require('sequelize');
|
||||
const sequelize = new Sequelize(
|
||||
config.get('storage_database'),
|
||||
config.get('storage_username'),
|
||||
config.get('storage_password'),
|
||||
{
|
||||
host: config.get('storage_host'),
|
||||
dialect: config.get('storage_dialect'),
|
||||
const sequelize = new Sequelize('database', 'username', 'password', {
|
||||
host: 'localhost',
|
||||
dialect: 'sqlite',
|
||||
|
||||
pool: {
|
||||
max: 5,
|
||||
min: 0,
|
||||
acquire: 30000,
|
||||
idle: 10000
|
||||
},
|
||||
logging: config.has('db_logs_disabled') ? false : sequel_log,
|
||||
// http://docs.sequelizejs.com/manual/tutorial/querying.html#operators
|
||||
operatorsAliases: false,
|
||||
|
||||
// SQLite only
|
||||
storage: config.get('storage_local_db')
|
||||
}
|
||||
);
|
||||
// https://github.com/sequelize/sequelize/issues/8019#issuecomment-384316346
|
||||
Sequelize.postgres.DECIMAL.parse = function (value) { return parseFloat(value); };
|
||||
storage: config.get('storage_local_db'),
|
||||
logging: sequel_log,
|
||||
|
||||
// http://docs.sequelizejs.com/manual/tutorial/querying.html#operators
|
||||
operatorsAliases: false
|
||||
});
|
||||
|
||||
var User;
|
||||
var Session;
|
||||
|
||||
16622
package-lock.json
generated
16622
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
62
package.json
62
package.json
@@ -3,55 +3,51 @@
|
||||
"version": "1.0.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"start": "node spacedeck.js",
|
||||
"dev": "nodemon spacedeck.js",
|
||||
"styles": "gulp styles"
|
||||
"start": "node spacedeck.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=10.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"archiver": "5.3.1",
|
||||
"async": "3.2.4",
|
||||
"archiver": "1.3.0",
|
||||
"async": "2.3.0",
|
||||
"bcryptjs": "2.4.3",
|
||||
"body-parser": "^1.19.0",
|
||||
"cheerio": "1.0.0-rc.12",
|
||||
"config": "3.3.9",
|
||||
"cheerio": "0.22.0",
|
||||
"config": "1.25.1",
|
||||
"cookie-parser": "~1.4.3",
|
||||
"ejs": "3.1.9",
|
||||
"ejs": "3.1.5",
|
||||
"execSync": "latest",
|
||||
"express": "^4.16.4",
|
||||
"file-type": "^16.5.0",
|
||||
"glob": "10.3.3",
|
||||
"file-type": "^7.6.0",
|
||||
"glob": "7.1.1",
|
||||
"gm": "^1.23.1",
|
||||
"helmet": "^7.0.0",
|
||||
"i18n-2": "0.7.3",
|
||||
"gulp": "^4.0.2",
|
||||
"gulp-concat": "^2.6.1",
|
||||
"gulp-sass": "^4.0.2",
|
||||
"helmet": "^3.5.0",
|
||||
"i18n-2": "0.6.3",
|
||||
"log-timestamp": "latest",
|
||||
"mock-aws-s3": "^4.0.2",
|
||||
"mock-aws-s3": "^2.6.0",
|
||||
"moment": "^2.19.3",
|
||||
"morgan": "^1.9.1",
|
||||
"nodemailer": "^6.6.0",
|
||||
"puppeteer": "^18",
|
||||
"read-chunk": "^3",
|
||||
"node-phantom-simple": "2.2.4",
|
||||
"node-server-screenshot": "^0.2.1",
|
||||
"nodemailer": "^4.6.7",
|
||||
"phantomjs-prebuilt": "^2.1.16",
|
||||
"read-chunk": "^2.1.0",
|
||||
"request": "^2.88.0",
|
||||
"sanitize-html": "^2.3.3",
|
||||
"sequelize": "^6.33.0",
|
||||
"serve-favicon": "~2.5.0",
|
||||
"sanitize-html": "^1.11.1",
|
||||
"sequelize": "^4.37.6",
|
||||
"serve-favicon": "~2.4.2",
|
||||
"serve-static": "^1.13.1",
|
||||
"slug": "^8.2.2",
|
||||
"sqlite3": "5.*",
|
||||
"umzug": "^2",
|
||||
"underscore": "^1.13.1",
|
||||
"uuid": "^9.0.0",
|
||||
"validator": "13.9.0",
|
||||
"ws": "8.13.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"gulp": "^4.0.2",
|
||||
"gulp-clean-css": "^4.3.0",
|
||||
"gulp-concat": "^2.6.1",
|
||||
"gulp-sass": "^5",
|
||||
"nodemon": "^3.0.1"
|
||||
"slug": "^1.1.0",
|
||||
"sqlite3": "^4.0.0",
|
||||
"umzug": "^2.1.0",
|
||||
"underscore": "1.8.3",
|
||||
"uuid": "^3.2.1",
|
||||
"validator": "7.0.0",
|
||||
"ws": "3.3.1"
|
||||
},
|
||||
"main": "app.js",
|
||||
"description": "",
|
||||
|
||||
@@ -8,8 +8,6 @@ var SpacedeckSections = {
|
||||
data: {
|
||||
MAX_COLUMNS: 20,
|
||||
|
||||
isShift: false,
|
||||
|
||||
redo_stack: [],
|
||||
undo_stack: [],
|
||||
|
||||
@@ -64,15 +62,15 @@ var SpacedeckSections = {
|
||||
|
||||
active_style: {
|
||||
border_radius: 0,
|
||||
stroke: 2,
|
||||
stroke: 0,
|
||||
font_family: "Inter",
|
||||
font_size: 36,
|
||||
line_height: 1.5,
|
||||
letter_spacing: 0,
|
||||
|
||||
stroke_color: ENV.options.default_stroke_color ? ENV.options.default_stroke_color : "#000000",
|
||||
fill_color: ENV.options.default_fill_color ? ENV.options.default_fill_color : "#000000",
|
||||
text_color: ENV.options.default_text_color ? ENV.options.default_text_color : "#000000",
|
||||
stroke_color: "#000000",
|
||||
fill_color: "#00000000",
|
||||
text_color: "#000000",
|
||||
background_color: "#ffffff",
|
||||
|
||||
padding: 0,
|
||||
@@ -111,7 +109,7 @@ var SpacedeckSections = {
|
||||
color_picker_hue: 127,
|
||||
color_picker_opacity: 255,
|
||||
|
||||
swatches: ENV.options.swatches ? ENV.options.swatches : [
|
||||
swatches: [
|
||||
{id:1, hex:"#ff00ff"},
|
||||
{id:2, hex:"#ffff00"},
|
||||
{id:3, hex:"#00ffff"},
|
||||
@@ -135,7 +133,18 @@ var SpacedeckSections = {
|
||||
{id:26, hex:"#d55c4b"},
|
||||
{id:27, hex:"#6f4021"},
|
||||
{id:29, hex:"#95a5a6"},
|
||||
{id:30, hex:"rgba(0,0,0,0)"}
|
||||
{id:30, hex:"rgba(0,0,0,0)"},
|
||||
],
|
||||
|
||||
swatches_text: [
|
||||
{id:1, hex:"#9b59b6"},
|
||||
{id:2, hex:"#3498db"},
|
||||
{id:3, hex:"#2ecc71"},
|
||||
{id:4, hex:"#f1c40f"},
|
||||
{id:5, hex:"#e67e22"},
|
||||
{id:6, hex:"#d55c4b"},
|
||||
{id:8, hex:"#ffffff"},
|
||||
{id:10, hex:"#252525"},
|
||||
],
|
||||
|
||||
fonts: [
|
||||
@@ -208,9 +217,7 @@ var SpacedeckSections = {
|
||||
Mousetrap.bind('shift+left', function(evt) { this.if_editable(function() {this.nudge_selected_artifacts(-10,0,evt);}) }.bind(this));
|
||||
Mousetrap.bind('shift+right', function(evt) { this.if_editable(function() {this.nudge_selected_artifacts(10,0,evt);}) }.bind(this));
|
||||
Mousetrap.bind('space', function(evt) { this.activate_pan_tool(evt); }.bind(this));
|
||||
Mousetrap.bind(['shift'], function(evt) { this.isShift = true; }.bind(this), 'keydown');
|
||||
Mousetrap.bind(['shift'], function(evt) { this.isShift = false; }.bind(this), 'keyup');
|
||||
Mousetrap.bind('shift+up', function(evt) { this.if_editable(function() {this.nudge_selected_artifacts(0,-10,evt);}) }.bind(this));
|
||||
|
||||
$(document).bind("beforecopy", this.handle_onbeforecopy.bind(this));
|
||||
$(window).bind("beforeunload", this.handle_onunload.bind(this));
|
||||
$(window).bind("resize", this.handle_window_resize.bind(this));
|
||||
@@ -1360,7 +1367,7 @@ var SpacedeckSections = {
|
||||
},
|
||||
|
||||
reset_stroke: function() {
|
||||
this.active_style.stroke = 2;
|
||||
this.active_style.stroke = 0;
|
||||
this.active_style.border_radius = 0;
|
||||
this.active_style.stroke_style = "solid";
|
||||
},
|
||||
@@ -1718,7 +1725,7 @@ var SpacedeckSections = {
|
||||
h: h,
|
||||
stroke_color: this.active_style.stroke_color,
|
||||
text_color: this.active_style.text_color,
|
||||
stroke: this.active_style.stroke,
|
||||
stroke: 0,
|
||||
fill_color: this.active_style.fill_color,
|
||||
shape: shape_type,
|
||||
valign: "middle",
|
||||
@@ -2296,7 +2303,6 @@ var SpacedeckSections = {
|
||||
for (var i=0; i<parsed.length; i++) {
|
||||
if (parsed[i].mime) {
|
||||
var z = this.highest_z()+1;
|
||||
if(!this.isShift) {
|
||||
if (parsed.length==1) {
|
||||
var w = parsed[i].w;
|
||||
var h = parsed[i].h;
|
||||
@@ -2305,11 +2311,10 @@ var SpacedeckSections = {
|
||||
parsed[i].y = point.y;
|
||||
parsed[i].z = point.z;
|
||||
} else {
|
||||
parsed[i].x = parsed[i].x+100;
|
||||
parsed[i].y = parsed[i].y+100;
|
||||
parsed[i].x = parsed[i].x+50;
|
||||
parsed[i].y = parsed[i].y+50;
|
||||
parsed[i].y = parsed[i].z+z;
|
||||
}
|
||||
}
|
||||
this.clone_artifact(parsed[i], 0,0, function(a) {
|
||||
this.multi_select([a]);
|
||||
}.bind(this));
|
||||
@@ -2562,17 +2567,6 @@ var SpacedeckSections = {
|
||||
this.opened_dialog = "none";
|
||||
},
|
||||
|
||||
start_pan: function(evt) {
|
||||
this.deselect();
|
||||
if (this.active_tool == "pan") {
|
||||
this.active_tool = "pointer";
|
||||
} else {
|
||||
this.active_tool = "pan";
|
||||
}
|
||||
this.opened_dialog = "none";
|
||||
|
||||
},
|
||||
|
||||
start_drawing_scribble: function(evt) {
|
||||
this.deselect();
|
||||
if (this.active_tool == "scribble") {
|
||||
|
||||
@@ -99,7 +99,7 @@ var SpacedeckSpaces = {
|
||||
}.bind(this), {value: dft || "Guest "+parseInt(10000*Math.random()), ok: __("ok"), cancel: __("cancel")});
|
||||
},
|
||||
|
||||
load_space: function(space_id, on_success, on_error) {
|
||||
load_space: function(space_id, on_success, on_error, space_auth) {
|
||||
this.folder_spaces_filter="";
|
||||
this.folder_spaces_search="";
|
||||
|
||||
@@ -308,8 +308,7 @@ var SpacedeckSpaces = {
|
||||
userReady();
|
||||
}
|
||||
|
||||
if (!this.user.nickname && space_auth) {
|
||||
this.guest_nickname = get_query_param("nickname") || this.guest_nickname;
|
||||
if (!this.user && space_auth) {
|
||||
if (this.guest_nickname) {
|
||||
userReady();
|
||||
} else {
|
||||
@@ -487,7 +486,7 @@ var SpacedeckSpaces = {
|
||||
},
|
||||
|
||||
delete_space: function(space) {
|
||||
smoke.confirm(__("tool_delete_space", space.name), function(confirmed) {
|
||||
smoke.confirm("Really delete "+space.name+"?", function(confirmed) {
|
||||
if (!confirmed) return;
|
||||
var idx = this.active_folder.children.indexOf(space);
|
||||
|
||||
@@ -502,7 +501,7 @@ var SpacedeckSpaces = {
|
||||
|
||||
this.active_folder.children.splice(idx,1);
|
||||
}.bind(this));
|
||||
}.bind(this), {ok: __("ok"), cancel: __("cancel")});
|
||||
}.bind(this));
|
||||
},
|
||||
|
||||
duplicate_space: function(space) {
|
||||
@@ -528,7 +527,7 @@ var SpacedeckSpaces = {
|
||||
space.name = title;
|
||||
save_space(space);
|
||||
}
|
||||
}.bind(this), {value: space.name, ok: __("ok"), cancel: __("cancel")});
|
||||
}.bind(this), {value: space.name});
|
||||
},
|
||||
|
||||
rename_folder: function(folder) {
|
||||
@@ -539,7 +538,7 @@ var SpacedeckSpaces = {
|
||||
folder.name = title;
|
||||
save_space(folder);
|
||||
}
|
||||
}.bind(this), {value: folder.name, ok: __("ok"), cancel: __("cancel")});
|
||||
}.bind(this), {value: folder.name});
|
||||
},
|
||||
|
||||
edit_space_title: function() {
|
||||
|
||||
@@ -121,17 +121,11 @@ function boot_spacedeck() {
|
||||
var lang = "en";
|
||||
|
||||
window.refreshLocale = function() {
|
||||
var old_lang = lang;
|
||||
if (spacedeck && spacedeck.user && spacedeck.user.prefs_language) {
|
||||
lang = spacedeck.user.prefs_language || "en";
|
||||
if (spacedeck && spacedeck.user && spacedeck.user.preferences) {
|
||||
lang = spacedeck.user.preferences.language || "en";
|
||||
} else if (window.browser_lang) {
|
||||
lang = window.browser_lang;
|
||||
}
|
||||
if (lang != old_lang) {
|
||||
i18n.init({ lng: lang, resStore: window.locales }, function(err, t) {
|
||||
console.log("i18n initialized: "+lang);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
window.refreshLocale();
|
||||
|
||||
@@ -733,7 +733,7 @@ function setup_whiteboard_directives() {
|
||||
return;
|
||||
}
|
||||
|
||||
if (_.include(["zoom", "scribble", "pan"], $scope.active_tool)) {
|
||||
if (_.include(["zoom", "scribble"], $scope.active_tool)) {
|
||||
// tools that stay active after use
|
||||
this.mouse_state = "idle";
|
||||
$scope.mouse_state = this.mouse_state;
|
||||
|
||||
@@ -23,9 +23,6 @@ function vec2_angle(v) {
|
||||
function render_vector_drawing(a, padding) {
|
||||
var shape = a.shape || "";
|
||||
var path = [];
|
||||
if(typeof a.control_points == 'string'){
|
||||
a.control_points = JSON.parse(a.control_points);
|
||||
}
|
||||
var p = a.control_points[0];
|
||||
|
||||
if (!p) return "";
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -14,7 +14,7 @@ var router = express.Router();
|
||||
const db = require('../../models/db');
|
||||
const Sequelize = require('sequelize');
|
||||
const Op = Sequelize.Op;
|
||||
const { v4: uuidv4 } = require('uuid');
|
||||
const uuidv4 = require('uuid/v4');
|
||||
|
||||
router.get('/:membership_id/accept', function(req, res, next) {
|
||||
if (req.user) {
|
||||
|
||||
@@ -21,7 +21,7 @@ router.post('/', function(req, res) {
|
||||
var password = req.body["password"];
|
||||
|
||||
db.User.findOne({where: {email: email}})
|
||||
.catch(err => {
|
||||
.error(err => {
|
||||
res.sendStatus(404);
|
||||
})
|
||||
.then(user => {
|
||||
@@ -41,7 +41,7 @@ router.post('/', function(req, res) {
|
||||
};
|
||||
|
||||
db.Session.create(session)
|
||||
.catch(err => {
|
||||
.error(err => {
|
||||
console.error("Error creating Session:",err);
|
||||
res.sendStatus(500);
|
||||
})
|
||||
|
||||
@@ -6,7 +6,7 @@ const os = require('os');
|
||||
const db = require('../../models/db');
|
||||
const Sequelize = require('sequelize');
|
||||
const Op = Sequelize.Op;
|
||||
const { v4: uuidv4 } = require('uuid');
|
||||
const uuidv4 = require('uuid/v4');
|
||||
|
||||
var payloadConverter = require('../../helpers/artifact_converter');
|
||||
var redis = require('../../helpers/redis');
|
||||
|
||||
@@ -5,7 +5,7 @@ const db = require('../../models/db');
|
||||
var mailer = require('../../helpers/mailer');
|
||||
var uploader = require('../../helpers/uploader');
|
||||
var space_render = require('../../helpers/space-render');
|
||||
var exporter = require('../../helpers/exporter');
|
||||
var phantom = require('../../helpers/phantom');
|
||||
|
||||
var async = require('async');
|
||||
var moment = require('moment');
|
||||
@@ -51,7 +51,7 @@ router.get('/png', function(req, res, next) {
|
||||
if (!req.space.thumbnail_updated_at || req.space.thumbnail_updated_at < req.space.updated_at || !req.space.thumbnail_url) {
|
||||
db.Space.update({ thumbnail_updated_at: triggered }, {where : {"_id": req.space._id }});
|
||||
|
||||
exporter.takeScreenshot(req.space, "png", function(local_path) {
|
||||
phantom.takeScreenshot(req.space, "png", function(local_path) {
|
||||
var localResizedFilePath = local_path + ".thumb.jpg";
|
||||
gm(local_path).resize(640, 480).quality(70.0).autoOrient().write(localResizedFilePath, function(err) {
|
||||
|
||||
@@ -109,7 +109,7 @@ function make_export_filename(space, extension) {
|
||||
router.get('/pdf', function(req, res, next) {
|
||||
var s3_filename = make_export_filename(req.space, "pdf");
|
||||
|
||||
exporter.takeScreenshot(req.space, "pdf", function(local_path) {
|
||||
phantom.takeScreenshot(req.space, "pdf", function(local_path) {
|
||||
uploader.uploadFile(s3_filename, "application/pdf", local_path, function(err, url) {
|
||||
res.status(201).json({
|
||||
url: url
|
||||
|
||||
@@ -3,7 +3,7 @@ var config = require('config');
|
||||
const db = require('../../models/db');
|
||||
const Sequelize = require('sequelize');
|
||||
const Op = Sequelize.Op;
|
||||
const { v4: uuidv4 } = require('uuid');
|
||||
const uuidv4 = require('uuid/v4');
|
||||
|
||||
var redis = require('../../helpers/redis');
|
||||
var mailer = require('../../helpers/mailer');
|
||||
|
||||
@@ -3,13 +3,13 @@ var config = require('config');
|
||||
const db = require('../../models/db');
|
||||
const Sequelize = require('sequelize');
|
||||
const Op = Sequelize.Op;
|
||||
const { v4: uuidv4 } = require('uuid');
|
||||
const uuidv4 = require('uuid/v4');
|
||||
|
||||
var redis = require('../../helpers/redis');
|
||||
var mailer = require('../../helpers/mailer');
|
||||
var uploader = require('../../helpers/uploader');
|
||||
var space_render = require('../../helpers/space-render');
|
||||
var exporter = require('../../helpers/exporter');
|
||||
var phantom = require('../../helpers/phantom');
|
||||
|
||||
var async = require('async');
|
||||
var fs = require('fs');
|
||||
|
||||
@@ -4,13 +4,13 @@ const os = require('os');
|
||||
const db = require('../../models/db');
|
||||
const Sequelize = require('sequelize');
|
||||
const Op = Sequelize.Op;
|
||||
const { v4: uuidv4 } = require('uuid');
|
||||
const uuidv4 = require('uuid/v4');
|
||||
|
||||
var redis = require('../../helpers/redis');
|
||||
var mailer = require('../../helpers/mailer');
|
||||
var uploader = require('../../helpers/uploader');
|
||||
var space_render = require('../../helpers/space-render');
|
||||
var exporter = require('../../helpers/exporter');
|
||||
var phantom = require('../../helpers/phantom');
|
||||
var payloadConverter = require('../../helpers/artifact_converter');
|
||||
|
||||
var slug = require('slug');
|
||||
@@ -188,6 +188,8 @@ router.post('/', function(req, res, next) {
|
||||
attrs.access_mode = "private";
|
||||
|
||||
db.Space.create(attrs).then(createdSpace => {
|
||||
res.status(201).json(createdSpace);
|
||||
|
||||
// create initial admin membership
|
||||
var membership = {
|
||||
_id: uuidv4(),
|
||||
|
||||
@@ -2,8 +2,7 @@
|
||||
|
||||
var config = require('config');
|
||||
const db = require('../../models/db');
|
||||
const { v4: uuidv4 } = require('uuid');
|
||||
|
||||
const uuidv4 = require('uuid/v4');
|
||||
const os = require('os');
|
||||
|
||||
var mailer = require('../../helpers/mailer');
|
||||
@@ -85,7 +84,7 @@ router.post('/', function(req, res) {
|
||||
};
|
||||
|
||||
db.User.create(u)
|
||||
.catch(err => {
|
||||
.error(err => {
|
||||
res.sendStatus(400);
|
||||
})
|
||||
.then(u => {
|
||||
@@ -96,7 +95,7 @@ router.post('/', function(req, res) {
|
||||
creator_id: u._id
|
||||
};
|
||||
db.Space.create(homeFolder)
|
||||
.catch(err => {
|
||||
.error(err => {
|
||||
res.sendStatus(400);
|
||||
})
|
||||
.then(homeFolder => {
|
||||
@@ -115,7 +114,7 @@ router.post('/', function(req, res) {
|
||||
});
|
||||
res.status(201).json({});
|
||||
})
|
||||
.catch(err => {
|
||||
.error(err => {
|
||||
res.status(400).json(err);
|
||||
});
|
||||
})
|
||||
@@ -290,7 +289,7 @@ router.post('/password_reset_requests/:confirm_token/confirm', function(req, res
|
||||
bcrypt.genSalt(10, (err, salt) => {
|
||||
bcrypt.hash(password, salt, function(err, hash) {
|
||||
user.password_hash = hash;
|
||||
user.password_reset_token = null;
|
||||
user.password_token = null;
|
||||
user.save().then(function(updatedUser) {
|
||||
res.sendStatus(201);
|
||||
});
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
"use strict";
|
||||
|
||||
const puppeteer = require('puppeteer');
|
||||
|
||||
var config = require('config');
|
||||
require('../../models/db');
|
||||
|
||||
var fs = require('fs');
|
||||
var phantom = require('node-phantom-simple');
|
||||
var md5 = require('md5');
|
||||
|
||||
var express = require('express');
|
||||
@@ -19,39 +19,40 @@ function website_to_png(url,on_success,on_error) {
|
||||
console.log("[webgrabber] url: "+url);
|
||||
console.log("[webgrabber] export_path: "+export_path);
|
||||
|
||||
var on_success_called = false;
|
||||
|
||||
var on_exit = function(exit_code) {
|
||||
if (exit_code>0) {
|
||||
console.log("[phantom-webgrabber] abnormal exit for url "+url);
|
||||
if (!on_success_called && on_error) {
|
||||
on_error();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
fs.stat(export_path, function(err, stat) {
|
||||
if (!err) {
|
||||
// file exists
|
||||
console.log("[webgrabber] serving cached snapshot of url: "+url);
|
||||
on_success(export_path);
|
||||
} else {
|
||||
(async () => {
|
||||
let browser;
|
||||
let page;
|
||||
try {
|
||||
browser = await puppeteer.launch(
|
||||
{
|
||||
headless: true,
|
||||
args: ['--disable-dev-shm-usage', '--no-sandbox']
|
||||
}
|
||||
);
|
||||
page = await browser.newPage();
|
||||
phantom.create({ path: require('phantomjs-prebuilt').path }, function (err, browser) {
|
||||
return browser.createPage(function (err, page) {
|
||||
page.set('settings.resourceTimeout',timeout);
|
||||
page.set('settings.javascriptEnabled',false);
|
||||
|
||||
page.setDefaultTimeout(timeout);
|
||||
await page.setJavaScriptEnabled(false);
|
||||
await page.goto(url, {waitUntil: 'networkidle2'});
|
||||
await page.emulateMedia('screen');
|
||||
await page.screenshot({path: export_path, printBackground: true});
|
||||
|
||||
await browser.close();
|
||||
return page.open(url, function(err, status) {
|
||||
console.log("[webgrabber] status: "+status);
|
||||
page.render(export_path, function() {
|
||||
on_success_called = true;
|
||||
on_success(export_path);
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
console.log("[webgrabber] puppeteer abnormal exit for url "+url);
|
||||
on_error();
|
||||
}
|
||||
|
||||
})();
|
||||
browser.exit();
|
||||
});
|
||||
});
|
||||
});
|
||||
}, {
|
||||
onExit: on_exit
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -12,7 +12,7 @@ const _ = require('underscore');
|
||||
const db = require('../models/db');
|
||||
const Sequelize = require('sequelize');
|
||||
const Op = Sequelize.Op;
|
||||
const { v4: uuidv4 } = require('uuid');
|
||||
const uuidv4 = require('uuid/v4');
|
||||
|
||||
router.get('/', (req, res) => {
|
||||
res.render('index', { config:config, user:req.user });
|
||||
@@ -78,22 +78,6 @@ router.get('/oc', (req, res) => {
|
||||
res.redirect("/t/oc");
|
||||
});
|
||||
|
||||
router.get('/es/*', (req, res) => {
|
||||
res.redirect("/t/es");
|
||||
});
|
||||
|
||||
router.get('/es', (req, res) => {
|
||||
res.redirect("/t/es");
|
||||
});
|
||||
|
||||
router.get('/hu/*', (req, res) => {
|
||||
res.redirect("/t/hu");
|
||||
});
|
||||
|
||||
router.get('/hu', (req, res) => {
|
||||
res.redirect("/t/hu");
|
||||
});
|
||||
|
||||
router.get('/en/*', (req, res) => {
|
||||
res.redirect("/t/en");
|
||||
});
|
||||
@@ -103,7 +87,7 @@ router.get('/en', (req, res) => {
|
||||
});
|
||||
|
||||
router.get('/account', (req, res) => {
|
||||
res.render('spacedeck', { config:config });
|
||||
res.render('spacedeck');
|
||||
});
|
||||
|
||||
router.get('/login', (req, res) => {
|
||||
|
||||
@@ -33,7 +33,7 @@ console.log("Booting Spacedeck Open… (environment: " + app.get('env') + ")");
|
||||
app.use(logger(isProduction ? 'combined' : 'dev'));
|
||||
|
||||
i18n.expressBind(app, {
|
||||
locales: ["de", "en", "es", "fr", "hu", "oc"],
|
||||
locales: ["en", "de", "fr", "oc", "es"],
|
||||
defaultLocale: "en",
|
||||
cookieName: "spacedeck_locale",
|
||||
devMode: (app.get('env') == 'development')
|
||||
@@ -61,7 +61,7 @@ app.use(bodyParser.urlencoded({
|
||||
}));
|
||||
|
||||
app.use(cookieParser());
|
||||
//app.use(helmet.frameguard({ action: 'SAMEORIGIN' }));
|
||||
//app.use(helmet.frameguard())
|
||||
//app.use(helmet.xssFilter())
|
||||
/*app.use(helmet.hsts({
|
||||
maxAge: 7776000000,
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
|
||||
.artifact {
|
||||
position: relative;
|
||||
line-height: normal;
|
||||
//-webkit-transform: translate3d(0,0,0); // hw accel
|
||||
|
||||
iframe {
|
||||
@@ -12,9 +11,7 @@
|
||||
max-height: 100%;
|
||||
}
|
||||
|
||||
&.hide-text .text {
|
||||
opacity: 0;
|
||||
}
|
||||
&.hide-text .text { opacity: 0 }
|
||||
|
||||
&.locked.selected {
|
||||
box-shadow: 0px 0px 0px 3px rgba(0,0,0,0.5) !important;
|
||||
@@ -29,9 +26,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
&.artifact-text.text-blank
|
||||
[contentEditable="true"]:not(.text-editing)
|
||||
p:first-child::after {
|
||||
&.artifact-text.text-blank [contentEditable=true]:not(.text-editing) p:first-child::after {
|
||||
content: "Double click to edit";
|
||||
opacity: 0.25;
|
||||
}
|
||||
@@ -84,6 +79,7 @@
|
||||
// padding-right: 20px; margin-right: -20px;
|
||||
|
||||
//> * {pointer-events: auto; }
|
||||
|
||||
}
|
||||
|
||||
&:not(.artifact-text) {
|
||||
@@ -146,9 +142,7 @@
|
||||
li {
|
||||
margin-top: 0;
|
||||
margin-bottom: 0.5em;
|
||||
&:last-child {
|
||||
margin-bottom: 0em !important;
|
||||
}
|
||||
&:last-child {margin-bottom: 0em !important; }
|
||||
}
|
||||
|
||||
h1 {
|
||||
@@ -185,14 +179,10 @@
|
||||
p {
|
||||
margin-top: 0;
|
||||
margin-bottom: 0.5em; // compatibility to old system
|
||||
&:last-child {
|
||||
margin-bottom: 0em !important;
|
||||
}
|
||||
&:last-child {margin-bottom: 0em !important; }
|
||||
}
|
||||
|
||||
a {
|
||||
pointer-events: none;
|
||||
}
|
||||
a {pointer-events: none; }
|
||||
|
||||
ol {
|
||||
padding: 0;
|
||||
@@ -257,7 +247,7 @@
|
||||
}
|
||||
|
||||
.oembed,
|
||||
div[class*="oembed-"] {
|
||||
div[class*='oembed-'] {
|
||||
height: 100%;
|
||||
.play {
|
||||
position: absolute;
|
||||
@@ -300,9 +290,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
.title {
|
||||
font-size: 20px;
|
||||
}
|
||||
.title {font-size: 20px; }
|
||||
.image {
|
||||
height: auto;
|
||||
top: 0;
|
||||
@@ -335,7 +323,6 @@
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background-size: cover;
|
||||
background-color: black;
|
||||
|
||||
&.playing {
|
||||
video {
|
||||
@@ -360,7 +347,6 @@
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
position: absolute;
|
||||
left: 0;
|
||||
}
|
||||
|
||||
.tl-controls {
|
||||
@@ -373,8 +359,10 @@
|
||||
|
||||
.btn {
|
||||
margin-top: 20px;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// FIXME: fix later
|
||||
@@ -439,6 +427,7 @@
|
||||
|
||||
.btn {
|
||||
margin-top: 20px;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -465,41 +454,19 @@
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
&.bold {
|
||||
font-weight: bold;
|
||||
}
|
||||
&.italic {
|
||||
font-style: italic;
|
||||
}
|
||||
&.underline {
|
||||
text-decoration: underline;
|
||||
}
|
||||
&.strike {
|
||||
text-decoration: line-through;
|
||||
}
|
||||
&.bold { font-weight: bold;}
|
||||
&.italic { font-style: italic;}
|
||||
&.underline { text-decoration: underline;}
|
||||
&.strike { text-decoration: line-through;}
|
||||
|
||||
&.align-top .text-cell {
|
||||
vertical-align: top;
|
||||
}
|
||||
&.align-middle .text-cell {
|
||||
vertical-align: middle;
|
||||
}
|
||||
&.align-bottom .text-cell {
|
||||
vertical-align: bottom;
|
||||
}
|
||||
&.align-top .text-cell {vertical-align: top;}
|
||||
&.align-middle .text-cell {vertical-align: middle;}
|
||||
&.align-bottom .text-cell {vertical-align: bottom;}
|
||||
|
||||
&.align-left {
|
||||
text-align: left;
|
||||
}
|
||||
&.align-center {
|
||||
text-align: center;
|
||||
}
|
||||
&.align-right {
|
||||
text-align: right;
|
||||
}
|
||||
&.align-justify {
|
||||
text-align: justify;
|
||||
}
|
||||
&.align-left { text-align: left; }
|
||||
&.align-center { text-align: center; }
|
||||
&.align-right { text-align: right; }
|
||||
&.align-justify { text-align: justify; }
|
||||
|
||||
audio {
|
||||
width: 100%;
|
||||
@@ -516,12 +483,8 @@
|
||||
&.artifact-zone {
|
||||
background-color: rgba(0,0,0,0.05);
|
||||
border-radius: 10px;
|
||||
&:after {
|
||||
display: none;
|
||||
}
|
||||
.shape {
|
||||
display: none;
|
||||
}
|
||||
&:after {display: none; }
|
||||
.shape {display: none; }
|
||||
.zone {
|
||||
height: 100%;
|
||||
}
|
||||
@@ -535,20 +498,21 @@ body.present-mode {
|
||||
}
|
||||
.artifact {
|
||||
cursor: default !important;
|
||||
.text a {
|
||||
pointer-events: auto !important;
|
||||
}
|
||||
.text a { pointer-events: auto !important; }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
body:not(.present-mode) {
|
||||
|
||||
#space {
|
||||
|
||||
.Medium {
|
||||
cursor: text;
|
||||
}
|
||||
|
||||
.artifact {
|
||||
|
||||
&.selected.text-editing,
|
||||
&.text-editing {
|
||||
cursor: text;
|
||||
@@ -576,22 +540,19 @@ body:not(.present-mode) {
|
||||
//background-color: rgba(40,140,215,0.35);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.mouse-scribble,
|
||||
.tool-scribble,
|
||||
.tool-line,
|
||||
.tool-arrow {
|
||||
.mouse-scribble, .tool-scribble, .tool-line, .tool-arrow {
|
||||
cursor: crosshair !important;
|
||||
|
||||
.artifact {
|
||||
pointer-events: none !important;
|
||||
}
|
||||
|
||||
.artifact:after,
|
||||
.artifact:before {
|
||||
.artifact:after, .artifact:before {
|
||||
display: none !important;
|
||||
}
|
||||
}
|
||||
@@ -605,27 +566,21 @@ body:not(.present-mode) {
|
||||
}
|
||||
|
||||
.artifact.state-idle {
|
||||
.progress,
|
||||
.progress-text {
|
||||
.progress, .progress-text {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.artifact.state-processing,
|
||||
.artifact.state-uploading {
|
||||
.artifact.state-processing, .artifact.state-uploading {
|
||||
.progress {
|
||||
height: 100%;
|
||||
padding: 4px;
|
||||
padding: 10px;
|
||||
|
||||
background-color: $blue;
|
||||
opacity: 0.9;
|
||||
text-align: center;
|
||||
font-size: 14px;
|
||||
}
|
||||
.progress-container {
|
||||
background: $white;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
padding-left: 10px;
|
||||
padding-top: 10px;
|
||||
}
|
||||
.progress-text {
|
||||
text-align: center;
|
||||
padding: 8px;
|
||||
@@ -638,38 +593,33 @@ body:not(.present-mode) {
|
||||
color: #888;
|
||||
font-size: 10px;
|
||||
}
|
||||
video,
|
||||
audio,
|
||||
.tl-controls,
|
||||
.timeline {
|
||||
video, audio, .tl-controls, .timeline {
|
||||
display: none;
|
||||
}
|
||||
|
||||
|
||||
background-color: white;
|
||||
}
|
||||
|
||||
.state-processing .spinner {
|
||||
opacity: 1;
|
||||
background-image: url("/images/hourglass.gif");
|
||||
background-image: url('/images/hourglass.gif');
|
||||
}
|
||||
|
||||
.state-uploading .spinner {
|
||||
opacity: 0.8;
|
||||
background-image: url("/images/hourglass.gif");
|
||||
background-image: url('/images/hourglass.gif');
|
||||
}
|
||||
|
||||
.state-idle .spinner {
|
||||
display: none;
|
||||
}
|
||||
|
||||
|
||||
.artifact.image {
|
||||
background-color: transparent;
|
||||
&.state-loading {
|
||||
background-color: rgba(40, 140, 215, 0.05);
|
||||
}
|
||||
&.state-processing {
|
||||
background-color: rgba(107, 195, 111, 0.05);
|
||||
}
|
||||
&.state-loading { background-color: rgba(40,140,215,0.05);}
|
||||
&.state-processing { background-color: rgba(107,195,111,0.05);}
|
||||
}
|
||||
|
||||
.spinner {
|
||||
|
||||
@@ -3,17 +3,12 @@
|
||||
@import "unicode";
|
||||
|
||||
@-webkit-keyframes appear {
|
||||
0% {
|
||||
opacity: 0;
|
||||
}
|
||||
30% {
|
||||
opacity: 0;
|
||||
}
|
||||
100% {
|
||||
opacity: 1;
|
||||
}
|
||||
0% { opacity: 0;}
|
||||
30% { opacity: 0;}
|
||||
100% { opacity: 1; }
|
||||
}
|
||||
|
||||
|
||||
.avatar {
|
||||
background-color: $blue;
|
||||
font-family: $main-font;
|
||||
@@ -31,9 +26,7 @@
|
||||
#user-root {
|
||||
margin-left: 5px !important;
|
||||
padding: 0px !important;
|
||||
.btn {
|
||||
margin-right: 10px;
|
||||
}
|
||||
.btn {margin-right: 10px; }
|
||||
}
|
||||
|
||||
#sidebar.folder-sidebar {
|
||||
@@ -77,9 +70,7 @@
|
||||
li {
|
||||
display: inline-block;
|
||||
line-height: 44px;
|
||||
&.active span {
|
||||
color: $light;
|
||||
}
|
||||
&.active span {color: $light; }
|
||||
span {
|
||||
color: $medium;
|
||||
display: inline-block;
|
||||
@@ -91,6 +82,8 @@
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
#folder {
|
||||
position: absolute;
|
||||
height: 100%;
|
||||
@@ -157,7 +150,7 @@
|
||||
width: 100%;
|
||||
}
|
||||
> .icon {
|
||||
margin-left: -15px;
|
||||
margin-left: -15px
|
||||
}
|
||||
}
|
||||
|
||||
@@ -219,22 +212,15 @@
|
||||
margin: auto;
|
||||
}
|
||||
|
||||
|
||||
#folder-grid .item {
|
||||
float: left;
|
||||
width: 100%;
|
||||
|
||||
@media screen and (min-width: 640px) {
|
||||
width: 50%;
|
||||
}
|
||||
@media screen and (min-width: 800px) {
|
||||
width: 33.333333%;
|
||||
}
|
||||
@media screen and (min-width: 1000px) {
|
||||
width: 25%;
|
||||
}
|
||||
@media screen and (min-width: 1200px) {
|
||||
width: 20%;
|
||||
}
|
||||
@media screen and (min-width: 640px) {width: 50%; }
|
||||
@media screen and (min-width: 800px) {width: 33.333333%; }
|
||||
@media screen and (min-width: 1000px) {width: 25%; }
|
||||
@media screen and (min-width: 1200px) {width: 20%; }
|
||||
}
|
||||
|
||||
.compact-hidden {
|
||||
@@ -279,9 +265,7 @@
|
||||
|
||||
cursor: pointer;
|
||||
|
||||
.folder-drop {
|
||||
display: none;
|
||||
}
|
||||
.folder-drop {display:none; }
|
||||
|
||||
&.appear > a,
|
||||
&.creating > a {
|
||||
@@ -365,13 +349,7 @@
|
||||
background-color: $darker;
|
||||
position: absolute;
|
||||
bottom: 2px;
|
||||
-webkit-mask-image: -webkit-gradient(
|
||||
linear,
|
||||
left top,
|
||||
left bottom,
|
||||
from(rgba(0, 0, 0, 0)),
|
||||
to(rgba(0, 0, 0, 0.1))
|
||||
);
|
||||
-webkit-mask-image: -webkit-gradient(linear, left top, left bottom, from(rgba(0,0,0,0)), to(rgba(0,0,0,0.1)));
|
||||
background-color: black;
|
||||
pointer-events: none;
|
||||
}
|
||||
@@ -416,9 +394,7 @@
|
||||
background-color: white;
|
||||
border-radius: $radius*2;
|
||||
|
||||
&:active {
|
||||
opacity: 0.95 !important;
|
||||
}
|
||||
&:active { opacity: 0.95 !important; }
|
||||
|
||||
box-shadow: 0 0 30px 1px rgba(0, 0, 0, 0.15);
|
||||
border: 1px solid black;
|
||||
@@ -444,7 +420,6 @@
|
||||
overflow: hidden;
|
||||
|
||||
background-color: transparent;
|
||||
background-size: cover;
|
||||
border-top-left-radius: $radius*2;
|
||||
border-top-right-radius: $radius*2;
|
||||
|
||||
|
||||
@@ -2,8 +2,9 @@
|
||||
<div class="footer">
|
||||
<p>
|
||||
<div class="col-xs-6">
|
||||
Spacedeck is Free and Open Source Software. The developers are not affiliated with this website.<br>
|
||||
© 2011–2020 <a href="https://github.com/mntmn/spacedeck-open">Spacedeck Open Developers</a><br>
|
||||
© 2020 <a href="https://mntre.com">MNT Research GmbH</a>, Fehlerstr. 8, 12161 Berlin, Germany<br>
|
||||
© 2011–2020 Spacedeck GmbH (in liquidation)<br>
|
||||
Source Code: <a href="https://github.com/mntmn/spacedeck-open">https://github.com/mntmn/spacedeck-open</a>
|
||||
<br>
|
||||
Font: <a href="https://rsms.me/inter/">Inter by rsms</a>
|
||||
</div>
|
||||
|
||||
@@ -3,12 +3,7 @@
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>Spacedeck Open</title>
|
||||
<meta name="title" content="Spacedeck Open">
|
||||
<meta name="description" content="Whenever you need to lay out pictures, text notes, video and audio clips on a blank canvas, Spacedeck can help you."/>
|
||||
<meta name="keywords" content="spacedeck, collaboration, teams, collages, moodboards, teaching, shared whiteboards, design thinking"/>
|
||||
<meta name="author" content="MNT Research GmbH"/>
|
||||
<meta name="copyright" content="MNT Research GmbH"/>
|
||||
<meta name="robots" content="index,follow"/>
|
||||
<meta name="description" content="">
|
||||
<meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no" />
|
||||
<meta name="apple-mobile-web-app-capable" content="yes">
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
|
||||
@@ -29,5 +24,6 @@
|
||||
<a class="btn btn-md btn-dark btn-round" href="/spaces"><%=__("spaces")%></a>
|
||||
<a class="btn btn-md btn-dark btn-round" href="/logout"><%=__("logout")%></a>
|
||||
<% } %>
|
||||
|
||||
</div>
|
||||
</header>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<a class="btn btn-dark btn-md btn-round btn-icon" href="/spaces">
|
||||
<span class="icon icon-svg icon-sd6"></span>
|
||||
</a>
|
||||
<h5><%=__('edit_account')%></h5>
|
||||
<h5>Edit Account</h5>
|
||||
</div>
|
||||
|
||||
<div class="header-right pull-right">
|
||||
@@ -86,7 +86,7 @@
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<button class="btn btn-md btn-dark" v-on:click="save_user()"><%=__('save')%></button>
|
||||
<button class="btn btn-md btn-dark" v-on:click="save_user()">Save</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -111,9 +111,6 @@
|
||||
<label class="radio" v-bind:class="{checked: user.prefs_language=='es'}" v-on:click="save_user_language('es')">
|
||||
<input type="radio" id="user-preferences_language" name="language" value="es"><span>Español</span>
|
||||
</label>
|
||||
<label class="radio" v-bind:class="{checked: user.prefs_language=='hu'}" v-on:click="save_user_language('hu')">
|
||||
<input type="radio" id="user-preferences_language" name="language" value="hu"><span>Magyar</span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -158,7 +155,7 @@
|
||||
</div>
|
||||
|
||||
<div class="collapse" v-bind:class="{in:account=='terminate'}">
|
||||
<h4><%=__('terminate_caption')%></h4>
|
||||
<h4>Terminate Account</h4>
|
||||
<div class="modal-section labels-inline">
|
||||
<div class="form-group">
|
||||
<label class="label"><%=__("current_password")%></label>
|
||||
@@ -177,7 +174,7 @@
|
||||
</div>
|
||||
|
||||
<div class="modal-footer">
|
||||
<button class="btn btn-stroke-darken btn-md" v-on:click="remove_account(account_remove_password, account_remove_feedback)"><%=__('terminate_caption')%></button>
|
||||
<button class="btn btn-stroke-darken btn-md" v-on:click="remove_account(account_remove_password, account_remove_feedback)">Terminate Account</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
<div class="center alert alert-danger" v-if="login_error">{{login_error}}</div>
|
||||
|
||||
<div style="margin-top:2em">
|
||||
<a href="/password-reset"><%= __("forgot_password") %></a>
|
||||
<a href="/password-reset">Forgot Password</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
@@ -43,8 +43,8 @@
|
||||
<div class="space-empty" v-cloak v-if="active_view == 'space' && !present_mode && active_space_artifacts.length == 0">
|
||||
<div class="table-fake">
|
||||
<div class="cell">
|
||||
<p><%= __('tool_space_help_part_one')%><br>
|
||||
<%= __('tool_space_help_part_two')%></p>
|
||||
<p>Use the toolbar to add content.<br>
|
||||
You can also drop images or sound and video files.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -156,13 +156,8 @@
|
||||
<source v-for="rep in a.view.payload_alternatives" v-bind:src="rep.payload_uri" v-bind:type="rep.mime" />
|
||||
<source v-if="a.view.payload_uri && a.view.mime" v-bind:src="a.view.payload_uri" v-bind:type="a.view.mime" />
|
||||
</video>
|
||||
<div class="progress" v-bind:style="{width: a.description}">
|
||||
<div class="progress-container">
|
||||
<h3>
|
||||
{{a.description}}
|
||||
</h3>
|
||||
</div>
|
||||
</div>
|
||||
<div class="spinner"></div>
|
||||
<div class="progress" v-bind:style="{width: a.view.progress+'%'}">{{a.description}}</div>
|
||||
</div>
|
||||
|
||||
<!-- audio -->
|
||||
|
||||
@@ -18,11 +18,6 @@
|
||||
|
||||
<button class="btn btn-divider"></button>
|
||||
|
||||
<button class="btn btn-icon-labeled btn-transparent" v-on:click="start_pan()" v-bind:class="{active:active_tool=='pan'}" title="<%=__("tool_pan")%>">
|
||||
<span class="icon icon-move"></span>
|
||||
<span class="icon-label"><%=__("tool_pan")%></span>
|
||||
</button>
|
||||
|
||||
<div class="dropdown top left light" v-bind:class="{open:opened_dialog=='shapes'}">
|
||||
<div class="btn-collapse in" title="<%=__("tool_shape")%>">
|
||||
<button class="btn btn-transparent btn-icon-labeled" v-bind:class="{open:opened_dialog=='shapes'}" v-on:click="open_dialog('shapes')">
|
||||
@@ -46,11 +41,6 @@
|
||||
<span class="icon-label"><%=__("tool_arrow")%></span>
|
||||
</button>
|
||||
|
||||
<button class="btn btn-icon-labeled btn-transparent" v-on:click="start_drawing_line()" v-bind:class="{active:active_tool=='line'}" title="<%=__("tool_line")%>">
|
||||
<span class="icon icon-tool-line"></span>
|
||||
<span class="icon-label"><%=__("tool_line")%></span>
|
||||
</button>
|
||||
|
||||
<div class="dropdown bottom light center">
|
||||
<div class="btn-collapse in">
|
||||
<input type="file" multiple v-on:change="handle_image_file_upload($event)" id="image_file_upload" class="btn btn-transparent btn-icon-labeled" style="position: absolute; z-index: 1; opacity: 0;">
|
||||
|
||||
@@ -17,8 +17,7 @@
|
||||
webHost: location.host,
|
||||
webEndpoint: location.origin,
|
||||
apiEndpoint: location.origin,
|
||||
websocketsEndpoint: location.origin.replace("https:","wss:").replace("http:","ws:"),
|
||||
options: <%- config && config.spacedeck ? JSON.stringify(config.spacedeck) : "{}" %>
|
||||
websocketsEndpoint: location.origin.replace("https:","wss:").replace("http:","ws:")
|
||||
};
|
||||
</script>
|
||||
|
||||
@@ -74,17 +73,15 @@
|
||||
|
||||
<script type="text/javascript">
|
||||
window.locales = {};
|
||||
window.locales.de = {};
|
||||
window.locales.en = {};
|
||||
window.locales.es = {};
|
||||
window.locales.de = {};
|
||||
window.locales.fr = {};
|
||||
window.locales.hu = {};
|
||||
window.locales.oc = {};
|
||||
window.locales.de.translation = <%- include("./../locales/de.js") %>;
|
||||
window.locales.es = {};
|
||||
window.locales.en.translation = <%- include("./../locales/en.js") %>;
|
||||
window.locales.es.translation = <%- include("./../locales/es.js") %>;
|
||||
window.locales.de.translation = <%- include("./../locales/de.js") %>;
|
||||
window.locales.fr.translation = <%- include("./../locales/fr.js") %>;
|
||||
window.locales.hu.translation = <%- include("./../locales/hu.js") %>;
|
||||
window.locales.oc.translation = <%- include("./../locales/oc.js") %>;
|
||||
window.locales.es.translation = <%- include("./../locales/es.js") %>;
|
||||
</script>
|
||||
</html>
|
||||
|
||||
Reference in New Issue
Block a user